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
的解决方案,但欢迎任何解决方案!
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