如何在 dplyr 过滤器中指定“不包含”

Posted

技术标签:

【中文标题】如何在 dplyr 过滤器中指定“不包含”【英文标题】:How to specify "does not contain" in dplyr filter 【发布时间】: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) 【参考方案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'))

【讨论】:

以上是关于如何在 dplyr 过滤器中指定“不包含”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 为 OData 查询中指定的每个过滤器获取一组键/值对?

如何在参数中指定两个默认日期

访问“SortedSet”中指定索引处的项目

servlet 过滤器是不是必须在 web.xml 文件中指定?

Google Places API:在 URL 参数中指定状态

在 VB.NET 中导致“导入中指定类型的命名空间不包含任何公共成员”的新 pc