已审核:
R: cumulative sum over rolling date range
Consecutive/Rolling sums in a vector in R
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月的总和。
即使我按客户ID然后按year_month进行订购,如果一个客户的第一个观察值将与其他客户的前3行加起来。
是否有一种方法可以对特定分组(在这种情况下为customer_id)进行汇总?
答案 0 :(得分:1)
这两个怎么样?
# 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")
答案 1 :(得分:1)
这是利用dplyr
的另一个.by_group = TRUE
选项
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