我有一个矩阵列表:
.list <- list(matrix(1:25, ncol = 5), matrix(11:35, ncol = 5))
我想使用Reduce
方法查找列表中矩阵的逐元素方法。
换句话说,我正在寻找以下结果:
res = matrix(6:30, ncol = 5)
我尝试了以下内容:
res = Reduce(mean, .list)
但是我收到了错误:
Error in mean.default(init, x[[i]]) :
'trim' must be numeric of length one
请注意,矩阵的元素可以是NA
。
任何帮助,将不胜感激!谢谢!!
答案 0 :(得分:6)
我刚刚意识到这可以通过以下方式实现(使用Reduce
函数):
tmp = Reduce('+', .list)
result = tmp/length(.list)
答案 1 :(得分:4)
这可能更容易通过数组而不是列表来解决,因为R有一些内置的矢量化方法来解决这个问题。
要从.list
获取数组,请取消列出并提供相关维度(可以通过查找dim()
和.list[[1]]
的{{1}}自动生成:
length(.list)
然后,通过arr <- array(unlist(.list), dim = c(5,5,2))
获得所需的结果(是的,真的!)
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
参数也处理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
,这可能对apply()
正在做的事情更有启发性:
rowMeans()
即应用均值函数,按行和列维度对数据进行分组。将数组视为一个盒子,盒子的高度是第三个维度。这个盒子由小立方体组成,就像一个红宝石立方体。我们希望在每个行和列组合之上堆叠小立方体的平均值;堆叠在上面的小立方体的平均值(1,1),依此类推。如果您将列表中的多个矩阵视为数组,那么这就是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
和apply()
函数为您所做的事情。
答案 2 :(得分:1)
以下是mapply
的一种方式。
matrix(do.call(mapply, c(function(...) mean(unlist(list(...))), .list)), ncol=5)
作为旁注,.list
不是将关键字用作变量名称的最佳方式。在R中,句点前缀表示类似“元变量”的内容,当您调用ls()
时,这些变量不会显示。您可以list.
或更容易阅读list_
。