Hi, I have multiple three dimensional arrays. Like this: x1 <- array(rnorm(1000, 1, 2), dim=c(10, 10, 10)) x2 <- array(rnorm(1000, 1, 2), dim=c(10, 10, 10)) x3 <- array(rnorm(1000, 1, 2), dim=c(10, 10, 10)) Now I would like to compute the mean for each corresponding cell. As a result I want to get one 3D array (10 x 10 x 10) in which at position x, y, z is the mean of the corresponding values of x1, x2 and x3 (at position x, y, z). How can I do this?
R. Michael Weylandt <michael.weylandt@gmail.com>
2011-Oct-05 13:14 UTC
[R] mean of 3D arrays
(x1+x2+x3)/3 I'm not aware of a "pmean" function but it wouldn't be hard to homebrew one if you are comfortable with the ... argument I'll draft one up and send it along Michael Weylandt On Oct 5, 2011, at 9:00 AM, Martin Batholdy <batholdy at googlemail.com> wrote:> Hi, > > I have multiple three dimensional arrays. > > Like this: > > x1 <- array(rnorm(1000, 1, 2), dim=c(10, 10, 10)) > x2 <- array(rnorm(1000, 1, 2), dim=c(10, 10, 10)) > x3 <- array(rnorm(1000, 1, 2), dim=c(10, 10, 10)) > > > Now I would like to compute the mean for each corresponding cell. > As a result I want to get one 3D array (10 x 10 x 10) in which at position x, y, z is the mean of the corresponding values of x1, x2 and x3 (at position x, y, z). > > > How can I do this? > > ______________________________________________ > R-help at 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.
Hi: There are a few ways to do this. If you only have a few arrays, you can simply add them and divide by the number of arrays. If you have a large number of such arrays, this is inconvenient, so an alternative is to ship the arrays into a list and use the Reduce() function. For your example, L <- list(x1, x2, x3) Reduce('+', L)/length(L) would work. If you have many such arrays in separate files, you can always use lapply() in conjunction with a suitable read function with an input vector that contains the file names to be read, of the general form L <- lapply(<vector of file names>, <function to read data>) with the idea that the read function passes arrays into the list components. Here's a simple toy example with three small matrices to illustrate proof of concept:> t1 <- matrix(1:9, nrow = 3) > t2 <- matrix(-4:4, nrow = 3) > t3 <- matrix(-3:5, nrow = 3) > (t1 + t2 + t3)/3[,1] [,2] [,3] [1,] -2 1 4 [2,] -1 2 5 [3,] 0 3 6> Reduce('+', list(t1, t2, t3))/3[,1] [,2] [,3] [1,] -2 1 4 [2,] -1 2 5 [3,] 0 3 6 HTH, Dennis On Wed, Oct 5, 2011 at 6:00 AM, Martin Batholdy <batholdy at googlemail.com> wrote:> Hi, > > I have multiple three dimensional arrays. > > Like this: > > x1 <- array(rnorm(1000, 1, 2), dim=c(10, 10, 10)) > x2 <- array(rnorm(1000, 1, 2), dim=c(10, 10, 10)) > x3 <- array(rnorm(1000, 1, 2), dim=c(10, 10, 10)) > > > Now I would like to compute the mean for each corresponding cell. > As a result I want to get one 3D array (10 x 10 x 10) in which at position x, y, z is the mean of the corresponding values of x1, x2 and x3 (at position x, y, z). > > > How can I do this? > > ______________________________________________ > R-help at 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. >