必须一个melt
数据框?来自?melt
:
data molten data frame, see melt.
换句话说,在任何acast
或dcast
操作之前,是否必须使数据框熔化?
请考虑以下事项:
library("reshape2")
library("MASS")
xb <- dcast(Cars93, Manufacturer ~ Type, mean, value.var="Price")
m.Cars93 <- melt(Cars93, id.vars=c("Manufacturer", "Type"), measure.vars="Price")
xc <- dcast(m.Cars93, Manufacturer ~ Type, mean, value.var="value")
然后:
> identical(xb, xc)
[1] TRUE
因此,在这种情况下,melt
操作似乎是多余的。
在这些情况下,一般指导规则是什么?在*cast
操作之前,您如何确定数据框何时需要熔化?
答案 0 :(得分:4)
您是否需要melt
数据集取决于您希望最终数据的形式以及与当前数据的关系。
我通常认为的方式是:
dcast
将根据值的组合创建新列。用一个小例子来说明,请考虑这个小数据集:
mydf <- data.frame(
A = c("A", "A", "B", "B", "B"),
B = c("a", "b", "a", "b", "c"),
C = c(1, 1, 2, 2, 3),
D = c(1, 2, 3, 4, 5),
E = c(6, 7, 8, 9, 10)
)
想象一下,我们可能的值变量是列“D”或“E”,但我们只对“E”中的值感兴趣。想象一下,我们的主要“id”是列“A”,我们希望根据列“B”扩展值。此时“C”栏无关紧要。
在这种情况下,我们不需要先melt
数据。我们可以这样做:
library(reshape2)
dcast(mydf, A ~ B, value.var = "E")
# A a b c
# 1 A 6 7 NA
# 2 B 8 9 10
比较执行以下操作时会发生什么,请记住上面的三点:
dcast(mydf, A ~ C, value.var = "E")
dcast(mydf, A ~ B + C, value.var = "E")
dcast(mydf, A + B ~ C, value.var = "E")
何时需要melt
?
现在,让我们对场景进行一次小调整:我们希望将两个列“D”和“E”中的值展开,而不会发生实际的聚合。通过此更改,我们需要首先melt
数据,以便需要分散的相关值位于单个列中(上面的第3点)。
dfL <- melt(mydf, measure.vars = c("D", "E"))
dcast(dfL, A ~ B + variable, value.var = "value")
# A a_D a_E b_D b_E c_D c_E
# 1 A 1 6 2 7 NA NA
# 2 B 3 8 4 9 5 10