#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