【问题标题】:Using dplyr with group_by and filter with categorical variable将 dplyr 与 group_by 一起使用并使用分类变量进行过滤
【发布时间】:2020-08-20 15:00:06
【问题描述】:

对 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'))

如果能得到任何帮助,我将不胜感激!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    letter %in% c('a', 'b') 检查每个字母 以查看它是否在集合 {a, b} 中(也就是说,对于每个 a 的字母,它将返回 true b),并保留它们。您要做的是检查组中是否有a组中的b

    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))
    
    

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

    如果您只想保留组的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')))
    

    【讨论】:

    • 非常感谢!这正是我一直在努力解决的问题——使用 %in% 表示 and 而不是 or。事实上,我的意图是排除任何其他字母,所以我再次在“过滤器”括号内添加了原始条件,并且 - 嘿!它有效!
    • 很高兴听到它有效 - 请参阅编辑后的附加评论以获得比 'a' %in% x &amp; 'b' %in% x &amp; 'c' %in% x ... 更好的扩展方式
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2016-10-17
    • 2023-02-21
    • 2020-08-30
    • 2019-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多