将melt与矩阵或data.frame一起使用会产生不同的输出

将melt与矩阵或data.frame一起使用会产生不同的输出,r,matrix,dataframe,reshape2,melt,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(

考虑以下代码:

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

基本原因是
melt
有不同的
方法,您可以通过运行
方法(“melt”)
看到这些方法。其中大部分都可以通过,例如,
restrape2:::melt.matrix
restrape2:::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

N是的,但我发现奇怪的是,相同的矩阵/data.frame给出了不同的结果,我还无法找出原因。我编辑了值,而不是使用set.seed(1)。