我长期以来一直在以一种非标准的方式使用reshape2::melt
:我运行数字实验并得到一个矩阵作为结果。然后我将其转换为长格式,并生成一些图像。
受到reshape2
和tidyr
之间的相似性的启发,我现在正在尝试在类矩阵的对象上实现完全相同的输出。但目前没有成功:
library(reshape2)
library(tidyr)
set.seed(42)
mat <- matrix(runif(6), 3)
mat2 <- mat
colnames(mat2) <- letters[1:2]
rownames(mat2) <- letters[3:5]
melt(mat)
melt(mat2)
gather(mat) # fails
gather(mat2) # fails
请注意,melt
是智能的,如果存在dimnames
,它会保留它们。我已经学习了它的工作原理,因此我可以潜在地将以下函数添加到方法分派中:
gather.matrix <- function(mat) {
if (is.null(dimnames(mat))) {
grid <- expand.grid(seq.int(nrow(mat)), seq.int(ncol(mat)))
} else {
grid <- expand.grid(dimnames(mat))
}
cbind(grid, value = as.vector(mat))
}
all.equal(melt(mat),
gather.matrix(mat))
#[1] TRUE
all.equal(melt(mat2),
gather.matrix(mat2))
#[1] TRUE
但问题是,我能否强制gather
在我的情况下像melt
一样运行?是否有任何参数组合可以在mat
和mat2
上产生所需的输出结果?
melt
(因为gather
似乎只是melt
的一个包装器)。 - A5C1D2H2I1M1N2O1R2T1