用于迭代索引列表并更新相应矩阵的矢量化解决方案

问题描述 投票:0回答:1

我有以下形式的列表列表

xx = list("a_1" = list("A", "C"), 
          "a_2" = list("B", "C"), 
          "a_3" = list("B", "B"), 
          "a_4" = list("C", "B"), 
          "a_5" = list("B", "A"))

我想更新一个矩阵

m = matrix(data = 0, nrow = 3, ncol = 3)         # initialise matrix of zeros
rownames(m) = c("A", "B", "C")                   # name rows
colnames(m) = c("A", "B", "C")                   # name columns

这样我们将给定对对应的矩阵索引加一。使用 for 循环很容易做到这一点

for (item in xx) {
  
  # add one to the matrix index if item in xx
  m[item[[1]], item[[2]]] = m[item[[1]], item[[2]]] + 1
  
}

其中包含预期的输出

  A B C
A 0 0 1
B 1 1 1
C 0 1 0

尽管这对于大型列表来说可能有点麻烦。我希望使用

apply()
方法以矢量化方式执行此操作 - 但我无法使用
lapply()
的嵌套组合来迭代列表和
sapply()
将值更新为矩阵。

所以我想知道如何使用

apply()
的变体来做到这一点?

r lapply sapply
1个回答
0
投票

制作一个

row/column
对索引矩阵,然后覆盖:

sel <- t(sapply(xx, unlist))
m[sel] <- m[sel] + 1
m
#  A B C
#A 0 0 1
#B 1 1 1
#C 0 1 0 
© www.soinside.com 2019 - 2024. All rights reserved.