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

如何在R中基于行值条件创建分段计数器?(dplyr)

问题分析

你的需求是每当一段数据以ID=2结尾时,后续分段的计数器自动递增,但之前用cumsum(ID==2)的思路会把每个ID=2都算作一次递增,导致计数器增长过快,和预期不符。下面是符合需求的解决方案:


解决方案代码

library(dplyr)

# 你的示例数据
df <- data.frame(ID = c(rep(rep(seq(1:2),each=2),times=2)),gr=rep(c("A"),each=8))

# 实现分段计数器逻辑
df %>%
  group_by(gr) %>%
  mutate(
    # 标记新分段的起始行:当前行是1且上一行是2,说明进入新分段
    start_new = lag(ID, default = 0) == 2 & ID == 1,
    # 计数器 = 新分段累积数 + 1(保证第一个分段从1开始)
    counter = cumsum(start_new) + 1
  ) %>%
  select(-start_new)  # 移除中间标记列

运行结果

# A tibble: 8 × 3
# Groups:   gr [1]
     ID gr   counter
  <int> <chr>   <dbl>
1     1 A           1
2     1 A           1
3     2 A           1
4     2 A           1
5     1 A           2
6     1 A           2
7     2 A           2
8     2 A           2

如果后续再添加一组1,1,2,2的数据,计数器会自动变为3,完全匹配你的示例预期。


思路说明

  1. 标记新分段:用lag()函数获取上一行的ID值,判断当前行是否是新分段的起点(上一行是2、当前行是1)。
  2. 计算计数器:对新分段的标记做累积求和,再加1,确保第一个分段的计数器从1开始,每完成一个以2结尾的分段,后续计数器自动递增。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:31:47