tidyr::gather 与矩阵上的 reshape2::melt
tidyr::gather vs. reshape2::melt on matrices
我以一种相当非标准的方式长期使用 reshape2::melt
:我正在 运行 数值实验并得到一个矩阵作为结果。然后我将它熔化并生成一些图像。
受到 reshape2
和 tidyr
之间的 similarity 的启发,我现在正在尝试在 class 矩阵的对象上实现相同的输出。到目前为止没有运气:
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
相同的方式行事吗?是否有任何参数组合可以在 mat
和 mat2
上产生所需的输出?
也许会出现更好的答案,但与此同时,我会将我的评论转换为答案:
引用自述文件 "tidyr":
Note that tidyr is designed for use in conjunction with dplyr, so you should always load both.
... 从 README 到 "dplyr":
dplyr is the next iteration of plyr, focussed on tools for working with data frames (hence the d
in the name).
因此,有点 没有矩阵方法是有意义的。
因为 gather
已经环绕 melt
,如果你真的想要一个 matrix
方法,你可以省去编写自定义函数的时间,只需执行以下操作即可:
gather.matrix <- reshape2:::melt.matrix
我以一种相当非标准的方式长期使用 reshape2::melt
:我正在 运行 数值实验并得到一个矩阵作为结果。然后我将它熔化并生成一些图像。
受到 reshape2
和 tidyr
之间的 similarity 的启发,我现在正在尝试在 class 矩阵的对象上实现相同的输出。到目前为止没有运气:
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
相同的方式行事吗?是否有任何参数组合可以在 mat
和 mat2
上产生所需的输出?
也许会出现更好的答案,但与此同时,我会将我的评论转换为答案:
引用自述文件 "tidyr":
Note that tidyr is designed for use in conjunction with dplyr, so you should always load both.
... 从 README 到 "dplyr":
dplyr is the next iteration of plyr, focussed on tools for working with data frames (hence the
d
in the name).
因此,有点 没有矩阵方法是有意义的。
因为 gather
已经环绕 melt
,如果你真的想要一个 matrix
方法,你可以省去编写自定义函数的时间,只需执行以下操作即可:
gather.matrix <- reshape2:::melt.matrix