Marten Hoffmann
Marten Hoffmann

Reputation: 13

How to apply a function on every element of all elements in a list in R

I have a list containing matrices of the same size in R. I would like to apply a function over the same element of all matrices. Example:

> a <- matrix(1:4, ncol = 2)
> b <- matrix(5:8, ncol = 2)
> c <- list(a,b)
> c
[[1]]
     [,1] [,2]
[1,]    1    3
[2,]    2    4

[[2]]
     [,1] [,2]
[1,]    5    7
[2,]    6    8

Now I want to apply the mean function and would like to get a matrix like that:

      [,1] [,2]
[1,]    3    5
[2,]    4    6

Upvotes: 1

Views: 352

Answers (2)

lmo
lmo

Reputation: 38520

Another option is to construct an array and then use apply.

step 1: constructing the array.
Using the abind library and do.call, you can do this:

library(abind)
myArray <- do.call(function(...) abind(..., along=3), c)

Using base R, you can strip out the structure and then rebuild it like this:

myArray <- array(unlist(c), dim=c(dim(a), length(c)))

In both instances, these return the desired array

, , 1

     [,1] [,2]
[1,]    1    3
[2,]    2    4

, , 2

     [,1] [,2]
[1,]    5    7
[2,]    6    8

step 2: use apply to calculate the mean along the first and second dimensions.

apply(myArray, 1:2, mean)
     [,1] [,2]
[1,]    3    5
[2,]    4    6

This will be more flexible than Reduce, since you can swap out many more functions, but it will be slower for this particular application.

Upvotes: 1

Tim Biegeleisen
Tim Biegeleisen

Reputation: 522752

One conceptual way to do this would be to sum up the matrices and then take the average value of each entry. Try using Reduce:

Reduce('+', c) / length(c)

Output:

     [,1] [,2]
[1,]    3    5
[2,]    4    6

Demo here:

Rextester

Upvotes: 6

Related Questions