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 № 1Twoje 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