【问题标题】:Mean of each element of a list of matrices矩阵列表中每个元素的平均值
【发布时间】:2013-09-01 11:54:40
【问题描述】:

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

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() 那样取每个元素的平均值。

【问题讨论】:

    标签: r


    【解决方案1】:

    也许你想要的是:

    > 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 调用中MARGIN 的向量c(1,2) 表明函数mean 应该应用于行和列(同时),有关更多详细信息,请参阅?apply

    另一种选择是使用Reduce 函数

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

    【讨论】:

      【解决方案2】:

      你的问题不清楚。

      对于每个矩阵的所有元素的平均值:

      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
      

      【讨论】:

      • (你回答了一个更简单的问题)
      • @MartinMächler,感谢您的输入,我已经更改了答案。你现在怎么看?
      • 确实,现在这很好而且很有帮助。教其他人使用 sapply(.,.) 非常好。不过,看看 sapply() 是如何定义的 .. [A:它使用 lapply 和 simple2array].... 你就会明白,直接使用 simple2array 在某些方面更加微妙,并且仍然与你的答案非常相关.现在看到两者确实很好并且互补。
      猜你喜欢
      • 2021-10-29
      • 1970-01-01
      • 2020-03-20
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 2021-06-16
      • 2015-10-23
      相关资源
      最近更新 更多