1. 程式人生 > >【R語言】缺失值

【R語言】缺失值

      資料集中往往存在缺失值,在進行資料分析前需要了解資料的缺失值情況。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)

     除此之外,VIM包中的aggr函式可以對缺失值進行視覺化探索。引數prop為TRUE圖形中顯示缺失值比例, 為FALSE顯示缺失值個數, 預設combined = FALSE,輸出兩張圖,左側為缺失值數量的柱狀圖。

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

     設定combined為TRUE,上述圖形合併為一張圖,表示缺失值數量的柱狀圖合併到圖形上方。
aggr(PimaIndiansDiabetes2, prop = FALSE, number = TRUE, combined = TRUE)

瞭解缺失值的基本分佈情況後,往往需要更進一步瞭解缺失值產生的原因,可以通過查詢缺失值的關聯性,即一些關聯性的缺失。

#轉換資料框中元素為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]
   上述為一些基本的缺失值探索和處理方法,歡迎交流學習。