grepl o str_detect 中的 OR / AND 运算符
OR / AND operator in grepl o str_detect
如果我执行下面的代码:
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 中应用 运算符 AND NOT 以显式删除 'Wag'?
我们可以为此使用 ^(?!.*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
如果我执行下面的代码:
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 中应用 运算符 AND NOT 以显式删除 'Wag'?
我们可以为此使用 ^(?!.*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