【问题标题】:How to specify "does not contain" in dplyr filter如何在 dplyr 过滤器中指定“不包含”
【发布时间】:2016-03-30 09:31:52
【问题描述】:

我对 R 很陌生。

使用名为SE_CSVLinelist_clean 的表,我想提取名为where_case_travelled_1 的变量不包含字符串"Outside Canada""Outside province/territory of residence but within Canada" 的行。然后创建一个名为SE_CSVLinelist_filtered 的新表。

SE_CSVLinelist_filtered <- filter(SE_CSVLinelist_clean, 
where_case_travelled_1 %in% -c('Outside Canada','Outside province/territory of residence but within Canada'))

当我只使用“c”而不是“-c”时,上面的代码有效。
那么,当我真的想排除包含国家或省以外的行时,如何指定上述内容?

【问题讨论】:

  • 如果您发现自己想经常使用“不包含”,您可能需要定义自己的函数。例如`%notin%` = function(x,y) !(x %in% y)。然后你可以使用x %notin% y 而不是!(x %in% y)

标签: r filter dplyr


【解决方案1】:

请注意,%in% 返回TRUEFALSE 的逻辑向量。要否定它,您可以在逻辑语句前面使用!

SE_CSVLinelist_filtered <- filter(SE_CSVLinelist_clean, 
 !where_case_travelled_1 %in% 
   c('Outside Canada','Outside province/territory of residence but within Canada'))

关于您使用 -c(...) 的原始方法,- 是一个一元运算符,它“对数字或复数向量(或可以强制转换为它们的对象)执行算术运算”(来自 help("-"))。由于您正在处理无法强制转换为数字或复数的字符向量,因此您不能使用-

【讨论】:

    【解决方案2】:

    尝试将搜索条件放在括号中,如下所示。这将返回括号内的条件查询的结果。然后通过将其设置为 FALSE 来测试其结果以确定它是否为负(即它不属于向量中的任何选项)。

    SE_CSVLinelist_filtered <- filter(SE_CSVLinelist_clean, 
    (where_case_travelled_1 %in% c('Outside Canada','Outside province/territory of residence but within Canada')) == FALSE)
    

    【讨论】:

      【解决方案3】:

      请注意以前的解决方案,因为它们需要准确输入您要检测的字符串。

      问问自己,例如,“外部”一词是否足够。如果是,那么:

      data_filtered <- data %>% 
        filter(!str_detect(where_case_travelled_1, "Outside")
      

      一个代表版本:

      iris
      
      iris %>% 
        filter(!str_detect(Species, "versicolor"))
      

      【讨论】:

      • 技术上是 stringr 函数,而不是 dplyr。但是是 tidyverse 的一部分。这是一个很好的解决方案。
      【解决方案4】:

      快速修复。先定义%in%的反义词:

        '%ni%' <- Negate("%in%")
      

      然后申请:

      SE_CSVLinelist_filtered <- filter(
          SE_CSVLinelist_clean, 
          where_case_travelled_1 %ni% c('Outside Canada',
            'Outside province/territory of residence but within Canada'))
      

      【讨论】:

        猜你喜欢
        • 2016-06-21
        • 1970-01-01
        • 2021-05-22
        • 2021-01-27
        • 2019-09-03
        • 2020-09-16
        • 2015-08-09
        • 1970-01-01
        • 2018-01-16
        相关资源
        最近更新 更多