Оператор ИЛИ / И в grepl o str_detect - PullRequest
0 голосов
/ 09 февраля 2019

Если я выполню следующий код:

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 голосов
/ 09 февраля 2019

Мы можем использовать ^(?!.*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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...