2013-03-10 81 views
4

我有一個突變計數矩陣,稱爲「計數」。該矩陣具有列名V1,V2,...,Vi,... Vn,其中不是每個「我」都在那裏。因此它可以跳轉,比如V1,V2,V5等。此外,大多數列中都有一個0。從計數創建總和矩陣

我需要創建一個總和矩陣,稱爲「答案」,其中元素i,j是在i和j兩個數字計數的總和。在我,我元素它只顯示在我的計數。

這是一個快速的數據設置。我已經在我的代碼中設置了正確的尺寸矩陣,稱爲「答案」。因此,我需要自動化的是填充矩陣的最後幾行。

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

「計數」總是一個一維矩陣,如下所示? – 2013-03-10 03:03:25

+0

是的,是的。具體而言,計數表示蛋白質中的所有氨基酸。每個氨基酸可以具有0個或更多個突變。因此計數總是1D,從蛋白質中的第一個AA到最後一個。 – user1357015 2013-03-10 03:04:20

+1

我不明白你如何從計數中得到答案。特別是,不應該V6爲零,因此不在輸出中? (你的意思是V2,V4,V5中輸出的名字?) – 2013-03-10 03:05:00

回答

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)。

+1

完美。正是我需要的。謝謝! – user1357015 2013-03-10 03:19:31