You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取两个分区的交集并保留最具包容性的分组?

解决方案:获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 17:47:05