You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:57:17