我有以下形式的列表列表
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()
的变体来做到这一点?
制作一个
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