【发布时间】:2012-08-28 10:11:40
【问题描述】:
有没有一种特定的方法可以在 R 中组合 data.tables 列表?
我有一个大约 20 个 data.table 的列表,每个都有大约 100 万行,我想将它们组合成一个有 2000 万行的 data.table。
我一直在这样做
Reduce('rbind', data.table)
但这需要一段时间。
Tnx!
【问题讨论】:
标签: r data.table
有没有一种特定的方法可以在 R 中组合 data.tables 列表?
我有一个大约 20 个 data.table 的列表,每个都有大约 100 万行,我想将它们组合成一个有 2000 万行的 data.table。
我一直在这样做
Reduce('rbind', data.table)
但这需要一段时间。
Tnx!
【问题讨论】:
标签: r 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) 或lattice 的make.groups(虽然最近没能找到这个)。
注意:我可能误解了这个问题——我读的是data.frame 而不是data.table。这些技术仍然有效,但我不确定它们是否始终会产生data.table。
【讨论】:
setkey。通常这是一次完成,就像在数据库中一样,但仍然相关。无键聚合非常快,因此通常不需要为此设置键。