我正在用tidyverse
包做一个数据清理的学校项目,现在我从purrr::map()
得到了一个列表输出,如下所示:
(mylist <- list(A = as.Date(sample(1e3:1e4, 4), origin = "1960-01-01"),
B = as.Date(sample(1e3:1e4, 2), origin = "1960-01-01"),
C = as.Date(sample(1e3:1e4, 3), origin = "1960-01-01")))
$A
[1] "1970-06-12" "1984-05-28" "1967-06-28" "1982-12-14"
$B
[1] "1966-02-04" "1967-02-21"
$C
[1] "1977-07-19" "1968-03-11" "1964-02-13"
我想把它们堆成:
df <- data.frame(Value = reduce(mylist, c))
df$Class <- rep(names(mylist), sapply(mylist, length))
df
Value Class
1 1970-06-12 A
2 1984-05-28 A
3 1967-06-28 A
4 1982-12-14 A
5 1966-02-04 B
6 1967-02-21 B
7 1977-07-19 C
8 1968-03-11 C
9 1964-02-13 C
***注1:**每个单元格的长度不同,列表中的值实际为Date
类。
*注2:stack(mylist)
在日期列表中不起作用。
有什么方法可以用tidyverse
或其他包中的函数高效地实现它吗?
3条答案
按热度按时间a5g8bdjr1#
我们可以使用
stack
更新
对于更新的问题,可以使用
reshape2
中的melt
或data.table
或者使用
tidyverse
基准测试
以下是使用所公布的四种解决方案的一些基准测试
两个软件包中的
melt
函数在性能上只有细微的差别kg7wmglp2#
我们可以使用非常高效的
data.table
包,此外,
data.table::melt()
也可以完成这项工作(类似于@akrun的reshape2
解决方案),即q8l4jmvw3#
我们已经得到了
data.table
和tidyverse
解决方案(它们非常高效),但为了完整起见,这里使用的是基本R方法Reduce
也可以替换为do.call