合并data.tables列表

时间:2012-09-03 17:11:01

标签: r data.table

是否有一种特定的方法可以在R?

中组合data.tables列表

我有一个~20个data.tables的列表,每个都有大约100万行,并希望将它们组合成一个包含2000万行的data.table。

我一直在用

做这件事
Reduce('rbind', data.table)

但需要一段时间。

TNX!

3 个答案:

答案 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以及这些相关问题(当您知道要搜索的内容时更容易找到!):

data.table questions and answers containing rbindlist

答案 2 :(得分:2)

对于我的钱,plyr包的ldply就是这样做的。我的优势是列表元素的名称被添加为名为.id的新的第一列。

此外,数据框列表通常是tapply的输出,在这种情况下,用ddply替换整个shebang。

备选方案包括do.call("rbind", mylist)或格子make.groups(尽管最近未能找到这个)。


注意:我可能误解了这个问题 - 我读了data.frame而不是data.table。这些技术仍然有效,但我不确定它们会一直导致data.table