[R] extracting row means from a list

Sundar Dorai-Raj sundar.dorai-raj at pdf.com
Tue Jul 19 17:35:11 CEST 2005



Andy Bunn wrote:
> Hello: I'm reading in a series of text files (100 files that are each 2000
> rows by 6 columns). I wish to combine the columns (6) of each file (100) and
> get the row mean. I'd like to end up with a data.frame of 2000 rows by 6
> columns.
> 
> foo <- list()
> for(i in 1:10){
>      # The real data are read in from a series of numbered text files
>      foo[[i]] <- data.frame(x1 = rnorm(100), x2 = rnorm(100), x3 =
> rnorm(100),
>                             x4 = rnorm(100), x5 = rnorm(100), x6 =
> rnorm(100))
> 
> }
> 
> str(foo)
> # by hand
> mean.x1 <-
> rowMeans(cbind(foo[[1]][,1],foo[[2]][,1],foo[[3]][,1],foo[[4]][,1],foo[[5]][
> ,1]),
>                           foo[[6]][,1],foo[[7]][,1],foo[[8]][,1],foo[[9]][,1
> ],foo[[10]][,1]))
> mean.x2 <-
> rowMeans(cbind(foo[[1]][,2],foo[[2]][,2],foo[[3]][,2],foo[[4]][,2],foo[[5]][
> ,2]),
>                           foo[[6]][,2],foo[[7]][,2],foo[[8]][,2],foo[[9]][,2
> ],foo[[10]][,2]))
> # and so on to column 6
> mean.x6 <-
> rowMeans(cbind(foo[[1]][,6],foo[[2]][,6],foo[[3]][,6],foo[[4]][,6],foo[[5]][
> ,6]),
>                           foo[[6]][,6],foo[[7]][,6],foo[[8]][,6],foo[[9]][,6
> ],foo[[10]][,6]))
> 
> 
> I've implemented this with nested loops that create temporary variables and
> calc the mean, but the approach is clunky. E.g.,
> 
> # nested loops
> for(i in 1:ncol(foo[[1]])){
>   for(j in 1:length(foo)){
>     # etc ...
>   }
> }
> 
> Is there a way to build a better mouse trap?
> 
> TIA, Andy


I don't know of a way of getting around at least one for loop, but the 
following might be want you need:

r <- matrix(, NROW(foo[[1]]), length(foo))
for(i in 1:NCOL(foo[[1]]))
   r[, i] <- rowMeans(do.call("cbind", lapply(foo, "[", i)))
dim(r)

This assumes each element of foo has identical dimensions. Otherwise 
you'll get an error.

HTH,

--sundar




More information about the R-help mailing list