【问题标题】:Processing a list of dataframes in R在 R 中处理数据帧列表
【发布时间】:2015-05-16 11:29:32
【问题描述】:

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

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

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

感谢您的任何建议!

【问题讨论】:

  • 使用rbindlist drom data.table 包

标签: r dataframe


【解决方案1】:

如果 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]

【讨论】:

  • @user515663 这能回答你的问题吗?如果接受,请接受,如果不接受,我该如何改进?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-27
  • 2015-07-01
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
相关资源
最近更新 更多