R语言检测替换分类字符串:电力公司名称合并及代码报错求助
问题解决思路与替代方法
先修正当前报错的代码
你的代码报错有两个核心问题:
- 在dplyr管道(
%>%)中,mutate里引用列无需加evpd$前缀,直接写列名即可,额外加前缀会导致上下文识别错误。 str_replace的第二个参数要求是正则匹配模式,而非str_detect返回的逻辑值(TRUE/FALSE),这不符合函数参数规则。
针对替换包含"BONNEVILLE"的条目,两种正确写法:
写法1:用str_replace_all正则匹配
library(dplyr) library(stringr) evpd %>% mutate(Electric.Utility = str_replace_all(Electric.Utility, ".*BONNEVILLE.*", "Bonneville"))
写法2:用if_else配合str_detect(逻辑更直观)
evpd %>% mutate(Electric.Utility = if_else(str_detect(Electric.Utility, "BONNEVILLE"), "Bonneville", Electric.Utility))
批量处理多公司变体的通用方法
针对你提到的PUGEON、XIMAN这类有固定前缀的变体,推荐以下几种高效方案:
方法1:case_when批量定义规则
适合需要针对不同公司设置不同匹配逻辑的场景:
evpd %>% mutate(Electric.Utility = case_when( # 匹配以PUGEON开头的所有条目 str_detect(Electric.Utility, "^PUGEON") ~ "PUGEON", # 匹配以XIMAN开头的所有条目 str_detect(Electric.Utility, "^XIMAN") ~ "XIMAN", # 匹配包含BONNEVILLE的所有条目 str_detect(Electric.Utility, "BONNEVILLE") ~ "Bonneville", # 其他未匹配的条目保持原内容 TRUE ~ Electric.Utility ))
方法2:提取第一个单词统一名称
如果所有变体都是「主名称+空格+后缀」的格式,直接提取第一个单词即可:
evpd %>% mutate(Electric.Utility = word(Electric.Utility, 1))
这个方法简单高效,适合格式统一的变体场景。
方法3:映射表匹配(应对复杂变体)
如果变体格式混乱(比如大小写不一致、后缀无规律、缩写混用),可以先创建一个名称映射表,再通过left_join匹配替换:
# 创建变体-标准名称映射表 name_mapping <- tibble( variant = c("PUGEON ABC", "PUGEON XLS", "PUGEON ARR", "XIMAN RYR", "XIMAN WET", "XIMAN OPD", "BONNEVILLE POWER", "BONNEVILLE ELEC"), standard_name = c(rep("PUGEON", 3), rep("XIMAN", 3), rep("Bonneville", 2)) ) # 执行匹配替换 evpd <- evpd %>% left_join(name_mapping, by = c("Electric.Utility" = "variant")) %>% # 用coalesce优先取标准名称,无匹配则保留原内容 mutate(Electric.Utility = coalesce(standard_name, Electric.Utility)) %>% # 移除临时映射列 select(-standard_name)
这个方法灵活性最高,无论变体多么复杂,只要补充映射表即可覆盖。
内容的提问来源于stack exchange,提问作者Humberto R
相关产品推荐
相关产品推荐

