对于很多新手而言,在科研数据分析中,最让人抓狂的时刻,不是模型调不出来,也不是图太丑,而是——明明复制了AI的代码,却偏偏一调用自己的数据就报错了。
你可能怀疑是包版本不一致、函数更新了,甚至开始重装R和RStudio。但你有没有想过,其实就是最基本的数据自己的问题呢?
缺失值、空格、错别字、变量类型不一致、乱码……这些看起来不起眼的小问题,才是让很多科研新人在刚开始学习数据分析时卡壳的根源。99%的报错,其实和你的代码没什么关系,而是数据压根没清洗干净。
今天的更新,我们将带你系统地了解什么是数据清洗、常见的几类问题、如何在R语言中快速定位和修复,并通过一组可视化对比,展示清洗前后的巨大差异。
1. 什么是数据清洗?
数据清洗(Data Cleaning),指的是在数据分析前,对数据中存在的错误、缺失、不一致或格式问题进行识别、处理和修复的过程。
在科研场景中,数据清洗通常包括以下几个方面:
-
缺失值处理(NA) -
类型转换(如 character -> numeric) -
异常值识别与处理 -
重复值删除 -
字符串统一(空格、大小写、别名合并等) -
编码问题(UTF-8 / GBK乱码) -
因子水平统一 -
数据标准化与格式规范
2. 常见例子与代码演示
我们使用 airquality 数据集(R自带),模拟科研中常遇到的数据清洗问题。
2.1 缺失值检查与处理
# 查看缺失值分布
colSums(is.na(airquality))
# 方法一:直接删除缺失行(简单粗暴)
clean1 <- na.omit(airquality)
# 方法二:用列平均值填充缺失值(推荐)
library(dplyr)
clean2 <- airquality %>%
mutate(
Ozone = ifelse(is.na(Ozone), mean(Ozone, na.rm = TRUE), Ozone),
Solar.R = ifelse(is.na(Solar.R), mean(Solar.R, na.rm = TRUE), Solar.R)
)
2.2 类型转换(Character -> Numeric)
模拟一列被错误读取为字符型:
airquality$Temp <- as.character(airquality$Temp)
str(airquality$Temp) # 显示为字符型
# 转换为数值型
airquality$Temp <- as.numeric(airquality$Temp)
2.3 去除异常空格与字符串统一
df <- data.frame(Group = c(" Control", "control", "Treatment ", "treatment"))
df$Group <- trimws(tolower(df$Group)) # 去空格 + 转小写
unique(df$Group)
2.4 因子水平不一致导致模型报错
df <- data.frame(group = c("A", "B", "A", "C", NA))
df$group <- factor(df$group)
# 模型可能因 NA 或未知水平报错
# 建议:去掉NA,或设置参考水平
df_clean <- na.omit(df)
df_clean$group <- relevel(df_clean$group, ref = "A")
3. 清洗前后的可视化对比
我们用一个常见例子展示:缺失值处理前后的箱线图对比。
library(ggplot2)
library(dplyr)
# 原始数据(含NA)
p1 <- ggplot(airquality, aes(x = as.factor(Month), y = Ozone)) +
geom_boxplot() +
labs(title = "含缺失值的Ozone箱线图", x = "月份", y = "臭氧浓度")
# 填补缺失值后
air_clean <- airquality %>%
mutate(Ozone = ifelse(is.na(Ozone), mean(Ozone, na.rm = TRUE), Ozone))
p2 <- ggplot(air_clean, aes(x = as.factor(Month), y = Ozone)) +
geom_boxplot(fill = "lightblue") +
labs(title = "填补缺失值后的Ozone箱线图", x = "月份", y = "臭氧浓度")
# 可视化展示对比
library(patchwork)
p1 + p2
4. 小结
很多科研新手在刚开始分析数据时,容易一上来就照搬模型或画图代码。但只要底层数据没清洗干净,再好的模型也白搭。如果你也遇到“别人跑得动,你死活报错”的问题——先别急着怀疑代码,回去检查你的数据,才是解决问题的开始。
感谢关注,你的支持是我不懈的动力!

