基于dplyr实现分组成员ID的混合分配(同组同/异ID)
分组成员ID分配(dplyr实现)
需求说明
- 指定部分组(如示例中的
Group2):组内每个成员分配独立的全局唯一ID - 其余组:组内所有成员共用同一个全局唯一ID
原始数据
data <- data.frame( Group = c("Group1", "Group1", "Group2", "Group2", "Group2", "Group3", "Group3", "Group4", "Group4", "Group4"), Member = c("Alice", "Bob", "Charlie", "David", "Eve", "Frank", "Grace", "Helen", "Ivy", "John") )
目标效果
data <- data.frame( Group = c("Group1", "Group1", "Group2", "Group2", "Group2", "Group3", "Group3", "Group4", "Group4", "Group4"), Member = c("Alice", "Bob", "Charlie", "David", "Eve", "Frank", "Grace", "Helen", "Ivy", "John"), ID = c(1,1,2,3,4,5,5,6,6,6) )
解决方案代码
使用dplyr的mutate()结合case_when()实现,可手动指定需要独立ID的组:
library(dplyr) # 手动指定需要分配独立ID的组 independent_groups <- c("Group2") data_with_id <- data %>% mutate( # 给每个组分配连续的全局基础ID group_base_id = dense_rank(Group), ID = case_when( # 指定组内成员:用组基础ID + 组内行号-1生成独立唯一ID Group %in% independent_groups ~ group_base_id + row_number() - 1, # 其余组直接复用组基础ID TRUE ~ group_base_id ) ) %>% # 移除中间辅助列(可选操作) select(-group_base_id)
代码逻辑解释
dense_rank(Group):为每个不同的组分配连续的全局唯一组ID(如Group1=1、Group2=2、Group3=3、Group4=4)case_when()分支处理:- 属于指定独立组的成员,通过组基础ID叠加组内行号偏移量,生成组内唯一的全局ID
- 非指定组的成员直接使用组基础ID,实现组内ID统一
- 可选移除辅助列
group_base_id,得到最终目标数据
内容的提问来源于stack exchange,提问作者Grum
相关产品推荐
相关产品推荐

