11

我长期以来一直reshape2::melt以一种相当非标准的方式使用它:我正在运行数字实验并得到一个矩阵。然后我融化它并产生一些图像。

受 和 之间的相似性启发,我现在正试图在类矩阵的对象上实现相同的输出。到目前为止没有运气:reshape2tidyr

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

4

1 回答 1

12

也许会出现更好的答案,但与此同时,我会将我的评论转换为答案:

引用自述文件到“tidyr”:

请注意,tidyr 是为与 dplyr 一起使用而设计的,因此您应该始终同时加载两者。

...从自述文件到“dplyr”:

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

因此,没有矩阵方法是有道理的


既然gather已经 wraps around melt,如果你真的想要一个matrix方法,你可以省去自己编写一个自定义函数,只需执行以下操作:

gather.matrix <- reshape2:::melt.matrix
于 2015-04-03T10:44:24.143 回答