Групповая прокрутка: как добавить константу для секционированных данных (окно?) - PullRequest
0 голосов
/ 29 сентября 2018

Пересмотрено:

R: накопленная сумма в диапазоне дат проката

Последовательные / скользящие суммы в векторе в R

R dplyr скользящая сумма

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 месяца подряд только для конкретного клиента.

Например, третье последнее наблюдение относится к клиенту 1821148 в марте.В этом случае я бы хотел, чтобы сумма по данному конкретному клиенту была указана в январе: марте.

Даже если я сделаю заказ по идентификатору клиента, то year_month, первое наблюдение для клиента будет суммировать предыдущие 3 строки, если они для другогоcustomer.

Существует ли способ прокрутки для определенной группы, в данном случае customer_id?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Вот еще один вариант 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
0 голосов
/ 29 сентября 2018

Как насчет любого из них?

# 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")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...