我以相当非标准的方式长期使用reshape2::melt
:我正在运行数值实验并获得矩阵作为结果。然后我融化它并产生一些图像。
受到reshape2
和tidyr
之间的similarity的启发,我现在正试图在类矩阵的对象上实现相同的输出。到目前为止没有运气:
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
。我已经学会了how it works,所以我可以将以下函数添加到方法调度中:
gather
但问题是,在我的案例中,我可以强制melt
采取与mat
相同的方式行事吗?是否有任何参数组合可以在mat2
和{{1}}上产生所需的输出?
答案 0 :(得分:12)
也许会出现更好的答案,但在此期间,我会将我的评论转换为答案:
从README引用“tidyr”:
请注意,tidyr旨在与dplyr一起使用,因此您应始终加载它们。
...从README到“dplyr”:
dplyr是plyr的下一次迭代,专注于处理数据框的工具(因此名称中为
d
)。
因此,有点对于没有矩阵方法是有意义的。
由于gather
已经包裹melt
,如果你真的想要一个matrix
方法,你可以自己编写一个自定义函数,并执行以下操作:
gather.matrix <- reshape2:::melt.matrix