1

我有以下矩阵'x'

   a b
a 1 3
b 2 4

这是一个非常大的矩阵(针对这个问题进行了修剪)我想通过每个行名和列名组合以及该单元格中的值打印出这个矩阵。所以预期的输出将是

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

我可以遍历它们,但我很确定这可以避免(应用?)。任何指针都非常感谢。

4

2 回答 2

4

一种方法是使用包中的melt函数reshape2

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))

编辑2

经过比较大的数据测试后,我不排除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 
于 2012-09-11T01:22:51.773 回答
1

您还可以使用基本 R 函数rowcol

如果要引用row.namescol.names然后使用as.factor = T. 使用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"  
于 2012-09-11T01:37:39.780 回答