将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)。