【问题标题】:Accessing same matrix position from multiple matrices in a list in R?从R中列表中的多个矩阵访问相同的矩阵位置?
【发布时间】:2021-07-15 06:38:02
【问题描述】:

我有一个任意长度的列表,所有条目都是任意长度和宽度的矩阵,但彼此大小相同。我想计算列表中每个矩阵中相同位置的值的平均值、中位数和众数。我可以用 for 循环来做到这一点,但有没有更简单/矢量化的方式?

我试过了:

for (x in 1:X){
   for (y in 1:Y){
      My_List[[B+1]][y,x] <- mean(My_List[[1:B]][y,x])
      My_List[[B+2]][y,x] <- median(My_List[[1:B]][y,x])
      My_List[[B+3]][y,x] <- mode(My_List[[1:B]][y,x])
   }
}

列表的长度为 B+3,矩阵的宽度均为 X,长度为 Y,但我遇到了与尝试跨列表条目访问有关的错误。我考虑过 lapply(),但我不知道如何将日落操作变成 apply() 系列的乐趣。我可以用一个淫秽的 for 循环嵌套来做到这一点,但必须有更好的方法,尤其是在 R 中。

编辑:可重现的示例和预期输出:

第 1 步:My_List 的生成:

Matrix_A <- matrix(c(1, 2, 3, 4, 5, 6), nrow = 2)
Matrix_B <- matrix(c(2, 1, 3, 3, 6, 5), nrow = 2)
Matrix_C <- matrix(c(1, 1, 3, 3, 5, 5), nrow = 2)

# X = 3, Y = 2

B = 3

My_List <- vector(mode = "list", length = B + 3)

My_List[[1]] <- Matrix_A
My_List[[2]] <- Matrix_B
My_List[[3]] <- Matrix_C

My_List

第1步输出,注意NULL占位符空格:

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

[[2]]
     [,1] [,2] [,3]
[1,]    2    3    6
[2,]    1    3    5

[[3]]
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    1    3    5

[[4]]
NULL

[[5]]
NULL

[[6]]
NULL

使用与上面相同的代码块,我希望看到 My_List[[4]][1,1] 是 My_List[[1]][1,1], My_List[[2]][1 ,1] 和 My_List[[3]][1,1],因此 1 + 2 + 1 / 3 = 1.333,对于 y 和 x 的每个组合,依此类推。列表的索引 4 表示平均值,5 表示中位数,6 表示众数。

我希望最终输出是:

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

[[2]]
     [,1] [,2] [,3]
[1,]    2    3    6
[2,]    1    3    5

[[3]]
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    1    3    5

[[4]] # Mean
     [,1]     [,2]     [,3]
[1,]    1.333    3.000    5.333
[2,]    1.333    3.333    5.333

[[5]] # Median
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    1    3    5

[[6]] # Mode
     [,1] [,2] [,3]
[1,]    1    3    5
[2,]    1    3    5

【问题讨论】:

  • 您能否提供一个可重现的示例以及您希望最终输出的样子?
  • 您好,欢迎来到 SO。请包含一些可重现的示例,以更好地解释您的事情!
  • 我编辑添加了一个可重现的示例(我最好理解这意味着什么)和一些手动制作的示例输出

标签: r list matrix subset vectorization


【解决方案1】:

您可以将矩阵列表转换为 3 维数组:

i <- 2
j <- 3

n <- 4

# create list of n i*j matrices
l <- replicate(n, list(matrix(sample(10,i*j),i,j)))

# list to 3D array
arr.3d <- array(unlist(l), c(i, j, n))

apply(arr.3d, 1:2, mean)
     [,1] [,2] [,3]
[1,] 6.50 5.00 3.50
[2,] 5.25 4.25 6.75

apply(arr.3d, 1:2,median)
     [,1] [,2] [,3]
[1,]    6    5  1.5
[2,]    5    4  6.0

对于mode

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}

apply(arr.3d,1:2,Mode)

【讨论】:

  • 只要注意第三维度的维度应该是列表中非 NULL 元素的数量。在您的示例中,n = 3,而不是 length(My_List)==6
猜你喜欢
  • 1970-01-01
  • 2019-09-04
  • 1970-01-01
  • 2015-02-07
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多