如何在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
代码逻辑说明
- 分组与排序:先按
id分组,再对每个组内的date排序,确保日期是按时间顺序排列的,避免因乱序导致分组错误。 - 连续判断:用
lag(date)获取上一行的日期,通过%m+% months(1)计算出下一个连续月份的日期,和当前行日期对比,得到is_continuous标记。 - 生成分组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
相关产品推荐
相关产品推荐

