Подсчет последовательных предыдущих дат по группе - PullRequest
2 голосов
/ 04 марта 2020

Мой пример data.frame (формат даты d / m / y), записывающий даты, когда клиент был активен:

customer    date 
1           10/1/20
1           9/1/20 
1           6/1/20
2           10/1/20
2           8/1/20
2           7/1/20
2           6/1/20

Я хотел бы сделать столбец "n_consecutive_days" примерно так:

customer    date    n_consecutive_days
1           10/1/20  2
1           9/1/20   1
1           6/1/20   N/A
2           10/1/20  1
2           8/1/20   3
2           7/1/20   2
2           6/1/20   N/A

В новом столбце подсчитывается количество предыдущих последовательных дат на одного клиента. Мне бы хотелось, чтобы первое свидание клиента было не применимо, поскольку нет смысла говорить о предыдущих днях подряд, если оно первое.

Любая помощь будет принята с благодарностью. Я могу рассчитать разницу между датами, но не количество последовательных дней, как хотелось бы.

Ответы [ 2 ]

2 голосов
/ 04 марта 2020

Один из способов будет:

library(dplyr)

df %>%
  group_by(customer, idx = cumsum(as.integer(c(0, diff(as.Date(date, '%d/%m/%y')))) != -1)) %>%
  mutate(n_consecutive_days = rev(sequence(n()))) %>% ungroup() %>%
  group_by(customer) %>%
  mutate(n_consecutive_days = replace(n_consecutive_days, row_number() == n(), NA), idx = NULL)

Вывод:

# A tibble: 7 x 3
# Groups:   customer [2]
  customer date    n_consecutive_days
     <int> <fct>                <int>
1        1 10/1/20                  2
2        1 9/1/20                   1
3        1 6/1/20                  NA
4        2 10/1/20                  1
5        2 8/1/20                   3
6        2 7/1/20                   2
7        2 6/1/20                  NA
1 голос
/ 05 марта 2020

Опция с использованием data.table:

#ensure that data is sorted by customer and reverse chronological
setorder(DT, customer, -date)

#group by customer and consecutive dates and then create the sequence
DT[, ncd := .N:1L, .(customer, cumsum(c(0L, diff(date)!=-1L)))]

#set the first date in each customer to NA
DT[DT[, .I[.N], customer]$V1, ncd := NA]

Выход:

   customer       date ncd
1:        1 2020-01-10   2
2:        1 2020-01-09   1
3:        1 2020-01-06  NA
4:        2 2020-01-10   1
5:        2 2020-01-08   3
6:        2 2020-01-07   2
7:        2 2020-01-06  NA

данные:

library(data.table)
DT <- fread("customer    date 
1           10/1/20
1           9/1/20 
1           6/1/20
2           10/1/20
2           8/1/20
2           7/1/20
2           6/1/20")
DT[, date := as.IDate(date, format="%d/%m/%y")]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...