tidyr :: gather vs. reshape2 ::在矩阵上融化

时间:2015-04-03 09:20:01

标签: r matrix reshape2 tidyr

我以相当非标准的方式长期使用reshape2::melt:我正在运行数值实验并获得矩阵作为结果。然后我融化它并产生一些图像。

受到reshape2tidyr之间的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}}上产生所需的输出?

1 个答案:

答案 0 :(得分:12)

也许会出现更好的答案,但在此期间,我会将我的评论转换为答案:

从README引用“tidyr”:

  

请注意,tidyr旨在与dplyr一起使用,因此您应始终加载它们。

...从README到“dplyr”:

  

dplyr是plyr的下一次迭代,专注于处理数据框的工具(因此名称中为d)。

因此,有点对于没有矩阵方法是有意义的。


由于gather已经包裹melt,如果你真的想要一个matrix方法,你可以自己编写一个自定义函数,并执行以下操作:

gather.matrix <- reshape2:::melt.matrix