Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 必须先“融化”一个数据帧,然后再“转换”它吗?_R_Dataframe_Reshape2 - Fatal编程技术网

R 必须先“融化”一个数据帧,然后再“转换”它吗?

R 必须先“融化”一个数据帧,然后再“转换”它吗?,r,dataframe,reshape2,R,Dataframe,Reshape2,必须一个熔化一个数据帧才能进行铸造?从?熔化: 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

必须一个
熔化
一个数据帧才能进行铸造?从
?熔化

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")
因此在这种情况下,
melt
操作似乎是多余的


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

您是否需要融化数据集取决于您希望最终数据采用何种形式,以及与当前数据的关系

我通常的想法是:

  • 对于公式的LHS,我应该有一个或多个列将成为我的“id”行。这些将作为单独的列保留在最终输出中
  • 对于公式的RHS,我应该有一个或多个列,这些列组合起来形成新的列,在这些列中,我将“分散”我的值。当这是多个列时,
    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)
    )
    
    请记住以上三点,比较执行以下操作时发生的情况:

    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”列中的值。有了此更改,我们需要首先熔化数据,以便需要分散的相关值位于单个列中(上文第3点)


    dfL只要现有的数据已经是长格式的,我看不出在铸造之前一般需要将其熔化。非常感谢您的详细解释。如果我理解正确,最后的
    melt
    操作假定
    c(“D”,“E”)
    本质上是相同的,即它们是完全相同的度量值,分布在不同的组中,并在两个不同的列中注册。@landroni,它们不一定是相同的度量值,但至少是相同的数据类型(例如,所有数字,而不是逻辑、字符或其他),您希望对其执行相同类型的聚合。关于您的另一个问题的说明可能会对此主题有更多的说明。事实上,度量值可以不同(但应为相同的数据类型),尽管在我看来,这个示例指出了
    acast
    /
    dcast
    运行方式中的某种基本刚性,如果您打算将它们用于透视表的话。
    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")
    
    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