在使用'cast`之前,必须先“熔化”一个数据帧吗?

时间:2014-08-05 11:14:32

标签: r dataframe reshape2

在进行投射之前,

必须一个melt数据框?来自?melt

data    molten data frame, see melt.

换句话说,在任何acastdcast操作之前,是否必须使数据框熔化?

请考虑以下事项:

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操作之前,您如何确定数据框何时需要熔化?

1 个答案:

答案 0 :(得分:4)

您是否需要melt数据集取决于您希望最终数据的形式以及与当前数据的关系。

我通常认为的方式是:

  1. 对于公式的LHS,我应该有一个或多个列将成为我的“id”行。这些将在最终输出中保留为单独的列。
  2. 对于公式的RHS,我应该有一个或多个列组合起来形成新列,我将在其中“传播”我的值。如果这是多列,dcast将根据值的组合创建新列。
  3. 我必须 只有一列 ,它会提供值以填充由这些行和列创建的结果“网格”。
  4. 用一个小例子来说明,请考虑这个小数据集:

    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