一个由矩阵构成的列表,每个元素的平均值是什么?

5

我有一个包含三个矩阵的列表:

a<-matrix(runif(100))
b<-matrix(runif(100))
c<-matrix(runif(100))

mylist<-list(a,b,c)

我想得到三个矩阵中每个元素的平均值。
我尝试了:aaply(laply(mylist, as.matrix), c(1, 1), mean),但这只返回每个矩阵的平均值,而不是像rowMeans()一样对每个元素进行平均。
3个回答

17

也许你想要的是:

> set.seed(1)
> a<-matrix(runif(4)) 
> b<-matrix(runif(4))
> c<-matrix(runif(4))
> mylist<-list(a,b,c)  # a list of 3 matrices 
> 
> apply(simplify2array(mylist), c(1,2), mean)
          [,1]
[1,] 0.3654349
[2,] 0.4441000
[3,] 0.5745011
[4,] 0.5818541

在apply函数调用中,向量c(1,2)MARGIN表示应该对行和列(同时)使用函数mean,有关详细信息,请参见?apply

另一种选择是使用Reduce函数。

> Reduce("+", mylist)/ length(mylist)
          [,1]
[1,] 0.3654349
[2,] 0.4441000
[3,] 0.5745011
[4,] 0.5818541

0

simplify2array选项非常缓慢,因为它调用mean函数nrow*ncol次:

Unit: milliseconds
           expr         min          lq       mean     median         uq        max neval
         reduce    7.320327    8.051267   11.23352   12.17859   13.59846   13.72176    10
 simplify2array 4233.090223 4674.827077 4802.74033 4808.00417 5010.75771 5228.05362    10
     via_vector   27.720372   42.757517   51.95250   59.47917   60.11251   61.83605    10
       for_loop   10.405315   12.919731   13.93157   14.46218   15.82175   15.89977    10

l=lapply(1:3,function(i)matrix(i*(1:1e6),10))

microbenchmark(times=10,
  Reduce={Reduce(`+`,l)/length(l)},
  simplify2array={apply(simplify2array(l),c(1,2),mean)},
  via_vector={matrix(rowMeans(sapply(l,as.numeric)),nrow(l[[1]]))},
  for_loop={o=l[[1]];for(i in 2:length(l))o=o+l[[i]];o/length(l)}
)

-1
你的问题不够清楚。
对于每个矩阵的所有元素的含义:
sapply(mylist, mean)

对于每个矩阵的 每一行 求均值:

sapply(mylist, rowMeans)

对于每个矩阵的每列的平均值:

sapply(mylist, colMeans)

请注意,如果可能的话,sapply将自动简化结果为向量或矩阵。在第一种情况下,结果将是一个向量,但在第二种和第三种情况下,它可能是一个列表或矩阵。
例如:
a <- matrix(1:6,2,3)
b <- matrix(7:10,2,2)
c <- matrix(11:16,3,2)
mylist <- list(a,b,c)

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

[[2]]
     [,1] [,2]
[1,]    7    9
[2,]    8   10

[[3]]
     [,1] [,2]
[1,]   11   14
[2,]   12   15
[3,]   13   16

结果:

> sapply(mylist, mean)
[1]  3.5  8.5 13.5

> sapply(mylist, rowMeans)
[[1]]
[1] 3 4

[[2]]
[1] 8 9

[[3]]
[1] 12.5 13.5 14.5

> sapply(mylist, colMeans)
[[1]]
[1] 1.5 3.5 5.5

[[2]]
[1] 7.5 9.5

[[3]]
[1] 12 15

(您回答了一个更简单的问题) - Martin Mächler
@MartinMächler,感谢您的建议,我已经修改了我的回答。现在您认为怎么样? - Ferdinand.kraft
确实,这很好而且有帮助。教别人如何使用sapply(.,.)非常好。不过,看一下sapply()的定义..[答案:它使用lapply和simplify2array]...你会明白直接使用simplify2array在某些方面更加微妙,但仍然与你的答案相关。现在,看到两者的结合确实是很好的补充。 - Martin Mächler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接