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

在R中按ID合并无市政ID变更的日期区间

在R中合并连续相同市政ID的日期区间方案

可以用dplyr包快速实现这个需求,核心思路是对每个用户(id)的连续相同市政ID(municipality_id)进行分组,然后合并对应的日期区间:

步骤1:加载依赖包

library(dplyr)

步骤2:处理数据

data_processed <- data %>%
  group_by(id) %>%
  # 为连续相同的municipality_id生成分组标记
  mutate(group_id = cumsum(municipality_id != lag(municipality_id, default = first(municipality_id)))) %>%
  # 按id、市政ID和分组标记聚合
  group_by(id, municipality_id, group_id) %>%
  summarise(
    from = min(from),
    to = max(to),
    .groups = "drop"
  ) %>%
  # 移除临时分组列
  select(-group_id)

验证结果

执行以下代码可以确认处理后的数据与目标数据一致:

all.equal(data_processed, data_edit)
# 输出 TRUE 表示结果匹配

原始数据与目标数据定义

原始数据

data <- data.frame(id = c('A', 'A', 'B', 'B','B', 'B', 'C', 'C', 'C'),
                   municipality_id = c(820, 200, 820, 820, 830, 830, 700, 500, 700),
                   from = as.Date(c("2007-01-01", "2007-03-01", "2007-01-01", "2007-04-01", "2007-06-01", "2008-02-01", "2007-01-01", "2007-06-01", "2009-01-01")),
                   to = as.Date(c("2007-02-28", "2100-01-01", "2007-03-31", "2007-05-31", "2008-01-31", "2100-01-01", "2007-05-31", "2008-12-31", "2100-01-01"))) 

目标数据

data_edit <- data.frame(id = c('A', 'A', 'B', 'B', 'C', 'C', 'C'),
                   municipality_id = c(820, 200, 820, 830, 700, 500, 700),
                   from = as.Date(c("2007-01-01", "2007-03-01", "2007-01-01", "2007-06-01", "2007-01-01", "2007-06-01", "2009-01-01")),
                   to = as.Date(c("2007-02-28", "2100-01-01", "2007-05-31", "2100-01-01", "2007-05-31", "2008-12-31", "2100-01-01"))) 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 19:50:23