R语言dplyr实现外层分组内子组按顺序从1重置统一编号
实现方法
你需要的组内顺序编号逻辑可以直接通过dplyr分组匹配实现,不需要硬编码任何item值,自动适配每个pmid组内的item数量与出现顺序。
library(dplyr) result <- dft %>% group_by(pmid) %>% mutate(id = match(item, unique(item))) %>% ungroup()
逻辑说明
- 仅按外层
pmid字段分组,保证所有编号计算在单个pmid组内独立执行,不会跨pmid累计编号 unique(item)会按照item在当前pmid组内的首次出现顺序,返回去重后的item向量match(item, unique(item))逐行匹配当前行item在去重向量中的位置,天然生成从1开始的连续序号,同一item的所有行匹配结果完全一致,满足同item同编号的要求
效果验证
运行代码后输出与你预期完全一致,前50行结果如下:
pmid item id <chr> <chr> <int> 1 33044756 Age 1 2 33044756 Age 1 3 33044756 Age 1 4 33044756 Age 1 5 33044756 Age 1 6 33044756 Age 1 7 33044756 BMI 2 8 33044756 BMI 2 9 33044756 BMI 2 10 33044756 BMI 2 11 34297066 Age 1 12 34297066 Age 1 13 34297066 Age 1 14 34297066 Age 1 15 34297066 BMI 2 16 34297066 BMI 2 17 34297066 BMI 2 18 34297066 BMI 2 19 34297066 Duration of disease 3 20 34297066 Duration of disease 3 21 34498056 Age 1 22 34498056 Age 1 23 34498056 Age 1 24 34498056 Age 1 25 34498056 Age 1 26 34498056 Age 1 27 34498056 BMI 2 28 34498056 BMI 2 29 34498056 BMI 2 30 34498056 BMI 2 31 34748096 Age 1 32 34748096 Age 1 33 34748096 Age 1 34 34748096 Age 1 35 34748096 BMI 2 36 34748096 BMI 2 37 34748096 BMI 2 38 34748096 BMI 2 39 34748096 Duration of disease 3 40 34748096 Duration of disease 3 41 34815219 BMI 1 42 34815219 BMI 1 43 34815219 BMI 1 44 34815219 BMI 1 45 34815219 PtGA 2 46 34815219 PtGA 2 47 34815219 PtGA 2 48 34815219 PtGA 2 49 34815219 SF36 3 50 34815219 SF36 3
等价写法
如果习惯用cur_group_id()函数,也可以通过嵌套分组实现相同效果,注意分组顺序:
result <- dft %>% group_by(pmid) %>% group_by(id = cur_group_id(), .add = TRUE) %>% mutate(id = cur_group_id()) %>% ungroup()
该写法不需要依赖match函数,输出结果与上述写法完全一致,但代码可读性略低。
内容的提问来源于stack exchange,提问作者Michael Putman
相关产品推荐
相关产品推荐

