2013-06-04 2 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 개 이상의 유전자를 가지고 있으며 수동으로 할 수 없습니다. 몇 가지 시도했지만 didn 작동합니다.

+0

열의 순서가 위의 방법이라고 가정 할 수 있습니까? – Thilo

+0

예 주문은 동일하지만 여러 열 (50 개 이상)이 있습니다. – user1805343

답변

2

위의 MrGumble의 답변을 바탕으로 작성되었습니다. 그의 해법의 문제점은 R이 항 상 column-major로 정렬 된 엔트리를 가지므로, 우리는 데이터 삼각형을 채우지 만 상단 삼각형은 채울 수 없다는 것이다. 하나의 쉬운 방법은 아래 부분을 사용하거나 행렬의 위쪽 부분을 아래쪽 부분의 조 변경 부분으로 채우는 것입니다.

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