R语言中用grepl筛选含(不含%的行遇问题,求解决方法
解决方法
问题出在正则表达式的特殊字符转义上:(是正则中的特殊元字符(用于开启捕获组),直接匹配会导致语法错误,必须用双反斜杠\\(转义才能匹配普通的左括号;而%不属于正则特殊字符,直接匹配即可。
根据你给出的期望结果,实际需求是排除同时包含(和%的行,用dplyr管道结合grepl可以这样实现:
library(dplyr) df <- data.frame(col1 = c("ap(pl)e", "or(a)ng%e", "pe%ar", "bl(u%)e", "red"), col2 = c(1,3,5,4,8)) # 筛选不同时包含(和%的行 df %>% filter(!(grepl("\\(", col1) & grepl("%", col1)))
运行后得到的结果就是你期望的:
col1 col2 1 ap(pl)e 1 2 pe%ar 5 3 red 8
如果一定要用case_when,可以在filter里通过条件判断返回逻辑值:
df %>% filter( case_when( # 同时包含(和%的行标记为不保留 grepl("\\(", col1) & grepl("%", col1) ~ FALSE, # 其余所有行都保留 TRUE ~ TRUE ) )
关键说明
- 匹配正则特殊字符(如
(,),.,*等)时,必须在字符前加双反斜杠\\,让正则引擎将其识别为普通字符。 - 如果你的真实需求是仅保留包含
(且不包含%的行,可以用以下代码:
df %>% filter(grepl("\\(", col1) & !grepl("%", col1))
内容的提问来源于stack exchange,提问作者Mathica
相关产品推荐
相关产品推荐

