在 R 中创建连续的连续周期

问题描述 投票:0回答:1

鉴于此数据框:

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)
  )

但这需要第一个最小日期和最后一个最大日期,并忽略中间的任何中断。关于如何实现这一目标有什么建议吗?

r dplyr
1个回答
0
投票
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)
© www.soinside.com 2019 - 2024. All rights reserved.