【问题标题】:Using melt with matrix or data.frame gives different output使用带有 matrix 或 data.frame 的 melt 会产生不同的输出
【发布时间】:2014-04-11 11:09:27
【问题描述】:

考虑以下代码:

set.seed(1)
M = matrix(rnorm(9), ncol = 3)
dimnames(M) = list(LETTERS[1:3], LETTERS[1:3])

print(M)
           A          B         C
A -0.6264538  1.5952808 0.4874291
B  0.1836433  0.3295078 0.7383247
C -0.8356286 -0.8204684 0.5757814

melt(M)

  Var1 Var2      value
1    A    A -0.6264538
2    B    A  0.1836433
3    C    A -0.8356286
4    A    B  1.5952808
5    B    B  0.3295078
6    C    B -0.8204684
7    A    C  0.4874291
8    B    C  0.7383247
9    C    C  0.5757814

如果我使用data.frame 调用melt,我会得到不同的结果:

DF = data.frame(M)

melt(DF)

  variable      value
1        A -0.6264538
2        A  0.1836433
3        A -0.8356286
4        B  1.5952808
5        B  0.3295078
6        B -0.8204684
7        C  0.4874291
8        C  0.7383247
9        C  0.5757814

我发现文档对此有点困惑,所以任何人都可以帮助我理解这种行为吗?我可以使用 data.frame 获得第一个结果吗?

【问题讨论】:

  • 是的,但我觉得奇怪的是,相同的 matrix/data.frame 给出了不同的结果,我还不知道原因。
  • 我编辑了值,而不是使用 set.seed(1)。

标签: r matrix dataframe reshape2 melt


【解决方案1】:

基本原因是meltmethods不同,运行methods("melt")可以看到。其中大部分都可以通过reshape2:::melt.matrixreshape2:::melt.data.frame 访问,这可以让您继续寻找结果不同的确切原因。

但是,总结一下你会发现,基本上,melt.matrix 最终会做类似的事情:

cbind(expand.grid(dimnames(M)), value = as.vector(M))
#   Var1 Var2      value
# 1    A    A -0.6264538
# 2    B    A  0.1836433
# 3    C    A -0.8356286
# 4    A    B  1.5952808
# 5    B    B  0.3295078
# 6    C    B -0.8204684
# 7    A    C  0.4874291
# 8    B    C  0.7383247
# 9    C    C  0.5757814

...而melt.data.frame 最终会做这样的事情:

N <- data.frame(M)
data.frame(var1 = rep(names(N), each = nrow(N)), value = unlist(unname(N)))
#   var1      value
# 1    A -0.6264538
# 2    A  0.1836433
# 3    A -0.8356286
# 4    B  1.5952808
# 5    B  0.3295078
# 6    B -0.8204684
# 7    C  0.4874291
# 8    C  0.7383247
# 9    C  0.5757814

当然,实际的函数会做更多的错误检查,旨在让您方便地指定应该融合哪些列等等。

请注意,data.frame 方法不使用 rownames,因此如 cmets 中所述,要使用 data.frame 方法获得相同的结果,您必须将它们添加到melt 命令。

【讨论】:

    猜你喜欢
    • 2013-08-06
    • 2016-02-01
    • 2014-05-06
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多