R语言grepl多关键词搜索数据框评论的问题及后续异常求助
解决grepl多关键词匹配问题
首先,你遇到的第一个警告是因为grepl()的pattern参数默认只接受单个正则表达式字符串,当你传入一个关键词向量时,它只会取第一个元素,这就是为什么只有'retag'被识别的原因。
正确实现多关键词搜索的方法
要匹配任意一个关键词,你需要把关键词向量合并成一个用|分隔的正则表达式(|在正则里表示“或”的逻辑),然后传给grepl()。同时可以加上ignore.case=TRUE参数,这样就不用重复写大小写不同的关键词,大幅简化你的代码:
# 合并关键词为正则模式,启用忽略大小写 keywords <- c('retag','lost','Was', 'was','original','change','CHANGE','check','CHECK','switched','temp only','should', 'had tag','new','give','GIVE', 'given','^--', 'tag', 'TAG', 'tags', 'tagged', 'temp', 'Temporarily', 'Temporary', 'Released', 'removed', 'Processing', 'processing', 'Processed', 'previously', 'pit', 'pits', 'PIT', 'orig', 'original', 'old', 'OLD', 'new', 'New', 'not', 'listed', 'last', 'had', 'could', 'Chech', 'assigned') keyword_pattern <- paste(keywords, collapse = "|") # 数据处理流程 do.call(rbind, breeder[-1]) %>% select(Year, `Old Tag`, Tag_11, PIT, `Sex Orig`, Group, Comments) %>% filter(`Sex Orig` != "m", grepl(keyword_pattern, Comments, ignore.case = TRUE)) %>% arrange(desc(PIT)) %>% print.data.frame
关于更新后部分关键词未识别的问题
你更新后的代码里有一个关键错误:使用paste0(., collapse = " | ")时,|前后加了空格,这会让正则表达式认为你要匹配带前后空格的关键词(比如" Released "),而如果你的Comments里是"Released in 2021"或者"dog was released"这种没有前后空格的内容,就会匹配失败。
另外,同样可以用ignore.case=TRUE来避免重复写大小写不同的关键词,简化你的deadKeywords:
修正后的代码:
# 简化关键词列表,用ignore.case处理大小写差异 deadKeywords <- c('died', 'Released', 'processed', 'process', 'dead') dead_pattern <- paste(deadKeywords, collapse = "|") commentSearch <- do.call(rbind, breeder[-1]) %>% select(Year, `Old Tag`, Tag_11, PIT, Sex, Orig, Group, Comments) %>% filter(grepl(dead_pattern, Comments, ignore.case = TRUE)) %>% arrange(desc(PIT)) %>% print.data.frame
如果想要更精确的匹配(比如避免匹配到包含关键词的更长单词,比如process匹配到processing),可以给每个关键词加上单词边界\\b,比如:
dead_pattern <- paste(paste0("\\b", deadKeywords, "\\b"), collapse = "|")
这样就只会匹配完整的单词,如果你只需要包含该字符串即可,就不需要加单词边界。
内容的提问来源于stack exchange,提问作者Constantin
相关产品推荐
相关产品推荐

