R语言满足指定条件时替换字符串最后出现目标词及报错排查
报错原因
- 语法层面:
if条件表达式括号匹配错误。原代码中str_sub(df$Airport_Name,-nchar(" DTS")==" DTS")把字符串相等判断逻辑写在了str_sub的参数内部,且if后的条件块缺少闭合右括号,导致R解析代码时无法识别语法结构,最终抛出unexpected '}'错误。 - 逻辑层面:R原生的
if/else仅支持单值逻辑判断,无法直接对数据框整列(长度>1的向量)做逐行分支判断,即便修正语法错误,代码也只会根据第一行的值做全局处理,无法覆盖所有行的匹配需求。
正确实现代码
这里用向量化分支判断实现逐行匹配替换,不需要写循环,代码简洁效率高:
# 加载依赖包 library(stringr) library(stringi) # 构造测试数据 Airport_ID <- c("3001","3002","3003","3004") Airport_Name <- c("Adelaide Airport DTS", "Brisbane DTS Land Airport Land ADTS", "Washington DTS INC Airport DTS", "DALLAS Airport TDS INC") df <- data.frame(Airport_ID, Airport_Name) # 逐行判断后缀并替换 df$Airport_Name <- ifelse( # 判断末尾4个字符是否为" DTS" str_sub(df$Airport_Name, start = -4) == " DTS", stri_replace_last_fixed(df$Airport_Name, " DTS", " DTSUpdated"), ifelse( # 判断末尾4个字符是否为" INC" str_sub(df$Airport_Name, start = -4) == " INC", stri_replace_last_fixed(df$Airport_Name, " INC", " INCUpdated"), # 都不匹配则保留原值 df$Airport_Name ) )
如果习惯用dplyr的语法,也可以用可读性更高的case_when替换嵌套ifelse:
library(dplyr) df$Airport_Name <- case_when( str_sub(df$Airport_Name, -4) == " DTS" ~ stri_replace_last_fixed(df$Airport_Name, " DTS", " DTSUpdated"), str_sub(df$Airport_Name, -4) == " INC" ~ stri_replace_last_fixed(df$Airport_Name, " INC", " INCUpdated"), TRUE ~ df$Airport_Name )
运行结果
执行代码后输出的df完全符合预期:
Airport_ID Airport_Name 1 3001 Adelaide Airport DTSUpdated 2 3002 Brisbane DTS Land Airport Land ADTS 3 3003 Washington DTS INC Airport DTSUpdated 4 3004 DALLAS Airport TDS INCUpdated
内容的提问来源于stack exchange,提问作者BobbyG
相关产品推荐
相关产品推荐

