我有一个大的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]