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

分组变化时重置起始日期的组内时长计算需求

解决连续分组的时长计算问题

要实现当分组(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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 07:22:56