You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在R中对存在重叠(含容错间隔)的时间范围行分组?

服务周期重叠/间隔≤1天的人员分组问题

现有人员接受服务的记录数据,包含字段:

  • personid:人员ID
  • streamid:服务类型ID
  • datetimestart:服务开始日期
  • datetimeend:服务结束日期(服务进行中则为缺失值)

需要按人员分组,将服务周期重叠或前后间隔不超过1天的记录归为同一组。下方测试数据已手动标注目标分组(targetgroup字段):

library(tidyverse)
test <-  type_convert(tribble(
  ~personid, ~streamid, ~datetimestart, ~datetimeend, ~targetgroup,
          1,         1,   "2023-01-01", "2023-01-05",            1,
          1,         2,   "2023-01-07", "2023-01-30",            2,
                    
          2,         2,   "2023-12-01", NA_character_,           1, 
          2,         1,   "2024-01-12", "2024-01-30",            1,
          2,         3,   "2024-02-10", "2024-02-28",            1,
          2,         1,   "2024-02-25", NA_character_,           1,
                    
          3,         3,   "2023-12-01", "2024-01-14",            1, 
          3,         2,   "2024-01-12", "2024-01-30",            1,
          3,         1,   "2024-01-10", "2024-02-01",            1,
                    
          4,         3,   "2023-12-01", "2024-01-14",            1, 
          4,         2,   "2024-01-12", "2024-01-20",            1,
          4,         1,   "2024-01-21", NA_character_,           1
  
))
#>
#> ── 列规格说明 ────────────────────────────────────────────────────────
#> cols(
#>   datetimestart = col_date(format = ""),
#>   datetimeend = col_date(format = "")
#> )

我尝试使用lag或coalesce函数实现分组,但对于personid=2这类非按开始日期排序但服务周期存在重叠的情况,无法得到正确结果。以下是目前的最优实现代码及结果:

test %>% 
  arrange(personid, datetimestart) %>%
  group_by(personid) %>%
  mutate(new_episode_group = datetimestart - lag(datetimeend) > days(1),
         new_episode_group = if_else(is.na(new_episode_group), FALSE, new_episode_group),
         group = cumsum(new_episode_group) + 1) %>% 
  select(-new_episode_group)
#> # A tibble: 12 × 6
#> # Groups:   personid [4]
#>    personid streamid datetimestart datetimeend targetgroup group
#>       <dbl>    <dbl> <date>        <date>            <dbl> <dbl>
#>  1        1        1 2023-01-01    2023-01-05            1     1
#>  2        1        2 2023-01-07    2023-01-30            2     2
#>  3        2        2 2023-12-01    NA                    1     1
#>  4        2        1 2024-01-12    2024-01-30            1     1
#>  5        2        3 2024-02-10    2024-02-28            1     2
#>  6        2        1 2024-02-25    NA                    1     2
#>  7        3        3 2023-12-01    2024-01-14            1     1
#>  8        3        1 2024-01-10    2024-02-01            1     1
#>  9        3        2 2024-01-12    2024-01-30            1     1
#> 10        4        3 2023-12-01    2024-01-14            1     1
#> 11        4        2 2024-01-12    2024-01-20            1     1
#> 12        4        1 2024-01-21    NA                    1     1

内容的提问来源于Stack Exchange,提问作者Mathew Ling

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 11:37:43