【问题标题】:How to aggregating data conditional on other criteria [duplicate]如何根据其他条件聚合数据[重复]
【发布时间】:2019-06-17 05:45:15
【问题描述】:

我有一个名为 sales 的数据框。

我想按通用标识符 ID 汇总每个月的销售额。

我发现困难的是如何在有返回值的情况下执行此操作。

例如,当我对 ID 2 的 sales_Feb1980 求和时,应该只包括有回报的观察结果,而应该忽略没有回报的观察结果?

数据是什么样子的。我还有更多的行和列。

   id    name  Returns_jan1980 Returns_feb1980 Sales_Jan1980 Sales_Feb1980   
  2b    LA         4.7%            5.6%             100              100
  2b    LA         5.7%                             250              100
  2b    LA         6.3%            5.8%             50               100
  5a    NY                         5.6%             30               200
  5a    NY         5.7%            3.6%             50               100

正确的输出

  id   name Sales_Jan1980 Sales_Jan19080   
  2       LA     400          200        
  5       NY     50           300   

感谢任何帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    使用基数 R,我们可以首先找出 "Returns""Sales" 列,假设它们的顺序正确,我们可以在它们对应的 "Sales" 列中将空的 "Return" 列变为 0,然后使用 @987654325 @ 分组idName 并采取sum

    return_cols <- grep("^Returns", names(df))
    sales_cols <- grep("^Sales", names(df))    
    
    df[sales_cols][df[return_cols] == ""] <- 0
    aggregate(cbind(Sales_Jan1980, Sales_Feb1980)~id + name, df, sum)
    
    #  id name Sales_Jan1980 Sales_Feb1980
    #1 2b   LA           400           200
    #2 5a   NY            50           300
    

    【讨论】:

      【解决方案2】:

      dplyrtidyr 的一种可能性可能是:

      df %>%
       rowid_to_column() %>%
       gather(var, val, -c(id, rowid, name)) %>%
       arrange(rowid, sub(".*_", "", var)) %>%
       group_by(rowid) %>%
       mutate(val = ifelse(is.na(lag(val, default = first(val))), NA, val)) %>%
       ungroup() %>%
       spread(var, val) %>%
       group_by(id, name) %>%
       summarise_at(vars(starts_with("Sales")), sum, na.rm = TRUE)
      
        id    name  Sales_Feb1980 Sales_Jan1980
        <chr> <chr>         <dbl>         <dbl>
      1 2b    LA              200           400
      2 5a    NY              300            50
      

      它根据Returns 列中的值将Sales 列中的值设置为NA,然后执行求和。

      【讨论】:

        猜你喜欢
        • 2021-12-01
        • 2020-07-04
        • 2023-03-09
        • 2019-02-11
        • 1970-01-01
        • 2018-10-26
        • 1970-01-01
        • 2020-06-14
        • 1970-01-01
        相关资源
        最近更新 更多