2012-03-28 5 views
4

행렬이 R입니다. 각 항목 i, j은 점수이고 rownames와 colnames는 ids입니다. i, j, scoreR : 행렬을 세 개의 열로 배열하십시오.

을 지금 내가 루프 중첩 사용하고 대신 행렬의

난 그냥있는 3 열 행렬을합니다. 마찬가지로 :

for(i in rownames(g)) 
    { 
     print(which(rownames(g)==i)) 
     for(j in colnames(g)) 
     { 
      cur.vector<-c(cur.ref, i, j, g[rownames(g) %in% i,colnames(g) %in% j]) 
      rbind(new.file,cur.vector)->new.file 
     } 

    } 

하지만 그게 전부는 매우 비효율적 인 나는 아직 R과 단지 충분히 좋은 아니에요 더 나은 방법이있을거야 ... 생각합니다. 생각 하시겠습니까?

+0

은''dput (g)를 사용하여 행렬의 콘텐츠를 게시하시기 바랍니다 - 그것은 훨씬 쉽게 문제 –

+0

미래 수색자을 이해하는 것, 역 동작에 대한 답변을 여기 참조 : HTTP ://stackoverflow.com/q/9617348/210673 – Aaron

답변

6

정확하게 이해한다면 매트릭스를 병합해야합니다.
as.vectorrep을 사용하여 ID 열을 추가 할 수 있습니다. :

m = cbind(c(1,2,3),c(4,5,6),c(7,8,9)) 
row.names(m) = c('R1','R2','R3') 
colnames(m) = c('C1','C2','C3') 

d <- data.frame(i=rep(row.names(m),ncol(m)), 
       j=rep(colnames(m),each=nrow(m)), 
       score=as.vector(m)) 

결과 :

> m 
    C1 C2 C3 
R1 1 4 7 
R2 2 5 8 
R3 3 6 9 

> d 
    i j score 
1 R1 C1  1 
2 R2 C1  2 
3 R3 C1  3 
4 R1 C2  4 
5 R2 C2  5 
6 R3 C2  6 
7 R1 C3  7 
8 R2 C3  8 
9 R3 C3  9 

하시기 바랍니다가, 행 및 COL 이름은 문자열이 될 수 있기 때문에 서로 다른 열이있는 매트릭스를 가질 수 없습니다,이 코드는 data.frame에 행렬 변환 있습니다 유형.
모든 행과 열 이름이 숫자 인 것이 확실하면 행렬로 강제 변환 할 수 있습니다.

+1

그게 내가 원하는 롤. 나를 위해 말로 나타내는 것을 감사하십시오 :) – JoshDG

6

매트릭스를 먼저 테이블 (as.table 포함)로 변환 한 다음 데이터 프레임 (as.data.frame)으로 변환하면 원하는 결과를 얻을 수 있습니다. 간단한 예 :

> tmp <- matrix(1:12, 3) 
> dimnames(tmp) <- list(letters[1:3], LETTERS[4:7]) 
> as.data.frame(as.table(tmp)) 
    Var1 Var2 Freq 
1  a D 1 
2  b D 2 
3  c D 3 
4  a E 4 
5  b E 5 
6  c E 6 
7  a F 7 
8  b F 8 
9  c F 9 
10 a G 10 
11 b G 11 
12 c G 12 
+0

그것은 나를 위해 가장 쉽게 일했다. 그러나 data.frame을 먼저 행렬로 변환 한 다음 테이블로 변환 한 다음 다시 데이터 프레임으로 변환해야했습니다. – Jens

관련 문제