melt()
该包中的函数具有reshape2
一个方便的行为,它将具有命名行/列的矩阵转换为三列数据框,其中矩阵行/列名称成为前两列:
testmat <- matrix(1:25,nrow=5,dimnames=list(LETTERS[6:10],LETTERS[1:5]))
# A B C D E
# F 1 6 11 16 21
# G 2 7 12 17 22
# H 3 8 13 18 23
# I 4 9 14 19 24
# J 5 10 15 20 25
longmat <- reshape2::melt(testmat)
head(longmat)
# Var1 Var2 value
# F A 1
# G A 2
# H A 3
# I A 4
# J A 5
# F B 6
但是它有将 Var1 和 Var2 作为因子的烦人行为,并且不支持stringsAsFactors=F
选项。reshape2的README中说“reshape2 已退役:只会进行必要的更改以使其保留在 CRAN 上。我们建议改用 tidyr。”,因此这种行为似乎不太可能在 中改变melt()
。
我尝试过其他方法,但尚未找到有效的方法:
tidyr::pivot_longer()
不会将矩阵作为输入。即使我使用 强制将矩阵变为数据框tidyr::pivot_longer(as.data.frame(testmat),cols=all_of(colnames(testmat)))
,矩阵行名称也会被丢弃,而不是在结果的列中捕获。data.table::melt()
只是重定向到reshape2::melt()
。
主要问题:是否有其他函数(tidyverse 或非 tidyverse)可以以类似的方式将矩阵转换为长格式reshape2::melt()
?
第二个问题:我一直在尝试编写自己的函数。是否存在我没有想到的隐藏“陷阱”,可能会导致下面的函数产生意外/不正确的行为?
melt_by_hand <- function(mat) {
return(data.frame(row=rep(rownames(mat),ncol(mat)),
col=rep(colnames(mat),each=nrow(mat)),
value=as.vector(mat)))
}
除了基础 R之外没有其他东西
as.data.frame.table
可以帮助转换为data.table,然后融化: