分组变化时重置起始日期的组内时长计算需求
解决连续分组的时长计算问题
要实现当分组(group1+group2组合)变化时重置起始日期,计算每组连续时段的首尾日期时长,可以用dplyr包完成,步骤如下:
- 识别连续分组块:对比当前行与上一行的
group1和group2组合,生成分组标识(block_id),每次组合变化时标识递增 - 按分组块聚合:对每个
block_id,计算首尾日期的差值并加1天(包含首尾日期),最后格式化时长文本
完整代码
library(dplyr) df <- data.frame(mdate = c(as.Date('2023-01-01'), as.Date('2023-01-01'), as.Date('2023-01-02'), as.Date('2023-01-08'), as.Date('2023-01-09'), as.Date('2023-01-10'), as.Date('2023-01-10'), as.Date('2023-01-11'), as.Date('2023-01-12'), as.Date('2023-01-13')), group1 = c('A', rep('B',3),rep('A',2), rep('B',4)), group2 = c('C', rep('D',3),rep('E',2), rep('D',4))) result <- df %>% # 创建分组组合列,用于判断连续块 mutate(group_comb = paste(group1, group2, sep = "-")) %>% # 生成连续块ID:当前行组合与上一行不同时,ID+1 mutate(block_id = cumsum(group_comb != lag(group_comb, default = first(group_comb)))) %>% # 按块ID分组计算时长 group_by(block_id, group1, group2) %>% summarise( duration = paste(max(mdate) - min(mdate) + 1, "day", ifelse(max(mdate) - min(mdate) + 1 > 1, "s", "")), .groups = "drop" ) %>% # 移除block_id列,保留目标结果 select(group1, group2, duration) print(result)
运行结果
# A tibble: 4 × 3 group1 group2 duration <chr> <chr> <chr> 1 A C 1 day 2 B D 8 days 3 A E 2 days 4 B D 4 days
结果完全匹配期望输出,核心逻辑是通过cumsum和lag函数识别连续分组块,确保每次分组变化时重新计算时长。
内容的提问来源于stack exchange,提问作者IziBizi
相关产品推荐
相关产品推荐

