如何在 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%
返回TRUE
和FALSE
的逻辑向量。要否定它,您可以在逻辑语句前面使用!
:
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 查询中指定的每个过滤器获取一组键/值对?
servlet 过滤器是不是必须在 web.xml 文件中指定?