必须先“融化”一个数据框,然后才能“投射”它吗?

lan*_*oni 2 r dataframe reshape2

必须一个melt之前具有将其转换的数据帧?来自?melt

data    molten data frame, see melt.
Run Code Online (Sandbox Code Playgroud)

换句话说,是否绝对有必要在任何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")
Run Code Online (Sandbox Code Playgroud)

然后:

> identical(xb, xc)
[1] TRUE
Run Code Online (Sandbox Code Playgroud)

所以在这种情况下,melt操作似乎是多余的。

在这些情况下,一般的指导规则是什么?您如何决定何时需要在*cast操作前熔化数据框?

A5C*_*2T1 5

您是否需要melt数据集取决于您希望最终数据采用什么形式以及它与您当前拥有的数据有何关系。

我一般的想法是:

  1. 对于公式的 LHS,我应该有一列或多列将成为我的“id”行。这些将在最终输出中保留为单独的列。
  2. 对于公式的 RHS,我应该有一个或多个列组合起来形成新的列,我将在其中“传播”我的值。当这多于一列时,dcast将根据值的组合创建新列。
  3. 我必须只有一列可以提供值以填充由这些行和列创建的结果“网格”。

为了用一个小例子来说明,考虑这个小数据集:

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)
)
Run Code Online (Sandbox Code Playgroud)

假设我们可能的值变量是“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
Run Code Online (Sandbox Code Playgroud)

比较当你执行以下操作时会发生什么,记住我上面的三点:

dcast(mydf, A ~ C, value.var = "E")
dcast(mydf, A ~ B + C, value.var = "E")
dcast(mydf, A + B ~ C, value.var = "E")
Run Code Online (Sandbox Code Playgroud)

什么时候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
Run Code Online (Sandbox Code Playgroud)