求可检测拆分相似字符字符串的R代码,解决grepl匹配冲突
区分含近似子串的字符串解决方案
精准匹配括号内的目标字符串
你的示例数据里类别(organic/inorganic)都包裹在括号中,直接针对括号内的完整内容匹配,能彻底避免子串干扰:
library(dplyr) library(stringr) # 筛选含"(organic)"的条目(不区分大小写) df1 %>% filter(str_detect(fertilizer_name, "\\(organic\\)", ignore_case = TRUE)) # 筛选含"(inorganic)"的条目 df1 %>% filter(str_detect(fertilizer_name, "\\(inorganic\\)", ignore_case = TRUE))
用单词边界匹配完整单词
如果类别不一定在括号里,使用正则的单词边界\b,确保匹配的是独立的"organic"单词,而非"inorganic"中的子串:
# 匹配完整的"organic"单词(不区分大小写) df1 %>% filter(grepl("\\borganic\\b", fertilizer_name, ignore.case = TRUE)) # 匹配完整的"inorganic"单词 df1 %>% filter(grepl("\\binorganic\\b", fertilizer_name, ignore.case = TRUE))
提取类别列批量处理
对于10万行的大数据集,先把括号内的类别提取为单独列,后续筛选、分组都会更高效直观:
df1_processed <- df1 %>% mutate(fertilizer_type = str_extract(fertilizer_name, "(?<=\\().*?(?=\\))")) # 筛选organic类型 df1_processed %>% filter(fertilizer_type == "organic") # 按类别分组统计 df1_processed %>% count(fertilizer_type)
反向排除干扰项
如果需要保留"organic"且排除"inorganic",可以用逻辑条件组合过滤:
df1 %>% filter(grepl("organic", fertilizer_name, ignore.case = TRUE) & !grepl("inorganic", fertilizer_name, ignore.case = TRUE))
内容的提问来源于stack exchange,提问作者Sam Mwenda
相关产品推荐
相关产品推荐

