【问题标题】:Groupwise rollsum: How to add cumsum for partitioned data (window?)Groupwise rollsum:如何为分区数据添加 cumsum(窗口?)
【发布时间】:2018-09-28 21:42:47
【问题描述】:

评论:

R: cumulative sum over rolling date range

Consecutive/Rolling sums in a vector in R

R dplyr rolling sum

https://cran.r-project.org/web/packages/RcppRoll/RcppRoll.pdf

显然有几个选项可以在一系列列上使用 rollapply。

我有一个数据框,其中包含按月分组的客户数据,示例:

 year_month customer_id             revenue
 2018-01-01    1821148               0.00
 2018-01-01    142163579             0.00
 2018-01-01    16295983              0.00
 2018-02-01    1821148               86.57
 2018-02-01    142163579             191.21
 2018-02-01    16295983              0.00
 2018-03-01    1821148               98.18
 2018-03-01    142163579             47.61
 2018-03-01    16295983              241.88

我的问题是,我如何才能仅对每个客户使用 rollapply(例如 RcppRoll::roll_sum() 或任何类似功能)?即使我按 customer_id 和 year_month 排序我的数据,rollapply 也不会知道返回,例如仅针对特定客户滚动 3 个月。

例如最后第三次观察是针对 3 月份的客户 1821148。在这种情况下,我想要这个特定客户在 1 月:3 月的 cumsum。

即使我按客户 ID 和 year_month 进行订购,如果客户的第一次观察结果是其他客户的,那么他们的前 3 行数据也会相加。

有没有办法对特定分组进行汇总,在这种情况下是 customer_id?

【问题讨论】:

  • 您应该查看 dplyrDT 包,这两个包都是专门设计用于以简洁的方式容纳这些类型的组感知操作方式。

标签: r


【解决方案1】:

这是另一个利用.by_group = TRUEdplyr 选项

library(dplyr)
df %>% 
  group_by(customer_id) %>%
  arrange(year_month, .by_group = TRUE) %>%
  mutate(rolling_sum = cumsum(revenue))
# output
# A tibble: 9 x 4
# Groups:   customer_id [3]
  year_month customer_id revenue rolling_sum
       <chr>       <int>   <dbl>       <dbl>
1 2018-01-01     1821148    0.00        0.00
2 2018-02-01     1821148   86.57       86.57
3 2018-03-01     1821148   98.18      184.75
4 2018-01-01    16295983    0.00        0.00
5 2018-02-01    16295983    0.00        0.00
6 2018-03-01    16295983  241.88      241.88
7 2018-01-01   142163579    0.00        0.00
8 2018-02-01   142163579  191.21      191.21
9 2018-03-01   142163579   47.61      238.82

【讨论】:

  • 有趣。 .by_group = T 在做什么?
  • .by_group = TRUE 添加到arrange() 允许我们在每个组内对year_month 进行排序(customer_id)
【解决方案2】:

这两个怎么样?

# data.table
library(data.table)
setDT(dat)
dat[, rolling_sum := cumsum(revenue), by=customer_id]

# dplyr
library(dplyr)
dat %>% group_by(customer_id) %>% mutate(rolling_sum = cumsum(revenue))

如果这些不是您要查找的结果,可以编辑问题以指定预期结果。

   year_month customer_id revenue rolling_sum
1: 2018-01-01     1821148    0.00        0.00
2: 2018-01-01   142163579    0.00        0.00
3: 2018-01-01    16295983    0.00        0.00
4: 2018-02-01     1821148   86.57       86.57
5: 2018-02-01   142163579  191.21      191.21
6: 2018-02-01    16295983    0.00        0.00
7: 2018-03-01     1821148   98.18      184.75
8: 2018-03-01   142163579   47.61      238.82
9: 2018-03-01    16295983  241.88      241.88

(这是我读取数据的方式)

dat <- 
  read.table(header = T, sep=',', text=
"year_month,customer_id,revenue
2018-01-01,1821148,0.00
2018-01-01,142163579,0.00
2018-01-01,16295983,0.00
2018-02-01,1821148,86.57
2018-02-01,142163579,191.21
2018-02-01,16295983,0.00
2018-03-01,1821148,98.18
2018-03-01,142163579,47.61
2018-03-01,16295983,241.88")

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2019-05-16
    • 2010-12-18
    • 2018-07-05
    • 1970-01-01
    • 2021-04-28
    相关资源
    最近更新 更多