Ho un dataframe in questo formato
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
Voglio che il dataframe risultante assomigli.
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
Tale che se ci sono meno di 7 giorni tra unData di fine e una Data di inizio successiva per un account, verranno uniti in uno e utilizzare la Data di fine dell'ultimo record e la data di inizio del precedente record.
Ho sperimentato il raggruppamento con Lead e Lag con dplyr ma non funzionerebbe per account con 3 o più record.
Nell'esempio,
L'ID account 1 è un caso in cui sarebbe risolto con il raggruppamento per accountID e il limite massimo, min, funzionerebbe
ma l'ID account 2 è un caso in cui ciò non funzionerebbe.
Qualsiasi aiuto è molto apprezzato.
risposte:
2 per risposta № 1I tuoi dati:
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)
Puoi usare lag
dopo il raggruppamento:
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