我有以下的矩陣「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