1、前言
很多刚开始学R语言的人,都会急着去画图、跑回归或做显著性分析。可一旦真正处理实验数据、问卷结果或Excel表格时,就会发现——卡住的地方几乎都不是模型,而是数据结构。 数字列被识别成字符,分组变量忘了转因子,Excel导入后出现乱码、NA、重复值……这些看似微小的问题,往往导致整个分析流程无法进行。 今天这篇文章,就带大家系统了解R语言中最常见的数据清洗方法,学会如何识别、转换、修复错误类型,让原始数据变得可分析、可复现、可建模。
2、什么是数据清洗
在科研分析中,数据清洗的目标只有一个:让数据结构合理,类型正确,格式统一。 我们先用R自带的 iris 数据集来观察结构。
data <- iris
str(data)
## 'data.frame': 150 obs. of 5 variables:
## $ Sepal.Length: num 5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
## $ Sepal.Width : num 3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
## $ Petal.Length: num 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
## $ Petal.Width : num 0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
## $ Species : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
这是理想状态——四列数值、一列因子,非常标准。 但如果从Excel导入一个原始表格,就可能变成这样:
data <- read.csv("iris_dirty.csv")
str(data)
输出:
$ Sepal.Length: chr "5.1""4.9""4.7"
$ Sepal.Width : chr "3.5""3""3.2"
$ Species : chr "setosa""versicolor""virginica"
看似相同的数据,其实全变成了字符串。R无法直接计算或建模。
3、类型转换:as.numeric()、as.factor()、as.character()
来到今天新内容的重点了,类型转换是R数据清洗的第一步。
data$Sepal.Length <- as.numeric(data$Sepal.Length)
data$Species <- as.factor(data$Species)
然后查看结构:
str(data)
转换完成后,数据就能直接用于计算或可视化。
常用函数:
as.numeric()将字符转为数值 as.factor()将字符转为因子(分类变量) as.character()将因子转回字符
4、处理缺失值:na.omit()、is.na()、replace_na()
缺失值在科研数据中非常常见。 我们可以先人为制造缺失来演示处理方法:
data$Sepal.Width[c(3, 8, 15)] <- NA
查看缺失数量:
sum(is.na(data$Sepal.Width))
## [1] 3
删除含有缺失值的行:
clean_data <- na.omit(data)
5、用dplyr清洗数据:filter()、mutate()、select()
dplyr 是R最常用的数据操作包,代码简洁可读。
library(dplyr)
clean_data <- data %>%
filter(Sepal.Length > 5) %>% # 筛选行
mutate(Ratio = Petal.Length / Petal.Width) %>% # 创建新变量
select(Species, Ratio, everything()) # 调整列顺序
head(clean_data)
## Species Ratio Sepal.Length Sepal.Width Petal.Length Petal.Width
## 1 setosa 7.00 5.1 3.5 1.4 0.2
## 2 setosa 4.25 5.4 3.9 1.7 0.4
## 3 setosa 7.50 5.4 3.7 1.5 0.2
## 4 setosa 6.00 5.8 NA 1.2 0.2
## 5 setosa 3.75 5.7 4.4 1.5 0.4
## 6 setosa 3.25 5.4 3.9 1.3 0.4
6、数据重塑:从宽到长(pivot_longer)
在统计绘图中,长格式数据通常更方便分析。 例如将每列特征整合为两列:变量名和值。
library(tidyr)
long_data <- iris %>%
pivot_longer(cols = 1:4, names_to = "Variable", values_to = "Value")
head(long_data)
## # A tibble: 6 × 3
## Species Variable Value
## <fct> <chr> <dbl>
## 1 setosa Sepal.Length 5.1
## 2 setosa Sepal.Width 3.5
## 3 setosa Petal.Length 1.4
## 4 setosa Petal.Width 0.2
## 5 setosa Sepal.Length 4.9
## 6 setosa Sepal.Width 3
这样转换后,就可以轻松用 ggplot2 做出多组变量的比较图。
7、小结
结构正确、类型统一,是顺利数据分析的前提。 希望今天的更新可以起到抛砖引玉的作用,让你可以针对性地修复数据问题,显著降低学习成本,让你更快进入真正的科研分析阶段。
感谢关注,你的支持是我不懈的动力

