25

有没有一种特定的方法来组合 R 中的 data.tables 列表?

我有一个大约 20 个 data.table 的列表,每个都有大约 100 万行,并且想将它们组合成一个具有 2000 万行的 data.table。

我一直在做

Reduce('rbind', data.table)

但这需要一段时间。

天呐!

4

3 回答 3

26

查看?rbindlist和这些相关问题(当您知道要搜索什么时更容易找到!):

data.table 问题和答案包含rbindlist

于 2012-09-03T17:34:42.457 回答
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
于 2012-09-03T17:21:05.030 回答
2

为了我的钱, plyr 包ldply是做到这一点的方式。我的优点是列表元素的名称被添加为新的第一列,名为.id.

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

替代品包括do.call("rbind", mylist)or lattice's make.groups(虽然最近没能找到这个)。


注意:我可能误解了这个问题——我读data.frame的是data.table. 这些技术仍然有效,但我不确定它们是否data.table始终有效。

于 2012-09-05T03:43:17.970 回答