我有以下的矩阵“X”r打印出矩阵利用行和列名称适用
a b
a 1 3
b 2 4
这是一个非常大的矩阵(下调对于这个问题) 我想打印出这个矩阵由每行名称和列名称组合以及该单元格中的值组成。所以预期的输出将是
a,a,1
a,b,3
b,a,2
b,b,4
我可以循环他们,但我敢肯定,这可以避免(应用?)。任何指针非常赞赏。
我有以下的矩阵“X”r打印出矩阵利用行和列名称适用
a b
a 1 3
b 2 4
这是一个非常大的矩阵(下调对于这个问题) 我想打印出这个矩阵由每行名称和列名称组合以及该单元格中的值组成。所以预期的输出将是
a,a,1
a,b,3
b,a,2
b,b,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
你也可以。如果你想引用row.names
和col.names
然后使用as.factor = T
使用基础R功能row
和col
。使用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"
熔体听起来像是一个很好的建议,但是数据量很大,我认为它会显着减慢。 – broccoli
究竟有多大?您可能想要添加对你的问题。 – flodel
这是最有帮助的。我的工作也融化了。更容易使用。 – broccoli