从计数中创建和矩阵

时间:2013-03-10 03:00:57

标签: r loops matrix sum

我有一个突变计数矩阵,比如“计数”。该矩阵具有列名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循环执行此操作,但肯定有更好的方法吗?谢谢!

1 个答案:

答案 0 :(得分:4)

这可以通过正确使用expand.gridrowSums

来完成
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)。