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

在R中如何合并多组重叠的日期间隔?附示例与预期结果

R语言合并重叠日期间隔实现

核心逻辑

对同分组(本需求下为id和degree字段)下的记录按开始日期排序后,识别与前序所有间隔都不重叠的新间隔边界,再按新的间隔组聚合,取每组最小开始日期、最大结束日期即可得到合并后的结果。

方法1:基于tidyverse通用实现(无需安装小众依赖包)

需先加载dplyr和lubridate包:

library(dplyr)
library(lubridate)

实现代码:

df_result <- df %>%
  # 指定分组维度,同分组内的间隔才需要合并
  group_by(id, degree) %>%
  # 同分组内按开始日期升序排列
  arrange(start_date, .by_group = TRUE) %>%
  # 生成新间隔分组标记:当前间隔开始日期晚于之前所有间隔的最大结束日期时,记为新的一组
  mutate(interval_group = cumsum(start_date > lag(stop_date, default = first(start_date) - 1))) %>%
  # 按新的间隔分组聚合
  group_by(id, degree, interval_group) %>%
  summarise(
    start_date = min(start_date),
    stop_date = max(stop_date),
    .groups = "drop"
  ) %>%
  # 移除辅助计算的分组标记列
  select(-interval_group)

方法2:基于ivs间隔处理包实现(代码更简洁)

ivs是R生态中专门用于间隔数据处理的包,内置了间隔合并的封装方法:

# 首次使用需先安装:install.packages("ivs")
library(ivs)
library(dplyr)

df_result <- df %>%
  group_by(id, degree) %>%
  summarise(
    interval = iv_groups(iv(start_date, stop_date)),
    .groups = "drop"
  ) %>%
  # 拆分合并后的间隔为开始、结束日期列
  mutate(
    start_date = iv_start(interval),
    stop_date = iv_end(interval)
  ) %>%
  select(-interval)

两种方法输出结果均与需求预期完全一致:

> df_result
# A tibble: 2 × 4
     id degree start_date stop_date 
  <dbl>  <dbl> <date>     <date>    
1     1      2 2010-01-20 2010-02-10
2     1      2 2010-03-20 2010-04-30

内容的提问来源于stack exchange,提问作者rachel3765

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 00:48:02