【问题标题】:summarize multiple dynamic columns and store results in new columns汇总多个动态列并将结果存储在新列中
【发布时间】:2018-04-28 16:46:50
【问题描述】:

我有以下情况。

    df <- rbind(
  data.frame(thisDate = rep(seq(as.Date("2018-1-1"), as.Date("2018-1-2"), by="day")) ),
  data.frame(thisDate = rep(seq(as.Date("2018-2-1"), as.Date("2018-2-2"), by="day")) ))
df <- cbind(df,lastMonth = as.Date(format(as.Date(df$thisDate - months(1)),"%Y-%m-01")))
df <- cbind(df, prod1Quantity= seq(1:4) )

我在一个月的不同日子有数量未知的产品数量。我希望每个产品都有 1 列,其中包含该产品上个月的每月总数量。所以输出会是这样的.. 即按 lastMonth, Prod1Quantity 分组。如果这确实是正确的方法,我只是不知道如何动态分组、变异和总结。

我遇到了data.table generate multiple columns and summarize them。我认为它似乎可以满足我的需要 - 但我就是不明白它是如何工作的!

期望的输出


   thisDate  lastMonth prod1Quantity prod1prevMonth
1 2018-01-01 2017-12-01             1             NA
2 2018-01-02 2017-12-01             2             NA
3 2018-02-01 2018-01-01             3              3
4 2018-02-02 2018-01-01             4              3

【问题讨论】:

    标签: r dynamic multiple-columns


    【解决方案1】:

    另一种方法可能是

    library(dplyr)
    library(lubridate)
    
    temp_df <- df %>%
      mutate(thisDate_forJoin = as.Date(format(thisDate,"%Y-%m-01"))) 
    
    final_df <- temp_df %>%
      mutate(thisDate_forJoin = thisDate_forJoin %m-% months(1)) %>%
      left_join(temp_df %>%
                  group_by(thisDate_forJoin) %>%
                  summarise_if(is.numeric, sum), 
                by="thisDate_forJoin") %>%
      select(-thisDate_forJoin)
    

    输出为:

        thisDate prod1Quantity.x prod2Quantity.x prod1Quantity.y prod2Quantity.y
    1 2018-01-01               1              10              NA              NA
    2 2018-01-02               2              11              NA              NA
    3 2018-02-01               3              12               3              21
    4 2018-02-02               4              13               3              21
    

    样本数据:

    df <- structure(list(thisDate = structure(c(17532, 17533, 17563, 17564
    ), class = "Date"), prod1Quantity = 1:4, prod2Quantity = 10:13), class = "data.frame", row.names = c(NA, 
    -4L))
    #    thisDate prod1Quantity prod2Quantity
    #1 2018-01-01             1            10
    #2 2018-01-02             2            11
    #3 2018-02-01             3            12
    #4 2018-02-02             4            13
    

    【讨论】:

      【解决方案2】:

      可以通过计算每月的生产数量然后加入monthlastMonththisDate 来达成解决方案。

      lubridate::month 函数已用于评估从日期开始的月份。

      library(dplyr)
      library(lubridate)
      df %>% group_by(month = as.integer(month(thisDate))) %>%
        summarise(prodQuantMonth = sum(prod1Quantity)) %>%
        right_join(., mutate(df, prevMonth = month(lastMonth)), by=c("month" = "prevMonth")) %>%
        select(thisDate, lastMonth, prod1Quantity, prodQuantLastMonth = prodQuantMonth)
      
      # # A tibble: 4 x 4
      #   thisDate   lastMonth  prod1Quantity prodQuantLastMonth
      #   <date>     <date>             <int>              <int>
      # 1 2018-01-01 2017-12-01             1                 NA
      # 2 2018-01-02 2017-12-01             2                 NA
      # 3 2018-02-01 2018-01-01             3                  3
      # 4 2018-02-02 2018-01-01             4                  3
      

      【讨论】:

      • 谢谢!我现在将尝试将其扩展到动态数量的产品,如 prod1Quantity、prod2Quantity 等。再次感谢您。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 1970-01-01
      • 2017-07-16
      相关资源
      最近更新 更多