如何在R中的列表中的所有元素的每个元素上应用函数

时间:2017-09-15 10:52:43

标签: r list apply

我有一个包含R中相同大小的矩阵的列表。我想在所有矩阵的同一元素上应用一个函数。示例:

> 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

现在我想应用均值函数,并希望得到一个像这样的矩阵:

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

2 个答案:

答案 0 :(得分:5)

这样做的一种概念性方法是总结矩阵,然后取每个条目的平均值。尝试使用Reduce

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

<强>输出:

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

在这里演示:

Rextester

答案 1 :(得分:0)

另一个选择是构造一个数组,然后使用apply

第1步:构建数组。
使用abind库和do.call,您可以执行以下操作:

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

使用base R,您可以去除结构,然后像这样重建它:

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

在这两种情况下,它们都会返回所需的数组

, , 1

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

, , 2

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

第2步:使用apply计算第一维和第二维的平均值。

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

这比Reduce更灵活,因为你可以换掉更多的函数,但对于这个特定的应用程序它会更慢。