R语言使用dplyr清理dataframe混乱行数据的最简方法
R数据框分类值高效清理方案
问题场景
待清理的测试数据如下:
df <- data.frame(name = c('Chicken','Chicken1','ChiCKen','Chicke_N', 'Eg_g','EGG','egg')) levels(as.factor(df$name)) # 因子水平输出 [1] "Chicke_N" "Chicken" "ChiCKen" "Chicken1" "Eg_g" "egg" "EGG"
目标是将name字段所有取值统一规整为chicken、egg两类。
原有写法的问题
你之前用ifelse+%in%硬枚举所有变体的写法有两个明显缺陷:
- 扩展性极差:只要数据里新增一个没枚举到的拼写变体(比如
chick_en、Egg1),就会被错分 - 鲁棒性差:如果字符串里带不可见空白、全角半角混排、特殊编码字符,肉眼看内容一致,但
%in%精确匹配会直接失效,导致分类错误。
推荐清理方案
方案1:词根正则匹配(容错率最高,推荐日常使用)
不需要手动枚举所有拼写变体,直接匹配核心词根,自动忽略大小写、下划线、数字后缀等干扰,还带异常值兜底逻辑:
library(dplyr) library(stringr) df <- df %>% mutate( name = case_when( str_detect(name, regex("chick", ignore_case = T)) ~ "chicken", str_detect(name, regex("egg", ignore_case = T)) ~ "egg", TRUE ~ NA_character_ # 匹配失败的异常值标记为NA,方便后续排查 ) )
运行后所有取值会被正确分类,后续如果出现既不属于chicken也不属于egg的异常值,不会被错误归为egg,能快速定位数据问题。
方案2:文本标准化后匹配(性能最高,适合大数据量)
如果确定数据只有两类、没有其他异常值,可以先做一轮文本标准化(转小写、移除所有非字母字符)再匹配,运行速度最快,适合百万行级以上的数据集:
library(dplyr) df <- df %>% mutate( # 标准化:统一转小写,移除所有下划线、数字等非英文字母的干扰字符 name_std = tolower(gsub("[^a-zA-Z]", "", name)), name = ifelse(name_std == "chicken", "chicken", "egg") ) %>% select(-name_std) # 删除临时辅助列
内容的提问来源于stack exchange,提问作者Squan Schmaan
相关产品推荐
相关产品推荐

