gpt4 book ai didi

r - 在拥有 `melt` 之前必须先对其进行 `cast` 数据帧吗?

转载 作者:行者123 更新时间:2023-12-02 04:28:30 25 4
gpt4 key购买 nike

必须在转换数据帧之前熔化数据帧吗?来自 ?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. 对于公式的 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)
)

假设我们可能的值变量是“D”或“E”列,但我们只对“E”中的值感兴趣。还想象一下,我们的主“id”是“A”列,我们希望根据“B”列分散值。此时“C”列不相关。

在这种情况下,我们不需要先融化数据。我们可以简单地这样做:

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")

什么时候需要熔化

现在,让我们对场景进行一个小调整:我们希望分散“D”和“E”列中的值,而不发生实际聚合。通过此更改,我们需要首先融化数据,以便需要分散的相关值位于单个列中(上面的第 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

关于r - 在拥有 `melt` 之前必须先对其进行 `cast` 数据帧吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25137444/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com