简体   繁体   中英

Working with a list of lists of dataframes with different dimensions

I am working with a list of lists of dataframes, like so:

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)))
}

The reason the data looks this way is its essentially how my actual data is generated from running simulations via clusterApply using the new parallel package in R 2.14.0, where each simulation returns a list of some summary results (runResult) and the raw data (runData)

I would like to combine the first dataframe of the second level lists together (they are the same structure), and likewise the second dataframe of the second level lists. This question seemed to be the answer, however all the dataframes have the same structure.

The best method I've found so far is using unlist to make it a list of dataframes, where odd indices and even indices represent dataframes that need to be combined:

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)])

I'm certain there's a better way to do this, I just don't see it yet. Can anyone supply one?

Shamelessly stealing a construct from Ben Bolker's excellent answer to 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
     ........
     ........
     ........

One option is to extract the give data frame from each piece of the list, then rbind them together:

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

This example gives 2 data frames, but you can recombine them into a single list if you want.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM