按元素列出的矩阵列表的平均值

May*_*you 2 r list matrix

我有一个矩阵列表:

 .list <- list(matrix(1:25, ncol = 5), matrix(11:35, ncol = 5))
Run Code Online (Sandbox Code Playgroud)

我想使用该Reduce方法来查找列表中矩阵的逐元素方法.

换句话说,我正在寻找以下结果:

 res = matrix(6:30, ncol = 5)
Run Code Online (Sandbox Code Playgroud)

我尝试了以下方法:

 res = Reduce(mean, .list)
Run Code Online (Sandbox Code Playgroud)

但是我收到一个错误:

Error in mean.default(init, x[[i]]) : 
  'trim' must be numeric of length one
Run Code Online (Sandbox Code Playgroud)

注意矩阵的元素可以是NA.任何帮助,将不胜感激!谢谢!!

May*_*you 6

我刚刚意识到这可以通过以下方式实现(使用该Reduce功能):

 tmp = Reduce('+', .list)
 result = tmp/length(.list)
Run Code Online (Sandbox Code Playgroud)


Rei*_*son 5

这可能通过数组而不是列表更容易解决,因为 R 有一些内置的矢量化方法来解决这个问题。

要从 中获取数组.list,请取消列出它并提供相关维度(可以通过查找dim()of.list[[1]]和来自动化length(.list)

arr <- array(unlist(.list), dim = c(5,5,2))
Run Code Online (Sandbox Code Playgroud)

然后,通过rowMeans()(是的,真的!)获得所需的结果

rowMeans(arr, dim = 2)

R> rowMeans(arr, dim = 2)
     [,1] [,2] [,3] [,4] [,5]
[1,]    6   11   16   21   26
[2,]    7   12   17   22   27
[3,]    8   13   18   23   28
[4,]    9   14   19   24   29
[5,]   10   15   20   25   30
Run Code Online (Sandbox Code Playgroud)

na.rm参数处理的NA情况下也:

R> rowMeans(arr, dim = 2, na.rm = TRUE)
     [,1] [,2] [,3] [,4] [,5]
[1,]    6   11   16   21   26
[2,]    7   12   17   22   27
[3,]    8   13   18   23   28
[4,]    9   14   19   24   29
[5,]   10   15   20   25   30
Run Code Online (Sandbox Code Playgroud)

较慢的方法是使用apply(),这可能对rowMeans()正在做什么更有启发性:

R> apply(arr, 1:2, mean, na.rm = TRUE)
     [,1] [,2] [,3] [,4] [,5]
[1,]    6   11   16   21   26
[2,]    7   12   17   22   27
[3,]    8   13   18   23   28
[4,]    9   14   19   24   29
[5,]   10   15   20   25   30
Run Code Online (Sandbox Code Playgroud)

即应用均值函数,按行和列维度对数据进行分组。把数组想象成一个盒子,盒子的高度是第三维。这个盒子由小立方体组成,就像一个rubic 立方体。我们想要堆积在每一行和列组合上方的小立方体的平均值;堆叠在 (1,1) 上方的小立方体的平均值,依此类推。如果将列表中的多个矩阵视为数组,这就是apply()rowMeans()函数为您做的事情。

  • +1 也有相关性:`?simplify2array`。 (3认同)