我有一个突变计数矩阵,比如“计数”。该矩阵具有列名称 V1、V2、...、Vi、...Vn,其中并非每个“i”都存在。这样就可以跳了,比如V1、V2、V5说的。此外,大多数列中都有 0。
我需要创建一个总和矩阵,称为“答案”,其中元素 i, j 是 i 和 j 处的数字计数的总和。在 i, i 元素中,它仅显示 i 处的计数数。
这是一个快速的数据设置。我已经在名为“answer”的代码中设置了正确的维度矩阵。因此,我需要自动化的是我填写矩阵的最后几行。
counts <- matrix(data = c(0,2,0,5,0,6,0), nrow = 1, ncol = 7, dimnames=list("",c("V1","V2","V3","V4","V5","V6","V7")))
answer <- matrix(data =0, nrow = 3, ncol = 3, dimnames = list(c("V2","V4","V6"),c("V2","V4","V6")))
answer[1,1] <- 2
answer[1,2] <- 7
answer[1,3] <- 8
answer[2,1] <- 7
answer[2,2] <- 5
answer[2,3] <- 11
answer[3,1] <- 8
answer[3,2] <- 11
answer[3,3] <- 6
我知道我可以用 2 个嵌套的 for 循环来做到这一点,但肯定有更好的方法吗?谢谢!
最佳答案
这可以通过正确使用 expand.grid
来完成。和 rowSums
:
n = counts[, counts > 0]
answer = matrix(rowSums(expand.grid(n, n)), nrow=length(n), dimnames=list(names(n), names(n)))
diag(answer) = n
为了展示它是如何工作的,
n
最终会是:V2 V4 V5
2 5 6
和
expand.grid(n, n)
将是: Var1 Var2
1 2 2
2 5 2
3 6 2
4 2 5
5 5 5
6 6 5
7 2 6
8 5 6
9 6 6
最后一行(
diag
)是必要的,否则对角线将是原始向量的两倍(添加 2+2
、 5+5
或 6+6
)。
关于r - 从计数创建和矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15318410/