我有一个包含三个矩阵的列表:
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()
一样对每个元素进行平均。我有一个包含三个矩阵的列表:
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()
一样对每个元素进行平均。也许你想要的是:
> 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
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)}
)
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