使用具有不同维度的数据框列表

时间:2011-12-07 17:50:58

标签: list r dataframe

我正在处理数据框列表,如下所示:

results <- list()
for( i in 1:4 ) {
  runData <- data.frame(id=i, t=1:10, value=runif(10))
  runResult <- data.frame( id=i, avgValue=mean(runData$value))  
  results <- c(results,list(list(runResult,runData)))
}

数据看起来是这样的,其实质上是我的实际数据是如何通过使用R 2.14.0中的新并行包通过clusterApply运行模拟生成的,其中每个模拟返回一些汇总结果的列表(runResult) )和原始数据(runData)

我想将第二级列表的第一个数据帧组合在一起(它们是相同的结构),同样也是第二级列表的第二个数据帧。这question似乎是答案,但所有数据框都具有相同的结构。

到目前为止,我发现的最好方法是使用unlist将其作为数据帧列表,其中奇数索引和偶数索引表示需要组合的数据帧:

results <- unlist(results,recursive=FALSE)
allRunResults <- do.call("rbind", results[seq(1,length(results),2)])
allRunData <- do.call("rbind", results[seq(2,length(results),2)])

我确信有更好的方法可以做到这一点,我还没有看到它。任何人都可以提供一个吗?

2 个答案:

答案 0 :(得分:5)

从Ben Bolker对this question的出色回答中无耻地窃取构造......

Reduce(function(x,y) mapply("rbind", x,y), results)

[[1]]
  id  avgValue
1  1 0.3443166
2  2 0.6056410
3  3 0.6765076
4  4 0.4942554

[[2]]
   id  t      value
1   1  1 0.11891086
2   1  2 0.17757710
3   1  3 0.25789284    
4   1  4 0.26766182
5   1  5 0.83790204
6   1  6 0.99916116
7   1  7 0.40794841
8   1  8 0.19490817
9   1  9 0.16238479
10  1 10 0.01881849
11  2  1 0.62178443
12  2  2 0.49214165
     ........
     ........
     ........

答案 1 :(得分:0)

一个选项是从列表的每个部分中提取给定数据框,然后rbind将它们组合在一起:

runData <- do.call(rbind, lapply(results, '[[', 2))
runResult <- do.call(rbind, lapply(results, '[[', 1))

此示例提供了2个数据框,但如果需要,您可以将它们重新组合到一个列表中。