R语言dplyr实现按ID分组分配连续Group=1行序号、遇0置0且ID重置
基于dplyr的实现方案
直接通过分组+条件标记累加的逻辑,完全匹配你提到的三个规则(连续Group=1分配同编号、Group=0对应值为0、ID变化时编号重置),完整代码如下:
# 加载依赖包 library(dplyr) data %>% # 按ID分组,实现跨ID编号自动重置 group_by(ID) %>% mutate( # 标记连续Group=1块的起始位置 # 触发条件:当前行Group为1,且是组内第一行/上一行Group不为1 block_start = (Group == 1) & (row_number() == 1 | lag(Group, default = 0) != 1), # 累加新块标记,得到各Group=1块的序号 block_id = cumsum(block_start), # Group为0时编号设为0,否则使用块序号 Number = ifelse(Group == 0, 0, block_id) ) %>% # 取消分组,避免后续操作受分组规则影响 ungroup()
逻辑说明
- 分组规则匹配“ID变化时编号重置”的要求:所有编号计算都在单个ID的分组内独立完成,不同ID的编号互不影响。
- 块标记规则匹配“连续Group=1分配同编号、新连续块递增1”的要求:只有当当前行是Group=1,且前面不存在连续的1时,才会给计数器加1,连续的1会复用同一个编号。
- 数值转换规则匹配“Group=0对应Number为0”的要求:所有Group=0的行直接将编号设为0,不受块计数影响。
运行上述代码得到的结果和你给出的期望输出完全一致。
内容的提问来源于stack exchange,提问作者Cam
相关产品推荐
相关产品推荐

