有没有一种特定的方法来组合 R 中的 data.tables 列表?
我有一个大约 20 个 data.table 的列表,每个都有大约 100 万行,并且想将它们组合成一个具有 2000 万行的 data.table。
我一直在做
Reduce('rbind', data.table)
但这需要一段时间。
天呐!
有没有一种特定的方法来组合 R 中的 data.tables 列表?
我有一个大约 20 个 data.table 的列表,每个都有大约 100 万行,并且想将它们组合成一个具有 2000 万行的 data.table。
我一直在做
Reduce('rbind', data.table)
但这需要一段时间。
天呐!
查看?rbindlist
和这些相关问题(当您知道要搜索什么时更容易找到!):
使用do.call
这个组成的示例,使用速度似乎快了大约 10 倍:
library(data.table)
x1 <- data.table(x = runif(1e6), y = runif(1e6))
x2 <- data.table(x = runif(1e6), y = runif(1e6))
#20 data.tables all of length 1e6
yourList <- list(x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2,x1,x2)
system.time(out1 <- Reduce("rbind", yourList))
#-----
user system elapsed
3.37 3.03 6.43
system.time(out2 <- do.call("rbind", yourList))
#-----
user system elapsed
0.33 0.36 0.68
all.equal(out1,out2)
#-----
[1] TRUE
我没有意识到data.table
这个任务有一个特定的功能。课程标准杆,速度相当快。以下是相关时间:
system.time(out3 <- rbindlist(yourList))
#-----
user system elapsed
0.07 0.03 0.11
all.equal(out1,out3)
#-----
[1] TRUE
为了我的钱, plyr 包ldply
是做到这一点的方式。我的优点是列表元素的名称被添加为新的第一列,名为.id
.
此外,数据帧列表通常是 的输出tapply
,在这种情况下,将整个 shebang 替换为ddply
。
替代品包括do.call("rbind", mylist)
or lattice's make.groups
(虽然最近没能找到这个)。
注意:我可能误解了这个问题——我读data.frame
的是data.table
. 这些技术仍然有效,但我不确定它们是否data.table
始终有效。