请考虑以下代码:
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获得第一个结果吗?
答案 0 :(得分:11)
基本原因是methods
有不同的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
命令。