处理R中的数据帧列表

时间:2015-03-13 20:31:23

标签: r dataframe

我正在尝试并行运行模拟。

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列和不同的列名

我不确定是否有办法通过遍历列表来计算平均值,或者我是否需要先创建数据帧或数据表,然后计算平均值。

感谢您的任何建议!

1 个答案:

答案 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]