如何在保留最具包容性的组的同时获得两个分区之间的交集?

问题描述 投票:0回答:1
 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

我有一些像这样的数据集,我想获得分区 1 和 2 之间的“并集”和“交集”。要获得“并集”非常简单,我通过使用

cur_group_id()
做到了。问题在于“交叉点”,我希望它成为第 1 部分和第 2 部分之间最具包容性的组。我已经使用
if_else()
尝试了一些解决方案,它们在某些情况下有效,但不是全部,因为有时最具包容性的组位于第 1 部分,有时位于第 2 部分,这使得更难进入单一解决方案。

例如:part1中的“2”对应part2中的“3”、“4”和“5”。因此,就我的目的而言,“2”是最具包容性的组,因为它包含“3”、“4”和“5”。第 2 部分中的“12”也是如此,对应第 1 部分中的“8”、“9”、“10”和“11”。

虽然我更喜欢使用

dplyr
的解决方案,但欢迎任何解决方案!

r dplyr tidyverse data-wrangling
1个回答
0
投票
df |>
  count(part1, part2) |>
  add_count(part1, name = "part1_n") |>
  add_count(part2, name = "part2_n") |>
  filter(part1_n == max(part1_n) | part2_n == max(part2_n))

输出显示第 1 部分和第 2 部分“最具包容性”的行:

# A tibble: 7 × 5
  part1 part2     n part1_n part2_n
  <dbl> <dbl> <int>   <int>   <int>
1     2     3     1       3       1
2     2     4    11       3       1
3     2     5    10       3       1
4     8    12    13       1       4
5     9    12     7       1       4
6    10    12    16       1       4
7    11    12    42       1       4
© www.soinside.com 2019 - 2024. All rights reserved.