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

Fer*_*ndo 7 r matrix dataframe melt reshape2

请考虑以下代码:

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
Run Code Online (Sandbox Code Playgroud)

如果我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
Run Code Online (Sandbox Code Playgroud)

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

A5C*_*2T1 13

基本原因是有不同methodsmelt,你可以通过跑步看到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
Run Code Online (Sandbox Code Playgroud)

...虽然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
Run Code Online (Sandbox Code Playgroud)

当然,实际的功能会进行更多的错误检查,并且可以方便地指定哪些列应该被熔化等等.

请注意,该data.frame方法不会使用rownames,因为在注释中提到,要使用该data.frame方法获得相同的结果,您必须将它们添加到melt命令中.