R语言如何检测字符串是否包含指定数据框中的任意字符
解决方案
核心思路是先把待匹配的所有字符整合成可被str_detect识别的匹配规则,全程使用向量化操作,完全不需要循环,百万级数据也能高效处理。
方案1:正则字符集匹配(性能最优)
利用正则字符类[字符集合]匹配任意一个包含在内的字符,动态生成规则即可:
library(dplyr) library(stringr) # 1. 动态生成匹配模式:所有待匹配字符转义后拼入正则字符集,避免特殊字符导致的语法错误 pattern <- paste0("[", str_flatten(str_escape(df$Utf8)), "]") # 2. 向量化检测,无需rowwise,直接批量处理所有字符串 df_check <- df_check %>% mutate(contains_chr = str_detect(string, pattern))
输出结果符合预期:
string contains_chr 1 CDEFFFFFFFEFADFFFFF FALSE 2 CDEFFFFFFF&FADFFFFF TRUE
方案2:固定匹配(无需处理正则转义)
如果不想处理正则转义问题,可以用stringi包的固定匹配函数,直接传入所有待检测字符即可:
library(stringi) df_check <- df_check %>% mutate(contains_chr = stri_detect_any_fixed(string, pattern = df$Utf8))
报错原因说明
你之前的代码报错是因为给str_detect的pattern参数传入了整个数据框对象,不符合参数要求。就算你改为传入df$Utf8字符向量,str_detect也会按位置循环匹配字符串和pattern,无法实现“匹配任意一个字符”的逻辑。
内容的提问来源于stack exchange,提问作者JREN_OP
相关产品推荐
相关产品推荐

