是否有一种特定的方法可以在R?
中组合data.tables列表我有一个~20个data.tables的列表,每个都有大约100万行,并希望将它们组合成一个包含2000万行的data.table。
我一直在用
做这件事Reduce('rbind', data.table)
但需要一段时间。
TNX!
答案 0 :(得分:22)
使用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
答案 1 :(得分:22)
请参阅?rbindlist
以及这些相关问题(当您知道要搜索的内容时更容易找到!):
答案 2 :(得分:2)
对于我的钱,plyr包的ldply
就是这样做的。我的优势是列表元素的名称被添加为名为.id
的新的第一列。
此外,数据框列表通常是tapply
的输出,在这种情况下,用ddply
替换整个shebang。
备选方案包括do.call("rbind", mylist)
或格子make.groups
(尽管最近未能找到这个)。
注意:我可能误解了这个问题 - 我读了data.frame
而不是data.table
。这些技术仍然有效,但我不确定它们会一直导致data.table
。