一、先准备工具(必须装)
数据清洗最强包:dplyr + tidyr
# 安装(一次即可)
install.packages("tidyverse") # 包含 dplyr, tidyr 等全套工具
# 加载(每次都要运行)
library(tidyverse)
二、数据清洗万能流程(7步)
不管什么数据,按这7步走,一定能洗干净:
- 读取数据
- 查看数据结构
- 处理缺失值
- 处理重复值
- 筛选有用行/列
- 修改变量类型、重命名
- 数据格式转换(宽表 ↔ 长表)
三、每一步代码模板(直接复制用)
我用内置数据 iris 演示,你把它换成自己数据即可。
1. 读取数据
# 读取 CSV
df <- read.csv("你的数据.csv", stringsAsFactors = FALSE)
# 读取 Excel
# install.packages("readxl")
library(readxl)
df <- read_excel("你的数据.xlsx")
2. 查看数据(先看懂数据)
head(df) # 前6行
str(df) # 结构:数字/字符/日期
summary(df) # 统计信息
dim(df) # 行数×列数
colnames(df) # 列名
3. 处理缺失值(最常见)
# 查看是否有缺失
is.na(df) %>% sum()
# 查看每列缺失数量
colSums(is.na(df))
# 1. 删除含缺失值的行
df_clean <- df %>% drop_na()
# 2. 用均值填充数值型缺失
df_clean <- df %>% replace_na(list(年龄 = mean(年龄, na.rm=TRUE)))
# 3. 用0填充
df_clean <- df %>% mutate_all(~replace(., is.na(.), 0))
4. 去除重复行
df_clean <- df %>% distinct() # 一键去重
5. 筛选行、选择列
# 选择需要的列
df_clean <- df %>% select(姓名, 年龄, 收入)
# 筛选符合条件的行(例如年龄>20)
df_clean <- df %>% filter(年龄 > 20)
# 排序
df_clean <- df %>% arrange(desc(年龄))
6. 修改变量 & 重命名
# 重命名列
df_clean <- df %>% rename(新名字 = 旧名字)
# 修改变量类型
df_clean <- df %>% mutate(年龄 = as.numeric(年龄))
# 新增一列
df_clean <- df %>% mutate(收入等级 = ifelse(收入 > 5000, "高", "低"))
7. 数据格式转换(宽表 ↔ 长表)
绘图、建模必须用长数据,这一步非常重要!
# 宽表 → 长表(绘图/建模专用)
df_long <- df %>% pivot_longer(cols = -分组列, names_to = "指标", values_to = "数值")
# 长表 → 宽表
df_wide <- df_long %>% pivot_wider(names_from = "指标", values_from = "数值")
四、超实用高级清洗(工作必用)
1. 异常值处理
# 筛选 95% 分位以内数据,去掉极端异常值
df_clean <- df %>% filter(数值列 > quantile(数值列, 0.025) & 数值列 < quantile(数值列, 0.975))
2. 字符去空格、统一大小写
df_clean <- df %>% mutate(姓名 = str_trim(姓名), 姓名 = str_to_cn(姓名))
3. 日期格式标准化
# install.packages("lubridate")
library(lubridate)
df_clean <- df %>% mutate(日期 = ymd(日期))
4. 分组汇总(清洗后常用)
df_summary <- df %>%
group_by(类别) %>%
summarise(均值 = mean(数值, na.rm=TRUE),
总数 = n())
五、一套万能清洗代码(直接套用)
把下面代码里的 df 换成你的数据,一键清洗完成:
df_clean <- df %>%
drop_na() %>% # 删缺失
distinct() %>% # 去重
select(需要的列) %>% # 选列
filter(条件) %>% # 筛选行
mutate(新列 = 计算) %>% # 新增列
rename(新名 = 旧名) # 重命名
六、你只需要记住 4 个核心函数
select():选列filter():筛选行mutate():新增/修改列drop_na()/distinct():清洗脏数据