【问题标题】:OR / AND operator in grepl o str_detectgrepl o str_detect 中的 OR / AND 运算符
【发布时间】:2019-02-09 10:20:06
【问题描述】:

如果我执行以下代码:

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的逻辑是什么?您的意思是“RX4 而不是 Wag”?
  • 没错。在第一种情况下,应用了 OR 运算符,但我需要 AND 不删除“Mazda RX4 Wag”。

标签: r dplyr stringr grepl


【解决方案1】:

我们可以为此使用^(?!.*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

【讨论】:

  • 当我应用此代码时,我得到以下结果:filter_impl(.data, quo) 中的错误:评估错误:无效的正则表达式 '^(?!.*Wag).* RX4',原因是'无效的正则表达式'。我可能做错了什么;我不是字符串处理方面的专家。
  • @majesus,啊不,对不起,我忘了在第二行添加perl = TRUE。固定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-02
  • 1970-01-01
  • 2014-05-05
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多