基于object_id拆分group_id并生成递增subgroup_id的实现方法
生成全局递增的subgroup_id解决方案
需求说明
- 数据以
id唯一标识,按sub_id和group_id分组 - 需生成
subgroup_id列:- 同一
group_id内不同object_id对应不同的subgroup_id subgroup_id为全局无限递增序列- 每个
subgroup_id仅属于一个group_id
- 同一
原始数据
library(tidyverse) df <- tibble(id = c(1:11), sub_id = c(1,2,1,2,3,4,3,4,5,6,6), group_id = c(rep(1,4),rep(3,4),5,6,6), object_id = c(1,1,2,2,2,2,3,3,2,2,3))
期望输出
# A tibble: 11 × 5 id sub_id group_id subgroup_id object_id <int> <dbl> <dbl> <dbl> <dbl> 1 1 1 1 1 1 2 2 2 1 1 1 3 3 1 1 2 2 4 4 2 1 2 2 5 5 3 3 3 2 6 6 4 3 3 2 7 7 3 3 4 3 8 8 4 3 4 3 9 9 5 5 5 2 10 10 6 6 6 2 11 11 6 6 7 3
实现代码
利用dplyr的分组功能和cur_group_id()函数,直接为每个group_id与object_id的唯一组合分配全局递增的序号:
df_processed <- df %>% group_by(group_id, object_id) %>% mutate(subgroup_id = cur_group_id()) %>% ungroup() # 查看结果 print(df_processed)
代码说明
group_by(group_id, object_id):按group_id和object_id的唯一组合分组,确保同一组合内的行共享同一个subgroup_idcur_group_id():为每个唯一分组分配一个全局递增的整数ID,顺序与分组在数据中首次出现的顺序一致ungroup():取消分组状态,恢复普通数据框格式
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

