如何在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,完全匹配你的示例预期。
思路说明
- 标记新分段:用
lag()函数获取上一行的ID值,判断当前行是否是新分段的起点(上一行是2、当前行是1)。 - 计算计数器:对新分段的标记做累积求和,再加1,确保第一个分段的计数器从1开始,每完成一个以2结尾的分段,后续计数器自动递增。
内容的提问来源于stack exchange,提问作者Alexander
相关产品推荐
相关产品推荐

