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

如何在R语言中依据idx及diff(超14天)进行数据分组?

按idx和日期差规则生成分组编号

需求说明

同一idx分组内,若相邻日期的差值(diff)不超过14天则归为同一分组;若差值超过14天,则划分为新的分组。

初始数据处理代码

idx = c("a","a","a","a","b","b","b","c","c","c","c")
date = c(20201115, 20201116, 20201117, 20201105, 20201107, 20201110, 20210113, 20160930, 20160504, 20160913, 20160927)
group = c("1","1","1","1","2","2","3","4","5","6","6")
df = data.frame(idx,date,group)
df <- df %>% arrange(idx,date)
df$date <- as.Date(as.character(df$date), format='%Y%m%d')
df <- df %>% group_by(idx) %>% 
  mutate(diff = date - lag(date))

解决方案代码

通过标记新分组触发条件,再累积求和生成组内分组号,最后转换为全局唯一分组编号:

library(dplyr)

df <- df %>%
  group_by(idx) %>%
  # 标记需要开启新分组的行:第一行或日期差超过14天
  mutate(new_group = ifelse(is.na(diff) | diff > 14, 1, 0)) %>%
  # 组内累积求和得到组内分组序号
  mutate(group_in_idx = cumsum(new_group)) %>%
  ungroup() %>%
  # 生成全局唯一的分组编号
  mutate(global_group = dense_rank(paste(idx, group_in_idx, sep = "_"))) %>%
  # 对齐示例结果的列名和结构
  select(idx, date, global_group) %>%
  rename(group = global_group)

最终结果

运行后得到的结果与期望一致:

idxdategroup
a2020-11-051
a2020-11-151
a2020-11-161
a2020-11-171
b2020-11-072
b2020-11-102
b2021-01-133
c2016-05-044
c2016-09-135
c2016-09-275
c2016-09-305

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 15:06:22