我有以下方式的矩阵:
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 :(得分: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,因为它不完全是我自己的答案)。