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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 02:21:15