/ / dplyr date di raggruppamento condizionale - r, dataframe, dplyr

dplyr date di raggruppamento condizionale - r, dataframe, dplyr

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

I 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