R:使用多对多映射根据另一列过滤一列

R: Filter one column based on another with many to many mapping

我有一个包含 ID 列和项目列的数据集。 ID 映射到一个或多个项目。数据集的每个项目都有一行映射到一个 ID。我想要 return 个包含 my_items 的 ID。项目的顺序无关紧要。我在下面有一个玩具示例。

ID <- c(1, 1, 1, 2, 2, 2, 2, 3, 3, 4, 5, 5, 5)
item <- c("a", "b", "c", "a", "b", "c", "d", "a", "b", "d", "b", "a", "c")
df <- data.frame(cbind(ID, item))
df

my_items <- c("a", "b", "c")

我的预期输出将仅包含项目 ID 1 和 5。

我们可以在使用 %in% 创建逻辑向量并按 'ID' 分组后使用 all,还可以使用 n_distinct

创建条件
library(dplyr)
df %>% 
   group_by(ID) %>% 
   filter(all(my_items %in% item), n_distinct(item) == 3) %>%
   ungroup

-输出

# A tibble: 6 × 2
     ID item 
  <dbl> <chr>
1     1 a    
2     1 b    
3     1 c    
4     5 b    
5     5 a    
6     5 c   
df %>% 
  group_by(ID) %>%
  filter(setequal(item,my_items))

输出

  ID    item 
  <chr> <chr>
1 1     a    
2 1     b    
3 1     c    
4 5     b    
5 5     a    
6 5     c  

如果我们添加arrange,我们也可以在这种情况下使用identical

library(dplyr)

  df %>% 
    group_by(ID) %>%
    arrange(item, .by_group = TRUE) %>% 
    filter(identical(item,my_items))
  ID    item 
  <chr> <chr>
1 1     a    
2 1     b    
3 1     c    
4 5     a    
5 5     b    
6 5     c