首页 > 解决方案 > 将 dplyr 与 group_by 一起使用并使用分类变量进行过滤

问题描述

对 R 来说非常新。我有一个基于文本的大型 df,我想执行一些检查。我想检查一个向量中的哪些变量(“颜色”)有两个不同的变量(“a”和“b”)在另一个向量中。这应该是 AND 而不是 OR 类型的查询。df 看起来像这样

数据

structure(list(colour = c("blue", "blue", "red", "red", "red", 
"purple", "purple"), letter = c("a", "c", "a", "m", "b", "a", 
"b")), class = "data.frame", row.names = c(NA, -7L))

colour letter
blue   a
blue   c
red    a
red    m
red    b
purple a
purple b

我认为最好的方法是通过子集,这样我得到一个带有相关数据的新 df ('df2'),它应该如下所示:

colour letter
red    a
red    b
purple a
purple b

我尝试了以下 dplyr 命令,但没有得到正确的结果('blue a' 仍然存在)。

df2<-df%>%group_by(colour)%>%filter(letter %in% c('a','b'))

我会很感激我能得到的任何帮助!

标签: rdplyr

解决方案


letter %in% c('a', 'b')检查每个字母以查看它是否在集合 { a, b} 中(也就是说,它将为每个字母返回 truea b),并保留它们。您要做的是检查组中是否同时存在aa和b中的 a:

df %>% 
  group_by(colour) %>% 
  filter('a' %in% letter & 'b' %in% letter)

## or, if you have more than a couple letters (maybe a vector of letters)
df %>% 
  group_by(colour) %>% 
  filter(all(c('a', 'b') %in% letter))

从您的文本或示例中不清楚如果一个组包含 , 和另一个字母,比如 ,应该a发生b什么c。只要其中有一个a和一个b,上面的代码就会保留整个组。

如果您只想保留组的ab字母(如果有更多),请保留您拥有的过滤条件:

... filter(all(c('a', 'b') %in% letter), letter %in% c('a', 'b'))

如果您只想保留有而没有其他字母的组ab那么我会这样做:

... filter(all(c('a', 'b') %in% letter) & n_distinct(letter) == 2)
## another alternative
... filter(all(c('a', 'b') %in% letter) & all(letter %in% c('a', 'b')))

推荐阅读