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
相关产品推荐
相关产品推荐

