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
基本原因是有不同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
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命令中.