【发布时间】:2018-04-27 22:28:27
【问题描述】:
我有一个关于如何优化以下代码的基本问题。这是我的代码的一个非常非常简略的版本。基本上,我有一个很大的 data.table(> 50M 行),我想经常对数据进行子集化(比如 10000 次)并在子集上运行一些函数(显然比下面示例中显示的更复杂,即我需要子集的所有列,并且该函数返回一个新的 data.table)。我只是选择了使示例简单的平均值。
dt <- data.table(a=sample(letters, 1000000,replace=T),b=sample(1:100000))
mm <- list()
foo <- function(x) mean(x$b)
for(i in 1:1000)
{
mm[[i]] <- foo(dt[a %in% sample(letters,5)])
}
很明显,即使是这个最小的例子(设置键等),这也不是最快的编程方式。
不过,我对如何优化 for 循环很感兴趣。我想为子集创建索引,然后使用 data.table dt[,foo(.SD),by=subset_ID] ,但我不确定如何执行此操作,因为我正在使用替换进行采样(多个组 ID)。任何基于 data.table 的想法都将不胜感激(例如如何删除循环?)。
【问题讨论】:
-
如果您的 foo 实际上只需要一列,则在将其传递给 foo 之前从
dt中选择该列会更快一些 (~15-20%)。 -
顺便说一句,如果您想编辑问题以制作一个更好地说明的示例,我可以添加一个“赏金”(stackoverflow.com/help/bounty),也许会吸引更多/更好的答案。
标签: r loops data.table