4

我有一个突变计数矩阵,比如“计数”。该矩阵具有列名 V1、V2、...、Vi、...Vn,其中并非每个“i”都存在。因而它可以跳跃,比如V1、V2、V5说的。此外,大多数列中都有一个 0。

我需要创建一个总和矩阵,称为“答案”,其中元素 i, j 是 i 和 j 处的数字计数的总和。在 i, i 元素它只显示 i 处的计数。

这是一个快速的数据设置。我已经在我的代码中设置了正确的尺寸矩阵,称为“答案”。因此,我需要自动化的是我填写矩阵的最后几行。

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 循环来做到这一点,但肯定有更好的方法,不是吗?谢谢!

4

1 回答 1

4

这可以通过正确使用expand.gridand来完成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+25+56+6)。

于 2013-03-10T03:12:56.763 回答