数据集中往往存在缺失值,在进行数据分析前需要了解数据的缺失值情况。R语言中的一些基本函数可用于查询缺失数据,另外还有一些第三方包可用于查询和处理数据缺失。

     基本的缺失值查询可以通过is.na()和complete.cases()函数,当存在缺失值NA或者NAN时is.na()返回TRUE, complete.cases()则返回FALSE。


#使用PimaIndiansDiabetes2数据集
require(mlbench)
data("PimaIndiansDiabetes2", package = 'mlbench')
#返回总的缺失值的个数和百分比(TRUE等价于1,FALSE等价于0)
sum(is.na(PimaIndiansDiabetes2))
mean(is.na(PimaIndiansDiabetes2))
#统计每行的缺失个数
rowmissing <- apply(PimaIndiansDiabetes2, 1,      
function(x){sum(is.na(x))})
#统计每列的缺失个数
colmissing <- apply(PimaIndiansDiabetes2, 2, 
function(x){sum(is.na(x))})

#返回没有缺失值的行
PimaIndiansDiabetes2[complete.cases(PimaIndiansDiabetes2),]
#返回包含一个或多个缺失值的行
PimaIndiansDiabetes2[!complete.cases(PimaIndiansDiabetes2),]

     mice包函数md.pattern(x),可以以矩阵或者数据框的形式展示缺失值。输出的表格中,1表示列中不存在缺失值,0表示存在缺失值。返回的第一列表示缺失值模式的实例个数,最后一列表示各模式有缺失值的变量个数,最后一行表示每列缺失值的个数,整个表格最右下角的值表示总的缺失值个数。


require(mice)
md.pattern(PimaIndiansDiabetes2)


r语言kruskal-wallis检验 缺失值 r语言检查缺失值_数据


      

除此之外,VIM包中的aggr函数可以对缺失值进行可视化探索。参数prop为TRUE图形中显示缺失值比例, 为FALSE显示缺失值个数, 默认combined = FALSE,输出两张图,左侧为缺失值数量的柱状图。

require(VIM)
aggr(PimaIndiansDiabetes2, prop = FALSE, number = TRUE)


r语言kruskal-wallis检验 缺失值 r语言检查缺失值_缺失值_02


     

设置combined为TRUE,上述图形合并为一张图,表示缺失值数量的柱状图合并到图形上方。

aggr(PimaIndiansDiabetes2, prop = FALSE, number = TRUE, combined = TRUE)


r语言kruskal-wallis检验 缺失值 r语言检查缺失值_数据_03


     了解缺失值的基本分布情况后,往往需要更进一步了解缺失值产生的原因,可以通过查询缺失值的关联性,即一些关联性的缺失。


#转换数据框中元素为0,1形式,1表示数据缺失,0表示未缺失
pd <- as.data.frame(abs(is.na(PimaIndiansDiabetes2)))
#找出所有包含缺失值的列
pd_missing <- pd[, sapply(pd, function(x) {any( x == 1)})]
#含缺失数据的变量之间的相关系数
cor(pd_missing)

分析过缺失值后,需要进一步的处理缺失数据,例如删除缺失率较高的变量,或者对于缺失较少的数据进行插补,常见的如使用均值,中位数或者众数填补,另外也可以使用其它方法如装袋法,这里简单实现下装袋法。

require(caret)
#装袋法对缺失值插补
preproc <- preProcess(PimaIndiansDiabetes2[-9], 
method="bagImpute")
data <- predict(preproc, PimaIndiansDiabetes2[-9])
data$diabetes <- PimaIndiansDiabetes2[, 9]

   

上述为一些基本的缺失值探索和处理方法,欢迎交流学习。