2012-03-28 109 views
4

我在R中有一個矩陣。每個條目i,j是一個分數,rownames和colnames是ids。R:將矩陣重新排列爲三列

取而代之的是矩陣的我只是想有一個3列矩陣:ijscore

現在,我使用嵌套的for循環。喜歡:

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)的矩陣的內容' - 這將使它更容易理解您的問題 – 2012-03-28 18:32:13

+0

未來的搜索,看到答案的反向操作在這裏:HTTP:/ /stackoverflow.com/q/9617348/210673 – Aaron 2012-03-29 01:03:40

回答

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 

請注意,此代碼轉換矩陣爲data.frame,自排和col名可以是字符串,你不能有不同的列矩陣類型。
如果您確定所有行和列名都是數字,則可以將其強制轉換爲矩陣。

+1

這就是我想要的笑。感謝爲我闡述:) – JoshDG 2012-03-28 19:09:35

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 2015-10-13 13:31:34