【问题标题】:Cumsum w/ panel data: different start dates带有面板数据的 Cumsum:不同的开始日期
【发布时间】:2019-04-30 14:11:54
【问题描述】:

试图在不同类型的合同中找到 cumsum。每个都有一个唯一的停止(即交货)日期,在该日期之前有几个月的预期交货时间。需要计算实际交货日期之前所有预期交货的累计。

由于某种原因,cumsum/rollsum 函数无法正常工作。我尝试过 DT 和 dplyr 版本,但都失败了。

这是我正在处理的问题的简化数据。

df <- data.frame(report_year = c(rep(2017,10), rep(2018,10)), 
       report_month = c(seq(1,5,1), seq(2,6,1), seq(3,7,1), seq(2,6,1)),
       delivery_year = c(rep(2017,10), rep(2018,10)), 
       delivery_month = c(rep(5,5),rep(6,5), rep(7,5), rep(6,5)),
       sum = c(rep(seq(100,500,100), 4)),
       cumsum = c(rep(c(100,300,600,1000,1500),4)))

前 5 列是我目前拥有的。

我正在尝试获取最后一列(即 cumsum)

我可能做错了什么。任何帮助表示赞赏。

【问题讨论】:

  • library(data.table); setDT(df)[, cumsum2 := cumsum(sum), by = .(report_year, delivery_month)][]
  • 谢谢@markus。但是,此解决方案仅在仅限于给定年份时才有效。如果滞后跨越多年,它就不起作用
  • 嘿,EDennnis,记得接受并回答,以便人们知道您的问题已得到解决。
  • @EsbenEickhardt 如果我想接受的答案在评论中,我该如何接受?我愿意接受 markus 的评论,这就是我支持它的原因
  • 那么你不能,必须要求那个人发布它作为答案。

标签: r cumsum


【解决方案1】:

该问题没有具体定义要使用哪些分组列,因此可能必须根据您的需要稍微修改,但这没有任何包:

df$cumsum <- NULL  # remove the result from df shown in question
transform(df, cumsum = ave(sum, delivery_year, delivery_month, FUN = cumsum))

请注意,尽管上述方法有效,但由于与同名函数混淆,使用 sumcumsum 作为列名可能会遇到一些问题,因此您可能希望使用 Sum 和 Cumsum。例如,如果您没有像我们上面那样清空 cumsum,那么 FUN = cumsum 会认为您要应用不是函数的 cumsum 列。

【讨论】:

    【解决方案2】:

    使用 arrangemutate

    # Import library
    library(dplyr)
    
    # Calculating cumsum
    df %>%
      group_by(delivery_year, delivery_month) %>%
      arrange(sum) %>% 
      mutate(cs = cumsum(sum))
    

    输出

       report_year report_month delivery_year delivery_month   sum cumsum    cs
             <dbl>        <dbl>         <dbl>          <dbl> <dbl>  <dbl> <dbl>
     1        2017            1          2017              5   100    100   100
     2        2017            2          2017              6   100    100   100
     3        2018            3          2018              7   100    100   100
     4        2018            2          2018              6   100    100   100
     5        2017            2          2017              5   200    300   300
     6        2017            3          2017              6   200    300   300
     7        2018            4          2018              7   200    300   300
    

    【讨论】:

      猜你喜欢
      • 2021-07-14
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      相关资源
      最近更新 更多