Другой подход может заключаться в группировании строк, которые должны быть объединены для расчета даты начала и окончания.Обратите внимание на столбец flag
перед окончательным оператором group_by
library(dplyr)
library(data.table)
df %>%
arrange(id, strdt) %>%
group_by(id) %>%
mutate(flag = as.numeric(strdt - lag(enddt, order_by = id, default = first(strdt)))) %>%
mutate(flag = rleid(ifelse((flag < 2 & row_number() != 1) | lead(flag, order_by = id, default = 9999) < 2,
9999,
row_number()))) %>% #final grouping happened here
group_by(id, flag) %>%
summarise(strdt = first(strdt),
enddt = last(enddt)) %>%
select(-flag)
Вывод:
id strdt enddt
1 ep01 2017-06-23 2017-06-26
2 ep01 2017-06-28 2017-06-30
3 ep02 2017-05-06 2017-05-10
4 ep02 2017-05-12 2017-05-16
5 ep03 2017-05-15 2017-05-16
6 ep04 2017-05-15 2017-05-17
Пример данных:
df <- structure(list(id = c("ep01", "ep01", "ep01", "ep02", "ep02",
"ep02", "ep03", "ep04"), strdt = structure(c(17340, 17345, 17342,
17292, 17298, 17301, 17301, 17301), class = "Date"), enddt = structure(c(17341,
17347, 17343, 17296, 17300, 17302, 17302, 17303), class = "Date")), .Names = c("id",
"strdt", "enddt"), row.names = c(NA, -8L), class = "data.frame")