10

考虑以下代码:

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

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

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 获得第一个结果吗?

4

1 回答 1

16

根本原因就是methodsfor的不同melt,你可以通过运行看到methods("melt")。其中大部分都可以通过reshape2:::melt.matrix或访问reshape2:::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,因此如评论中所述,要使用该方法获得相同的结果data.frame,您必须将它们添加到melt命令中。

于 2014-03-08T04:22:56.717 回答