Как сгруппировать с условием в R? - PullRequest
0 голосов
/ 28 июня 2019

У меня есть таблица с customer_ID и date_reward, и я рассчитываю получить количество групп вознаграждений, отправленных customer_ID, при условии, что в каждой группе будут отправляться только награды с перерывом в 60 дней. Если разница между двумя датами для customer_ID больше 60, то это должна быть отдельная группа для того же самого customer_ID.

Например,

customer_ID  date_reward
CD3859          3/3/2017
CD3859          4/3/2017
CD3859          7/14/2017
CD3859          8/2/2017
CD1190          1/2/2017
CD1190          2/28/2017
CD1190          3/15/2017
CD4457          5/5/2017
CD4457          6/15/2017
CD4457          7/2/2017
CD4457          9/30/2017
CD4457          10/30/2017
CD4457          1/15/2018
CD4457          4/7/2018

Вывод может иметь несколько строк для одного и того же customer_ID, если даты находятся на расстоянии более 60 дней.

Ожидаемый результат:

customer_ID group_count
CD3859          2
CD3859          2
CD1190          3
CD4457          3
CD4457          2
CD4457          1
CD4457          1

1 Ответ

1 голос
/ 28 июня 2019

Вот решение dplyr.Это приводит к другому порядку customer_ID, я думаю, что b / c dplyr сортирует группы по умолчанию, не был уверен, стоило ли это пересортировать в конце.

library(dplyr)
df %>%
  mutate(date_reward = as.Date(date_reward, "%m/%d/%Y")) %>%
  group_by(customer_ID) %>%
  arrange(date_reward) %>%
  mutate(grp = cumsum(date_reward - lag(date_reward, default = 0) >= 60)) %>%
  ungroup() %>%
  count(customer_ID, grp)

# A tibble: 7 x 3
  customer_ID   grp     n
  <chr>       <int> <int>
1 CD1190          1     3
2 CD3859          1     2
3 CD3859          2     2
4 CD4457          1     3
5 CD4457          2     2
6 CD4457          3     1
7 CD4457          4     1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...