合普知识库
柔彩主题三 · 更轻盈的阅读体验

R统计缺失值处理:实用技巧与常见方法

发布时间:2026-01-20 01:11:14 阅读:203 次

认识缺失值的表现形式

在用R做数据分析时,经常会遇到数据不完整的情况。比如调查问卷里有人没填年龄,或者传感器某段时间断电导致记录为空。这些空值在R中通常显示为 NA,代表"Not Available"。它和数值0、空字符串不一样,是一种特殊的逻辑占位符。

如果不处理就直接分析,很多函数会报错或自动剔除,可能影响结果准确性。比如算平均值时,有 NA 的列默认返回 NA,得专门设置参数才能跳过。

查看缺失情况的基本操作

先要知道数据里有多少缺失值。可以用 is.na() 判断每个位置是否为空,返回逻辑向量。配合 sum() 能快速统计总数:

sum(is.na(data$age))

想知道每列有多少缺失,可以这样写:

sapply(data, function(x) sum(is.na(x)))

或者用更直观的可视化包 naniar,画出缺失模式图,一眼看出哪些变量问题多。

删除缺失值的适用场景

如果某列缺失比例特别高,比如超过70%,留着意义不大,可以直接删掉整列:

data <- data[, !sapply(data, function(x) all(is.na(x)))]

如果只是个别行有问题,且样本足够大,可以删掉整行:

data <- na.omit(data)

这招简单粗暴,适合缺失随机且数量少的情况。但要是数据本来就少,再一删,分析基础就薄弱了。

用均值或中位数填充

数值型变量常用填补法。比如“收入”这一列有几个空,可以用已有数据的均值补上:

data$income[is.na(data$income)] <- mean(data$income, na.rm = TRUE)

如果数据偏态严重,中位数更稳妥:

data$income[is.na(data$income)] <- median(data$income, na.rm = TRUE)

分类变量可以用众数(出现最多的类别)填,虽然R没有内置函数,但自己写一行就能搞定:

mode_val <- names(sort(table(data$gender), decreasing = TRUE))[1]

利用模型预测缺失值

当变量之间有关联时,可以用回归或随机森林来预估空值。比如体重缺失,但有身高、年龄、性别等信息,就可以建模推测。

有个方便的包叫 missForest,专门用随机森林填补:

library(missForest)
data_imputed <- missForest(data)

返回的对象 data_imputed$ximp 就是填补后的数据。这种方法适合复杂结构,但计算耗时较长。

保留缺失也是一种信息

有时候“没记录”本身就有含义。比如客户没填职业,可能是自由职业者或不愿透露,单独标记出来反而能发现规律。

可以新增一列标识是否缺失:

data$age_missing <- is.na(data$age)

之后在建模时把这一列作为特征加入,让算法自己判断其作用。

避免引入偏差的小提醒

处理缺失值不是越干净越好。盲目填充可能导致数据失真。比如用全局均值填区域收入,忽略了地区差异,结果就会偏离实际。

建议先分析缺失机制:是完全随机?还是某些群体更容易不答?如果是后者,得谨慎选择方法,必要时分组处理或使用多重插补。