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

时间:2014-01-27 21:53:01

标签: r list matrix

我有一个矩阵列表:

 .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。 任何帮助,将不胜感激!谢谢!!

3 个答案:

答案 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_