我正在尝试并行运行模拟。
iterations = 50000
sim = foreach(i=1:iterations) %dopar% sim(dataframe, ... )
列表sim中的每个项目都是一个包含40列和100行的数据框。每个数据框都有一个ID列。我想确定ID超过50,000次模拟的平均分数。
我尝试了以下操作,但它很慢,我认为因为它必须不断重新生成数据帧:
results = do.call(rbind.data.frame, sim)
avg.scores = ddply(sim,~Player,summarise,mean=mean(score))
我还尝试在列表中设置属性以将其转换为适当的数据框(Most efficient list to data.frame method?),但结果却超过了25列和不同的列名
我不确定是否有办法通过遍历列表来计算平均值,或者我是否需要先创建数据帧或数据表,然后计算平均值。
感谢您的任何建议!
答案 0 :(得分:0)
如果ID分散在列表中的整个数据框中,则是,您必须有一个额外的步骤将所有类似的ID拉入相应的表中,或者只是组合并分组。
使用data.table
和.combine
可以加快速度:
(注意:将输出调用为函数也是不好的做法)
library(doParallel)
library(plyr)
library(data.table)
iter <- 5E4
simulations <- foreach(i = 1:iter, .combine = rbind) %dopar% {
data.table(ID = sample(LETTERS, 100, replace = TRUE), matrix(runif(390), ncol = 39))
}
然后,您可以使用.SD
:
means.by.ID.and.column <- simulations[, lapply(.SD, mean), by = ID, .SDcols = 2:40]