R: Как рассчитать скорости между наблюдениями по группам?

#r #dplyr

#r #dplyr

Вопрос:

Допустим, у нас есть фрейм данных, подобный следующему:

 cohort month customers
Jan    01    523
Jan    02    332
Jan    03    221
Jan    04    190
Feb    02    489
Feb    03    310
Feb    04    205
Mar    03    372
Mar    04    192
Apr    04    340
  

Моя цель — создать совершенно новый столбец, в котором хранится коэффициент удержания для каждой когорты. Для этого мне нужно было бы подсчитать, сколько клиентов осталось за последний месяц (04), связанных с общим количеством клиентов, впервые присоединившихся к каждой когорте.

Я стремлюсь dplyr создать две таблицы, которые выглядели бы так, как показано ниже:

Один вычисляет текущий коэффициент удержания для каждой когорты:

 cohort  rr
Jan     0.36
Feb     0.42
Mar     0.52
  

И, возможно, самый важный, другой, который мог бы дать мне эволюцию RR на ежемесячной основе, как показано ниже:

 cohort month customers period rr
Jan    01    523       0     1
Jan    02    332       1     0.63
Jan    03    221       2     0.42
Jan    04    190       3     0.36
Feb    02    489       0     1
Feb    03    310       1     0.63
Feb    04    205       2     0.42
Mar    03    372       0     1
Mar    04    192       1     0.52
Apr    04    340       0     1
  

Ответ №1:

Одним dplyr из вариантов может быть:

 df %>%
 group_by(cohort) %>%
 mutate(period = 1:n() - 1,
        rr = customers/first(customers))

  cohort month customers period    rr
   <chr>  <int>     <int>  <dbl> <dbl>
 1 Jan        1       523      0 1    
 2 Jan        2       332      1 0.635
 3 Jan        3       221      2 0.423
 4 Jan        4       190      3 0.363
 5 Feb        2       489      0 1    
 6 Feb        3       310      1 0.634
 7 Feb        4       205      2 0.419
 8 Mar        3       372      0 1    
 9 Mar        4       192      1 0.516
10 Apr        4       340      0 1    
  

Для второй таблицы:

 df %>%
 group_by(cohort) %>%
 summarise(rr = last(customers)/first(customers))

  cohort    rr
  <chr>  <dbl>
1 Apr    1    
2 Feb    0.419
3 Jan    0.363
4 Mar    0.516
  

Ответ №2:

Работает ли это:

 df %>% group_by(cohort) %>% summarise(rr = sum(customers[n()])/customers[1])
`summarise()` ungrouping output (override with `.groups` argument)
# A tibble: 4 x 2
  cohort    rr
  <chr>  <dbl>
1 Apr    1    
2 Feb    0.419
3 Jan    0.363
4 Mar    0.516
  

Для второго, другой дубль:

 df %>% group_by(cohort) %>% mutate(period = 0:(n()-1), rr = customers/customers[1])
# A tibble: 10 x 5
# Groups:   cohort [4]
   cohort month customers period    rr
   <chr>  <chr>     <dbl>  <int> <dbl>
 1 Jan    01          523      0 1    
 2 Jan    02          332      1 0.635
 3 Jan    03          221      2 0.423
 4 Jan    04          190      3 0.363
 5 Feb    02          489      0 1    
 6 Feb    03          310      1 0.634
 7 Feb    04          205      2 0.419
 8 Mar    03          372      0 1    
 9 Mar    04          192      1 0.516
10 Apr    04          340      0 1