如何在R中按mid分组重新编号intersection/group_indices的结果?
解决R中按分组重新编号location字段的问题
我太懂这种被分组编号问题卡壳的滋味了!刚好你的需求很清晰:按mid分组,把location里的非零值替换成连续的编号,零值保持不变,同时还要保留原有非零值的出现顺序和对应关系。下面用两种常用的方法帮你搞定:
方法一:用dplyr的row_number()精准定位
这种方法逻辑直观,先在分组内筛选出非零的行,给它们按出现顺序分配编号,零值直接保留:
# 加载dplyr包(如果没安装先运行install.packages("dplyr")) library(dplyr) # 你的示例数据 t <- data.frame( mid=c(102,102,102,102,102,102,102,103,103,103,103,103,103,103), aid=c(10201,10202,10203,10204,10205,10206,10207,10301,10302,10303,10304,10305,10306,10307), dummy=c(0,1,0,1,0,1,0,0,1,0,1,0,1,0), location=c(0,2,0,4,0,1,0,0,2,0,2,0,3,0) ) # 生成新的编号列 t_updated <- t %>% group_by(mid) %>% mutate( location_new = case_when( location != 0 ~ row_number()[location != 0], # 给非零行按顺序编1、2、3... TRUE ~ 0 # 零值保持0 ) ) %>% ungroup() # 查看结果 print(t_updated)
方法二:用cumsum()累加计数(更简洁)
如果追求代码简洁,用累计求和的思路也能实现——每遇到一个非零值就累加1,零值位置直接返回0:
t_updated <- t %>% group_by(mid) %>% mutate( location_new = ifelse(location != 0, cumsum(location != 0), 0) ) %>% ungroup()
结果验证
处理后的数据里,location_new列就是你要的效果:
- 对
mid=102的组,原来的非零值(2、4、1)会被替换成1、2、3,顺序完全和原数据一致; - 对
mid=103的组,原来的非零值(2、2、3)会被替换成1、2、3,同样保留了出现顺序。
内容的提问来源于stack exchange,提问作者HSJ
相关产品推荐
相关产品推荐

