首页 > 解决方案 > 在 R 中过滤组(子集)内的内容

问题描述

我有这个数据。

group   name
  1     A
  1     A
  1     A
  1     B
  1     C
  2     A
  2     B
  3     A
  3     B
  3     C
  3     D

我想用标准过滤组。例如,我想过滤 {A, B, C} 中的组。

组 1 将被过滤,因为 {A, B, C}(组 1 的唯一组合)在 {A, B, C} 中。

组 2 将被过滤,因为 {A, B} 在 {A, B, C}

但是,组 3 不会被过滤,因为 {A, B, C, D} 不是 {A, B, C} 的子集。

我应该如何处理这个问题?此外,我有更多的标准(即 {A, B, C} 和 {A, C} ...)。

structure(list(group = c(1, 1, 1, 1, 1, 2, 2, 3, 3, 3, 3), 
               name = c("A",  "A", "A", "B", "C", "A", "B", "A", "B", "C", "D")), 
               row.names= c(NA, -11L), class = c("tbl_df", "tbl", "data.frame"))

标签: rfilter

解决方案


我们可以指定标准向量并做一个group_by filter

stdvec <- c("A", "B", "C")
library(dplyr)
df1 %>%
     group_by(group) %>%
     filter(all(unique(name) %in% stdvec))

及其相反

df1 %>% 
   group_by(group) %>% 
   filter(!all(unique(name) %in% stdvec))

如果有更多的向量,它可能是

stdvec1 <- c("A", "B", "C") 
stdvec2 <- c("A", "C") 
df1 %>%
    group_by(group) %>% 
    filter(all(stdvec2 %in% name) & all(stdvec1 %in% name))

及其相反

df1 %>%
   group_by(group) %>% 
   filter(!(all(stdvec2 %in% name) & all(stdvec1 %in% name)))

或者它可能是union多个向量中的一个,与unique'name' 的值相比,并检查是否all包含(和 negate !

df1 %>%
   group_by(group) %>%
   filter(!all(unique(name) %in% union(stdvec1, stdvec2)))

 df1 %>% 
   group_by(group) %>% 
   filter(all(unique(name) %in% union(stdvec1, stdvec2)))

如果有很多vectors,请使用reducetounion

library(purrr)
nm1 <- mget(ls(pattern = "^stdvec\\d+$")) %>%
               reduce(union) 
df1 %>%
         group_by(group) %>%
         filter(all(unique(name) %in%  nm1))

推荐阅读