grepl中的OR / AND运算符o str_detect

时间:2019-02-09 10:20:06

标签: r dplyr stringr grepl

如果我执行以下代码:

dplyr::filter(mtcars, grepl('RX4|Wag', type))

我得到结果:

  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
2  21   6  160 110  3.9 2.875 17.02  0  1    4    4 Mazda RX4 Wag

但是,我需要以下结果:

  mpg cyl disp  hp drat    wt  qsec vs am gear carb          type
   21   6  160 110  3.9 2.620 16.46  0  1    4    4     Mazda RX4

如何在str_detect或grepl中应用运算符而不是,以显式删除'Wag'

1 个答案:

答案 0 :(得分:0)

为此,我们可以使用^(?!.*Wag).*RX4,其中(?!.*Wag)是整个字符串中的否定超前。例如,

grep('^(?!.*Wag).*RX4', c("Wag RX4 bag", "bag RX4 Wag", "bag RX4 bag"), perl = TRUE)
# [1] 3

所以,在您的情况下应该是

dplyr::filter(mtcars, grepl('^(?!.*Wag).*RX4', type, perl = TRUE))
#   mpg cyl disp  hp drat   wt  qsec vs am gear carb      type
# 1  21   6  160 110  3.9 2.62 16.46  0  1    4    4 Mazda RX4

我同意这种模式并不是很明显,所以您可能需要分两个步骤进行操作,允许使用通常的AND和NOT:

dplyr::filter(mtcars, grepl('RX4', type) & !grepl('Wag', type))
#   mpg cyl disp  hp drat   wt  qsec vs am gear carb      type
# 1  21   6  160 110  3.9 2.62 16.46  0  1    4    4 Mazda RX4