2013-06-04 81 views
0

成對矩陣I具有以下面的方式以矩陣:分裂中的R

  gene ids A-B A-C A-D B-C B-D C-D 

      GENE1  0  0 1 1 1 0 
      GENE2  1  0 1 1 1 1 
      GENE3  1  0 0 0 1 1 
      GENE4  0  1 0 0 0 0 

並希望把它分解如下:對角線值將是空的,因爲在上述基體是成對比較。

  Gene1 
       A B C D 
      A  0 0 1 
      B 0  1 1 
      C 0 1  0 
      D 1 1 0 

以同樣的方式對所有的基因。

我有超過10000個基因,無法手動完成。我嘗試了幾件事,但沒有工作。

+0

我們可以假設列的順序是如上所述的方式嗎? – Thilo

+0

是的訂單是一樣的,但有很多列(超過50)。 – user1805343

回答

2

我建立在MrGumble上面的答案上。他的解決方案的問題在於R總是將其條目按列排序,因此我們可能會在數據列中填充較低的三角形,而不是上三角形。一種簡單的方法就是使用下部,或者用下部的轉置填充矩陣的上部。

m <- structure(c(0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0), .Dim = c(4L, 6L), .Dimnames = list(c("GENE1", "GENE2", "GENE3", "GENE4"), c("A-B", "A-C", "A-D", "B-C", "B-D", "C-D"))) 

gene <- matrix(0, ncol=4, nrow=4) # empty, template matrix 
gene[lower.tri(gene)] <- m[4,] 
gene <- gene + t(gene) 
diag(gene) <- NA 

(產地:這個社區維基,因爲它不是完全是我自己的答案)。

2
m <- structure(c(0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 0), .Dim = c(4L, 6L), .Dimnames = list(c("GENE1", "GENE2", "GENE3", "GENE4"), c("A-B", "A-C", "A-D", "B-C", "B-D", "C-D"))) 

gene <- matrix(NA, ncol=4, nrow=4) # empty, template matrix 
gene[upper.tri(gene)] <- m[1,] 
gene[lower.tri(gene)] <- rev(m[1,]) 

## gene now contains the interaction matrix for GENE1. 
+0

+1真正簡潔的解決方案。 – Thomas

+0

關閉,但並非完全正確。假設gene5將是'c(0,0,1,0,0,0)'。那麼你的矩陣不再是對稱的。 – Thilo

+0

好悲痛,謝謝你收到@Thilo。我添加了一個「rev」來清除它。 – MrGumble