在R中拆分成对矩阵

时间:2013-06-04 07:53:59

标签: 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个基因,不能手动完成。我尝试了几件事,但没有奏效。

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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

(制作这个社区wiki,因为它不完全是我自己的答案)。