使用带有矩阵或data.frame的融合提供不同的输出

时间:2014-03-08 03:45:03

标签: r matrix dataframe reshape2 melt

请考虑以下代码:

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

1 个答案:

答案 0 :(得分:11)

基本原因是methods有不同的melt,您可以通过运行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,因此正如评论中所述,为了使用data.frame方法获得相同的结果,您将拥有将它们添加到melt命令。