2012-09-11 64 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"