2012-09-11 99 views
1

我有以下的矩陣「X」r打印出矩陣利用行和列名稱適用

a b 
a 1 3 
b 2 4 

這是一個非常大的矩陣(下調對於這個問題) 我想打印出這個矩陣由每行名稱和列名稱組合以及該單元格中的值組成。所以預期的輸出將是

a,a,1 
a,b,3 
b,a,2 
b,b,4 

我可以循環他們,但我敢肯定,這可以避免(應用?)。任何指針非常讚賞。

回答

4

一種方法是使用reshape2包中的melt函數。

x <- matrix(1:4, nrow = 2, ncol = 2, 
      dimnames = list(dim1 = c("a", "b"), dim2 = c("a", "b"))) 

library(reshape2) 
melt(x) 
# dim1 dim2 value 
# 1 a a  1 
# 2 b a  2 
# 3 a b  3 
# 4 b b  4 

編輯 如果你的數據是如此之大,速度是一個問題,我會還建議:

data.frame(dim1 = rep(rownames(x), ncol(x)), 
      dim2 = rep(colnames(x), each = nrow(x)), 
      value = c(x)) 

EDIT2

有比較大的數據測試後,我不排除melt

x <- matrix(runif(9e6), nrow = 3000, ncol = 3000, 
      dimnames = list(dim1 = paste0("x", runif(3000)), 
          dim2 = paste0("y", runif(3000)))) 

system.time(y1 <- melt(x)) 
# user system elapsed 
# 1.17 0.44 1.61 

system.time(y2 <- data.frame(dim1 = rep(rownames(x), ncol(x)), 
          dim2 = rep(colnames(x), each = nrow(x)), 
          value = c(x))) 
# user system elapsed 
# 1.98 0.37 2.36 
+0

熔體聽起來像是一個很好的建議,但是數據量很大,我認爲它會顯着減慢。 – broccoli

+0

究竟有多大?您可能想要添加對你的問題。 – flodel

+0

這是最有幫助的。我的工作也融化了。更容易使用。 – broccoli

1

你也可以。如果你想引用row.namescol.names然後使用as.factor = T使用基礎R功能rowcol

。使用as.characteras.numeric使矩陣變平。

do.call(data.frame,list(lapply(list(row = row(x, T),col=col(x,T)), as.character), 
         value =as.numeric(x))) 

## row col value 
## 1 a a  1 
## 2 b a  2 
## 3 a b  3 
## 4 b b  4 

如果你想有一個matrix你將需要有所有列作爲同一類(characternumeric。然後,您可以使用

do.call(cbind, lapply(list(row = row(x), col = col(x), value = x), as.numeric)) 

##  row col value 
## [1,] 1 1  1 
## [2,] 2 1  2 
## [3,] 1 2  3 
## [4,] 2 2  4 

或者作爲字符

do.call(cbind, lapply(list(row = row(x, T), col = col(x, T), value = x), as.character)) 
##  row col value 
## [1,] "a" "a" "1" 
## [2,] "b" "a" "2" 
## [3,] "a" "b" "3" 
## [4,] "b" "b" "4"