鉴于此数据框:
library(tidyverse)
library(lubridate)
df <- tribble(
~person, ~start, ~end,
'1', '2000-01-01', '2000-12-31',
'1', '2001-01-01', '2002-07-31',
'1', '2001-04-01', '2001-06-30',
'1', '2001-08-01', '2001-12-31',
'1', '2002-01-01', '2002-12-31',
'2', '2000-01-01', '2000-11-30',
'2', '2001-01-01', '2001-12-31') |>
mutate(start = lubridate::as_date(start),
end = lubridate::as_date(end))
我正在尝试生成输出来显示:
person start end
1 2000-01-01 2002-12-31
2 2000-01-01 2001-11-30
2 2001-01-01 2001-12-31
这些数据具有重叠的日期,因此我尝试创建一组连续且没有间隔的开始日期和结束日期。
我试过这个
df |>
distinct() |>
arrange(person, start, end) |>
mutate(
gap = start - lag(end, default = min(start))
) |>
group_by(person) |>
summarise(
MIN_START = min(start),
MAX_END = max(end)
)
但这需要第一个最小日期和最后一个最大日期,并忽略中间的任何中断。关于如何实现这一目标有什么建议吗?
df |>
mutate(grp = cumsum(!(start - lag(end)) %in% c(NA, 1)), .by = person) |>
summarize(start = min(start), end = max(end), .by = c(person, grp)) |>
select(-grp)