Hi Marc,

thanks, that works great! With yet another apply(), I can also make it accept psych::winsor() and trimming:

some.sort.of.apply <- function ( foo, FUN, ... ) {
  matrix(apply(sapply(foo, c),1,FUN,...), dim(foo[[1]]))
}
some.sort.of.apply ( foo, FUN=winsor,trim=0.3 )

Thank you all for your help!
Stephan


Marc Schwartz schrieb:
on 12/30/2008 08:33 AM Stephan Kolassa wrote:
Dear useRs,

I have a list, each entry of which is a matrix of constant dimensions.
Is there a good way (i.e., not using a for loop) to apply a mean to each
matrix entry *across list entries*?

Example:

foo <- list(rbind(c(1,2,3),c(4,5,6)),rbind(c(7,8,9),c(10,11,12)))
some.sort.of.apply(foo,FUN=mean)

I'm looking for a componentwise mean across the two entries of foo,
i.e., the following output:

     [,1] [,2] [,3]
[1,]    4    5    6
[2,]    7    8    9

[NB. My "real" application involves trimming and psych::winsor(), so
anything that generalizes to this would be extra good.]

I've been looking at apply and {s,l,m,t}apply, by, with and aggregate
and searched the list archives... any ideas?

Thanks a lot,
Stephan


How about something like this:

matrix(rowMeans(sapply(foo, c)), dim(foo[[1]]))
     [,1] [,2] [,3]
[1,]    4    5    6
[2,]    7    8    9


Essentially, first create matching elementwise rows:

sapply(foo, c)
     [,1] [,2]
[1,]    1    7
[2,]    4   10
[3,]    2    8
[4,]    5   11
[5,]    3    9
[6,]    6   12


Then, get the row means:

rowMeans(sapply(foo, c))
[1] 4 7 5 8 6 9


Then finally restructure the result to a matrix, using the dimensions of
foo[[1]].

This of course makes the assumption that each matrix is of the same size
and does not otherwise check for that.

HTH,

Marc Schwartz


______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to