我有一个矩阵列表:
.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.任何帮助,将不胜感激!谢谢!!
我刚刚意识到这可以通过以下方式实现(使用该Reduce功能):
tmp = Reduce('+', .list)
result = tmp/length(.list)
Run Code Online (Sandbox Code Playgroud)
这可能通过数组而不是列表更容易解决,因为 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()函数为您做的事情。