我有以下矩阵'x'
a b
a 1 3
b 2 4
这是一个非常大的矩阵(针对这个问题进行了修剪)我想通过每个行名和列名组合以及该单元格中的值打印出这个矩阵。所以预期的输出将是
a,a,1
a,b,3
b,a,2
b,b,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
您还可以使用基本 R 函数row
和 col
如果要引用row.names
,col.names
然后使用as.factor = T
. 使用as.character
并as.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
,你需要将所有列作为同一个类(character
或numeric
。然后你可以使用
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"