如何用dplyr将分组列中特定值出现后的所有值置0?
使用dplyr实现分组内修改数据的方法
可以通过dplyr的分组操作结合行号判断来实现需求:按id分组后,找到每个组内第一个出现值2的位置,将该位置之后的所有x值设为0,其余值保持不变。
实现代码
library(dplyr) # 处理数据 test_modified <- test %>% group_by(id) %>% mutate( # 标记每个组中第一个出现2的行号,无2则为NA first_2_pos = which(x == 2)[1], # 对第一个2之后的行,将x设为0;无2的组保持原x x = ifelse(!is.na(first_2_pos) & row_number() > first_2_pos, 0, x) ) %>% select(-first_2_pos) %>% # 移除临时变量 ungroup() # 取消分组
代码说明
group_by(id):按id对数据分组,确保每个组内独立处理first_2_pos = which(x == 2)[1]:提取每个组中第一个值为2的行的位置,若组内没有2,该值为NAifelse(...):判断当前行是否在第一个2之后,若是则将x设为0;组内无2时,条件不触发,保留原x值select(-first_2_pos):删除临时创建的first_2_pos列,保持数据结构整洁ungroup():取消分组,将数据还原为普通数据框
验证结果
以id=1为例,处理后的数据如下:
test_modified %>% filter(id == 1) # id x # 1 1 0 # 2 1 1 # 3 1 1 # 4 1 2 # 5 1 0
可以看到第一个2之后的x值已被设为0,符合需求。
内容的提问来源于stack exchange,提问作者LucaS
相关产品推荐
相关产品推荐

