如何使用R修复数据框指定列中的拼写错误?[已解决]
编辑补充:我后来发现,此前花了一小时尝试的方法完全正确,问题出在我完全忽略了大小写匹配:我需要修改的目标字符串全为大写格式,但我输入的替换内容是句首大写格式,大家不要犯和我一样的错误!
问题说明
数据框分类列存在大量拼写错误,会拆分相同分类的统计结果,比如本应总计500条的水果分类,会被拆成300条Fruits、200条Fruiits两个独立分类,导致统计值偏低。示例列Food group内容如下:
[1] "Grains" "Grains" "Proteins" "Proteins" "Vegetables" [6] "Dairy" "Fruits" "Fruiits"
需要将错误拼写Fruiits修正为Fruits,此前使用gsub、stringr包相关函数执行替换未生效。
正确实现方法
替换失效90%以上的原因是两个细节没处理对:
- 默认大小写敏感,输入的匹配文本和目标字符串大小写不一致,导致完全匹配不上
- 误开正则匹配时,字符串里的特殊字符没有做转义处理,匹配规则直接失效
基础R写法
固定字符串替换直接开fixed = TRUE关闭正则匹配,性能更高也不会有转义问题,需要忽略大小写就加ignore.case = TRUE:
# 单列单个错误值替换 df$`Food group` <- gsub( pattern = "Fruiits", replacement = "Fruits", x = df$`Food group`, fixed = TRUE, ignore.case = TRUE # 确认大小写完全匹配可以删掉这个参数 )
如果要批量修正多组拼写错误,直接做映射表循环处理即可,适配上千条观测、多类错误的场景:
# 配置错误值-正确值的映射关系,同类拼写错误都可以往里加 fix_map <- c( "Fruiits" = "Fruits", "Vegtables" = "Vegetables", "Dairi" = "Dairy" ) # 批量替换categories列所有错误值 df$categories <- Reduce( f = \(col, wrong) gsub(wrong, fix_map[wrong], col, fixed = TRUE), x = names(fix_map), init = df$categories )
stringr包写法
习惯用tidyverse生态的话直接用str_replace_all,固定匹配同样用fixed()包裹规则:
library(stringr) # 单个错误值替换 df$`Food group` <- str_replace_all( df$`Food group`, fixed("Fruiits", ignore_case = TRUE), "Fruits" ) # 批量替换直接传命名映射向量,写法更简洁 df$categories <- str_replace_all( df$categories, fixed(c( "Fruiits" = "Fruits", "Vegtables" = "Vegetables", "Dairi" = "Dairy" )) )
替换完成后执行table(df$categories)查看分类频次,确认错误分类已经合并到对应正确分类下就完成了。
内容的提问来源于stack exchange,提问作者daltoncito5034
相关产品推荐
相关产品推荐

