tidyr::gather 与 reshape2::melt 矩阵

Posted

技术标签:

【中文标题】tidyr::gather 与 reshape2::melt 矩阵【英文标题】:tidyr::gather vs. reshape2::melt on matrices 【发布时间】:2015-06-08 09:07:35 【问题描述】:

我以一种相当不标准的方式长期使用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 存在,则会保留它们。我已经学习了how it works,所以我可以将以下函数添加到方法调度中:

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 相同的方式行事吗?是否有任何参数组合可以在matmat2 上产生所需的输出?

【问题讨论】:

考虑到“tidyr 旨在与 dplyr 结合使用”并且“dplyr”“专注于处理数据帧的工具”,我认为您最好还是坚持使用melt (因为gather 似乎是melt 的包装器)。 @AnandaMahto 我确实倾向于这样做,只是想知道我是否遗漏了一些明显的东西:) 如果真的需要gather 方法,我想省去重写的时间,直接做gather.matrix &lt;- reshape2:::melt.matrix.... :-) @AnandaMahto 太好了,没想到 :) 你这两个 cmet 总结得不错,你要发布一个答案吗? 【参考方案1】:

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

从 README 中引用“tidyr”:

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

...从 README 到“dplyr”:

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

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


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

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

【讨论】:

以上是关于tidyr::gather 与 reshape2::melt 矩阵的主要内容,如果未能解决你的问题,请参考以下文章

比较聚集 (tidyr) 和融化 (reshape2)

R语言学习 第十三篇:利用reshape2包重塑数据

透视逆透视:R语言(reshape2tidyverse),Excel,Python

R 根据多个条件获取行 - 使用 dplyr 和 reshape2

R:reshape2 long to wide 用 1 到 3 之间的整数替换实数值

在 reshape2 中使用 min 或 max 时没有非缺失参数警告