加速复杂的data.table操作(子集,总和,组)

时间:2015-12-01 07:58:59

标签: r sum data.table grouping subset

我有一个大的data.table,我需要在我的代码中的几次出现中以相同的方式对其进行子集化,求和。因此,我存储结果以节省时间。操作仍然需要很长时间,我想知道如何加快它。

inco <- inventory[period > p, sum(incoming), by = articleID][,V1]

广告资源的关键是期间和文章ID。大小取决于参数,但始终大于3 GB。它有大约62,670,000行的7个变量。

到目前为止,我评论了我的想法:

1。子集:期间&gt; P

这个可以在矢量扫描时更快,但我需要为此生成从p到max(p)的序列,需要额外的时间。另外,data.table已经按p排序。所以我想,速度的提升并不高。

2。 Aggregate:sum(incoming)

不知道如何改善这一点。

第3。分组:by = articleID

使用表的另一个键设置,此分组可能会更快,但这会对我的其他代码产生不良影响。

4。访问:[,V1] 这可以忽略并在以后的操作中完成,但我怀疑速度增加。

您是否有详细分析或改进此操作的想法?

最低可重复性示例

(减少n以使其在您的计算机上运行,​​如有必要):

library(data.table)
p <- 100
n <- 10000
inventory <- CJ(period=seq(1,n,1), weight=c(0.1,1), volume=c(1,10), price=c(1,1000), E_demand=c(1000), VK=seq(from=0.2, to=0.8, by=0.2), s=c(seq(1,99,1), seq(from=100, to=1000, by=20)))
inventory[, articleID:=paste0("W",weight,"V",volume,"P",price,"E", round(E_demand,2), "VK", round(VK,3), "s",s)]
inventory[, incoming:=rgamma( rate=1,shape=0.3, dim(inventory)[1])]
setkey(inventory, period, articleID)
inco <- inventory[period > p, sum(incoming), by = articleID][,V1]

0 个答案:

没有答案