【问题标题】:Standard deviation over a list of matrices in RR中矩阵列表的标准差
【发布时间】:2016-09-06 14:03:12
【问题描述】:

我有一个列表,其中每个元素都是一个矩阵。

set.seed(123)

m1 <- matrix(sample(c(1:10), size = 9, replace = TRUE), ncol = 3, nrow = 3)
m2 <- matrix(sample(c(1:10), size = 9, replace = TRUE), ncol = 3, nrow = 3)
m3 <- matrix(sample(c(1:10), size = 9, replace = TRUE), ncol = 3, nrow = 3)

m <- list(m1, m2, m3)
m
[[1]]
      [,1] [,2] [,3]
[1,]    3    9    6
[2,]    8   10    9
[3,]    5    1    6

[[2]]
     [,1] [,2] [,3]
[1,]    5    7    9
[2,]   10    6    3
[3,]    5    2    1

[[3]]
     [,1] [,2] [,3]
[1,]    4    7    7
[2,]   10    7    8
[3,]    9   10    6

我想计算每一对的标准差,考虑所有三个矩阵。因此对于单元格 [1,1],标准差为:

sd(c(3, 5, 4))

我的最终矩阵应该是这样的:

     [,1] [,2] [,3]
[1,] 1.00 1.15 1.53
[2,] 1.15 2.08 3.21
[3,] 2.31 4.93 2.89

如果不对所有三个矩阵进行循环,我如何在 R 中实现这一点?

非常感谢。

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    最好通过unlistlist 转换为vector 将其转换为array,将其转换为3D array 并通过apply 获得sd

    round(apply(array(unlist(m), c(3, 3, 3)), c(1,2), sd),2)
    #    [,1] [,2] [,3]
    #[1,] 1.00 1.15 1.53
    #[2,] 1.15 2.08 3.21
    #[3,] 2.31 4.93 2.89
    

    【讨论】:

    • 无论如何要将此答案推广到任何大小的矩阵和任何长度的矩阵列表?
    • @colin 你可以创建一个函数f1 &lt;- function(lst) { n &lt;- length(lst); rc &lt;- dim(lst[[1]]); ar1 &lt;- array(unlist(lst), c(rc, n)); round(apply(ar1, c(1, 2), sd), 2); } 假设所有list 元素都有相同维度的矩阵
    【解决方案2】:

    另一种选择是

    matrix(apply(sapply(1:9, function(x) unlist(m)[seq(x, length(unlist(m)), 9)]), 2, sd), 
                                                                                  ncol = 3)
    
    #       [,1]     [,2]     [,3]
    #[1,] 1.000000 1.154701 1.527525
    #[2,] 1.154701 2.081666 3.214550
    #[3,] 2.309401 4.932883 2.886751
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-06
      相关资源
      最近更新 更多