如何在grepl或str_detect中使用AND NOT运算符排除指定字符串
解决方案:用grepl/str_detect实现「包含RX4且不包含Wag」的过滤
要仅保留含Mazda RX4的单行,我们需要实现**包含'RX4' 且 不包含'Wag'**的逻辑判断,下面提供几种实用的实现方式:
方法1:拆分逻辑条件(最直观)
直接用两个正则检查,结合逻辑运算符&和取反!,思路清晰易懂:
使用grepl
dplyr::filter(mtcars, grepl('RX4', type) & !grepl('Wag', type))
使用stringr::str_detect
如果习惯用stringr包的函数,写法会更简洁:
library(stringr) dplyr::filter(mtcars, str_detect(type, 'RX4') & !str_detect(type, 'Wag'))
这个逻辑很直白:先筛选出所有type包含'RX4'的记录,再排除其中包含'Wag'的条目,最终就只剩下Mazda RX4那一行。
方法2:用正则负向前瞻(一次性匹配)
如果你想在单个正则表达式里完成逻辑判断,可以用负向前瞻断言,不过需要开启Perl兼容的正则模式:
dplyr::filter(mtcars, grepl('RX4(?!.*Wag)', type, perl = TRUE))
这里的(?!.*Wag)表示:匹配到'RX4'之后,后面的任意位置都不能出现'Wag',这样一次正则匹配就同时满足了「包含RX4」和「不包含Wag」的条件。
以上两种方法都能得到你想要的单行结果:
mpg cyl disp hp drat wt qsec vs am gear carb type
1 21 6 160 110 3.9 2.620 16.46 0 1 4 4 Mazda RX4
内容的提问来源于stack exchange,提问作者majesus
相关产品推荐
相关产品推荐

