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

R语言如何批量替换medication前缀多列的多个拼写错误值

R语言批量替换多列药物数据变体值实现方案

你不需要逐列复制修改代码,通过「统一替换规则+自动匹配目标列」的逻辑就能一次性完成所有列的替换,两种常用实现方式如下:


方案1:基础R实现(无需额外安装包)

步骤1:先整理所有替换规则

把所有药物的大小写变体、拼写错误和对应的标准值整理成映射,后续新增药物替换规则直接往里面加就行:

# 命名向量规则:名称为待替换的错误/变体值,值为对应的标准药物名
replace_rules <- c(
  "Orange" = "Orange",
  "orange" = "Orange",
  "ORANGE" = "Orange",
  "Orangee" = "Orange",
  # 其他药物的规则直接追加,例如阿司匹林的错拼
  "asprin" = "Aspirin",
  "Asprin" = "Aspirin",
  "ASPIRIN" = "Aspirin",
  "asprinn" = "Aspirin"
)

步骤2:自动匹配所有需要处理的列

不用手动列全部50个列名,通过正则自动匹配所有medication+数字格式的列:

# 匹配所有符合命名规则的目标列
target_cols <- grep("^medication[0-9]+$", names(df), value = TRUE)

步骤3:批量循环替换

遍历所有目标列一次性完成替换,未匹配到规则的值(本身就是正确值的条目)会保留原值,不会被误改:

for (col in target_cols) {
  raw_val <- df[[col]]
  df[[col]] <- ifelse(
    raw_val %in% names(replace_rules),
    replace_rules[raw_val],
    raw_val
  )
}

方案2:dplyr简洁实现(适合tidyverse工作流)

如果平时用dplyr处理数据,可以用across()直接对匹配到的所有列应用替换规则,代码更简洁:

library(dplyr)

df <- df %>%
  mutate(
    across(
      # 自动匹配所有medication开头加数字的列
      matches("^medication[0-9]+$"),
      ~ case_when(
        .x %in% c("Orange", "orange", "ORANGE", "Orangee") ~ "Orange",
        .x %in% c("asprin", "Asprin", "ASPIRIN", "asprinn") ~ "Aspirin",
        # 其余未匹配到规则的值保留原样
        TRUE ~ .x
      )
    )
  )

优化提示

如果拼写错误变体太多,不想手动枚举所有情况,可以先对字符串做标准化预处理,减少手动列规则的工作量:

  • 先统一转小写:tolower()
  • 去掉字符串首尾多余空格:trimws()
  • 对重复字母做模糊匹配(比如把连续重复的字母压缩成单个,处理Orangee/Orangeee这类错误)

替换完成后可以用lapply(df[target_cols], unique)快速抽查每列的唯一值,补漏未覆盖的拼写错误即可,后续新增时间点、新增列只要符合medication+数字的命名规则,不需要修改代码逻辑就能自动处理。

内容的提问来源于stack exchange,提问作者NoobR

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 00:33:35