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

如何在R中添加列标记连续日期的分组

解决方案

针对你的需求,我们可以用dplyr结合lubridate实现高效的分组标记,逻辑清晰且适配大型数据框:

完整代码

library(dplyr)
library(lubridate)

# 构建示例数据
data <- data.frame(
  id = c('TEC', 'TEC', 'TEC', 'TEC', 'FIL', 'FIL', 'FIL'),
  date = c('2009-10', '2009-11', '2009-12', '2010-04', '2000-05', '2006-10', '2006-11')
)

data$date <- ym(data$date)
set.seed(123)  
data$re <- sample(1:100, nrow(data), replace = TRUE)

# 生成连续月份分组编号
data <- data %>%
  group_by(id) %>%
  arrange(date) %>%  # 确保组内日期有序,这一步是关键前提
  mutate(
    # 判断当前日期与上一行日期是否为连续月份
    is_continuous = date == lag(date) %m+% months(1),
    # 累加不连续的次数,生成分组ID
    group_id = cumsum(!is.na(is_continuous) & !is_continuous) + 1
  ) %>%
  ungroup()

# 处理每组第一行的NA值,默认归为第1组
data$group_id[is.na(data$is_continuous)] <- 1

代码逻辑说明

  1. 分组与排序:先按id分组,再对每个组内的date排序,确保日期是按时间顺序排列的,避免因乱序导致分组错误。
  2. 连续判断:用lag(date)获取上一行的日期,通过%m+% months(1)计算出下一个连续月份的日期,和当前行日期对比,得到is_continuous标记。
  3. 生成分组ID:用cumsum对“不连续”的情况(!is_continuous)进行累加,每出现一次不连续,分组编号就加1;最后将每组第一行的NA值修正为1。

输出结果

运行代码后,你会得到符合预期的分组标记:

# A tibble: 7 × 5
  id    date           re is_continuous group_id
  <chr> <date>      <int> <lgl>            <dbl>
1 TEC   2009-10-01    30 NA                   1
2 TEC   2009-11-01    78 TRUE                 1
3 TEC   2009-12-01    50 TRUE                 1
4 TEC   2010-04-01    13 FALSE                2
5 FIL   2000-05-01    66 NA                   1
6 FIL   2006-10-01    42 FALSE                2
7 FIL   2006-11-01    5 TRUE                  2

这个方案采用向量化操作,处理大型数据框时性能优异,无需循环即可完成分组标记。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 21:46:20