/ / dplyr warunkowe daty grupowania - r, ramka danych, dplyr

dplyr daty grupowania warunkowego - r, ramka danych, dplyr

Mam ramkę danych w tym formacie

Account ID, Start Date, End Date
1   , 2016-01-01, 2016-02-01
1   , 2016-02-02, 2016-03-01
1   , 2016-03-01, 2016-04-01
2   , 2016-01-01, 2016-02-01
2   , 2016-03-02, 2016-03-20
2   , 2016-03-21, 2016-04-01

Chcę, aby wynikowa ramka danych wyglądała.

Account ID, Start Date, End Date
1   , 2016-01-01, 2016-04-01
2   , 2016-01-01, 2016-02-01
2   , 2016-03-02, 2016-04-01

Taki, że jeśli jest mniej niż 7 dni międzyData zakończenia i kolejna data rozpoczęcia dla konta, scalą je w jedną i wykorzystają datę końcową ostatniego rekordu i datę początkową poprzedniego rekordu.

"Eksperymentowałem z DFIDr na grupowanie z leadem i lagiem, ale to nie działałoby dla kont z 3 lub więcej rekordami.

W tym przykładzie

Identyfikator konta 1 to przypadek, w którym zostałby rozwiązany poprzez grupowanie według identyfikatora konta, a maksymalna, min. Działałaby

ale Account ID 2 to przypadek, w którym to nie zadziała.

Każda pomoc jest na prawdę doceniana.

Odpowiedzi:

2 dla odpowiedzi № 1

Twoje dane:

dat <- read.table(text = "AccountID StartDate  EndDate
1         2016-01-01 2016-02-01
1         2016-02-02 2016-03-01
1         2016-03-01 2016-04-01
2         2016-01-01 2016-02-01
2         2016-03-02 2016-03-20
2         2016-03-21 2016-04-01", header = TRUE, stringsAsFactors = FALSE)
dat[2:3] <- lapply(dat[2:3], as.Date)

Możesz użyć lag po grupowaniu:

library(dplyr)
group_by(dat, AccountID) %>%
mutate(
week = cumsum(StartDate - lag(EndDate, default = 0) > 7)
) %>%
group_by(AccountID, week) %>%
summarize(
StartDate = min(StartDate),
EndDate = max(EndDate)
) %>%
ungroup()
# # A tibble: 3 × 4
#   AccountID  week  StartDate    EndDate
#       <int> <int>     <date>     <date>
# 1         1     1 2016-01-01 2016-04-01
# 2         2     1 2016-01-01 2016-02-01
# 3         2     2 2016-03-02 2016-04-01