我有一个突变计数矩阵,比如“计数”。该矩阵具有列名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循环执行此操作,但肯定有更好的方法吗?谢谢!
答案 0 :(得分:4)
这可以通过正确使用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
)。