如何获取两个分区的交集并保留最具包容性的分组?
解决方案:获取part1与part2的最具包容性分组
问题背景
我有若干如下格式的数据集,希望获取分区part1与part2的“并集”和“交集”。用cur_group_id()获取“并集”操作简单,但获取“交集”存在问题——我需要让交集为part1和part2中最具包容性的分组。曾尝试用if_else()解决,但仅在部分场景生效,因为最具包容性的分组有时在part1中,有时在part2中,难以用单一方案实现。
示例场景:
part1中的“2”对应part2中的“3”“4”“5”,因此“2”是更具包容性的分组;part2中的“12”对应part1中的“8”“9”“10”“11”,因此“12”是更具包容性的分组。
优先希望用dplyr实现,其他有效方案也可接受!
示例数据
library(tidyverse) df <- tibble(labels= paste0("specimen", 1:158), part1= rep(c(1:12), c(6, 22, 11, 24, 6, 5, 3, 13, 7, 16, 42, 3)), part2= rep(c(1:13), c(2, 4, 1, 11, 10, 11, 2, 22, 6, 5, 3, 78, 3))) df %>% group_by(part1, part2) %>% mutate(union= cur_group_id()) #> # A tibble: 158 × 4 #> # Groups: part1, part2 [16] #> labels part1 part2 union #> <chr> <int> <int> <int> #> 1 specimen1 1 1 1 #> 2 specimen2 1 1 1 #> 3 specimen3 1 2 2 #> 4 specimen4 1 2 2 #> 5 specimen5 1 2 2 #> 6 specimen6 1 2 2 #> 7 specimen7 2 3 3 #> 8 specimen8 2 4 4 #> 9 specimen9 2 4 4 #> 10 specimen10 2 4 4 #> # ℹ 148 more rows
2023-12-08 创建,使用reprex v2.0.2
解决方案代码
核心思路是先统计每个part1关联的不同part2数量、每个part2关联的不同part1数量,再通过数量对比判断哪个分组更具包容性:
library(tidyverse) # 1. 统计每个part1/part2的关联类别数量 part1_assoc <- df %>% distinct(part1, part2) %>% count(part1, name = "part2_count") part2_assoc <- df %>% distinct(part1, part2) %>% count(part2, name = "part1_count") # 2. 合并数据并判断最具包容性分组 df_final <- df %>% # 关联统计数据 left_join(part1_assoc, by = "part1") %>% left_join(part2_assoc, by = "part2") %>% # 生成并集ID(原需求) group_by(part1, part2) %>% mutate(union_id = cur_group_id()) %>% ungroup() %>% # 判断最具包容性分组 mutate( inclusive_group = case_when( part2_count > part1_count ~ str_c("part1_", part1), part1_count > part2_count ~ str_c("part2_", part2), # 数量相同时可自定义规则,示例优先选择part1 TRUE ~ str_c("part1_", part1) ) ) %>% # 给包容性分组生成统一ID group_by(inclusive_group) %>% mutate(inclusive_id = cur_group_id()) %>% ungroup() %>% # 按需选择输出列 select(labels, part1, part2, union_id, inclusive_group, inclusive_id) # 查看结果片段 slice_head(df_final, n = 15)
结果说明
- 对于
part1=2的样本,其关联的part2有3个类别,远多于每个对应part2关联的part1数量(均为1),因此inclusive_group会标记为part1_2; - 对于
part2=12的样本,其关联的part1有4个类别,多于每个对应part1关联的part2数量,因此inclusive_group会标记为part2_12; inclusive_id是给每个最具包容性分组分配的唯一数字ID,方便后续分组操作。
内容的提问来源于stack exchange,提问作者Pedro Bittencourt
相关产品推荐
相关产品推荐

