或/与运营商greplØstr_detect

问题描述 投票:1回答:1

如果我执行下面的代码:

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明确移除“摇摆”?

r dplyr stringr grepl
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.