R語言 出現矩陣/缺失值的解決方案

缺失值處理一般包括三步:

1. 識別缺失數據;

2. 檢查導致數據缺失的原因;

3. 刪除包含缺失值的實例或用合理的數值代替(插補)缺失值。

1.判斷缺失值

函數is.na()、is.nan()和is.infinite()可分別用來識別缺失值、不可能值和無窮值。每個返回結果都是

TRUE或FALSE

na表示缺失值

nan表示NOT A NUMBER

infinite表示+-Inf

一定要親手試x = 0/0,以及x = 1/0

>x <- NA
> is.na(x)
[1] TRUE
> is.nan(x)
[1] FALSE
> is.infinite(x)
 [1] FALSE

函數complete.cases()可用來識別矩陣或數據框中沒有缺失值的行

超級好用

#加載數據集
>data(sleep,package = "VIM")
#沒有缺失值的行
>sleep[complete.cases(sleep),]
#列出有一個或多個缺失值的行
>sleep[!complete.cases(sleep),]

2.圖形探究缺失數

#自己生成圖形
>library("VIM")
>aggr(sleep,prop = FALSE,numbers = TRUE)

matrixplot()函數可生成展示每個實例數據的圖形

#自己生成圖形
marginplot(sleep[c("Gest","Dream")],phc=c(20),col=c("darkgray","red","blue"))

3.刪除缺失值

函數complete.cases()可以用來存儲沒有缺失值的數據框或者矩陣形式的實例(行):

#可以把mydata替換成sleep,延續上面的代碼
>newdata <- mydata[complete.cases(mydata),]

同樣的結果可以用na.omit函數獲得:

#可以把mydata替換成sleep,延續上面的代碼
>newdata <- na.omit(mydata)

兩行代碼表示的意思都是:mydata中所有包含缺失數據的行都被刪除,然後結果才存儲到newdata中,以後擬合就用新數據newdata.

處理含缺失值的數據集時,成對刪除常作為行刪除的備選方法使用。對於成對刪除,觀測隻是當它含缺失數據的變量涉及某個特定分析時才會被刪除:

>cor(sleep,use = "pairwise.complete.obs")

3.1補全缺失值

函數mice()首先從一個包含缺失數據的數據框開始,然後返回一個包含多個(默認為5個)完整數據集的對象。

每個完整數據集都是通過對原始數據框中的缺失數據進行插補而生成的。

由於插補有隨機的成分,因此每個完整數據集都略有不同。

然後,with()函數可依次對每個完整數據集應用統計模型(如線性模型或廣義線性模型),最 後 ,pool()函數將這些單獨的分析結果整合為一組結果。

最終模型的標準誤和p值都將準確地反映出由於缺失值和多重插補而產生的不確定性。

>library(mice)
>data("sleep",package = "VIM")
>imp <- mice(sleep,seed = 1234)
#imp <- mice(sleep)
>fit <- with(imp,lm(Dream~Span+Gest))
fit
>pooled <- pool(fit)
>summary(pooled)
imp
>dataset2 <- complete(imp,action = 2)
>cor(sleep,use = "pairwise.complete.obs")

dataset2 is the newData

下圖為完整缺失值處理圖片:

補充:R語言讀取數據空值

一、Txt文件

1. 文件中的內容有雙引號,空值的時候是一對雙引號

filename.txt 文件內容形如:

“ID” “ITEM”

“1080254842” “漢字”

“1080254842” “中文”

“1080594798” “”

“1080594798” “”

導入數據:

test <-read.table("filename.txt",header=TRUE)

空值部分並不是NA,R語言不會把他識別為NA,改為下面的語句,即可解決。

test <-read.table("filename.txt",header=TRUE,na.strings = "")

2. 文件中內容無雙引號,空值即直接空白,形如下面:

ID ITEM

1080254842 漢字

1080254842 中文

1080594798

1080594798

導入數據:

test <-read.table("filename.txt",header=TRUE)

會出現錯誤:Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, :3行沒有2元素

第三行第二元素沒有。

修改為如下即可:

test <-read.table("filename.txt",header=TRUE,fill=TRUE)

導入數據成功,但是,空值仍然不是NA,還需加上na.strings = “”,

test <-read.table("filename.txt",header=TRUE, fill=TRUE, na.strings = "")

成功導入。

二、csv文件

test <-read.csv("test.csv",header=TRUE,sep=",",na.strings = "")

其中:

header =TRUE,表示把第一行作為標題。

sep=",",因為csv文件的列是用逗號分開的,加上sep=",",幫助R通過識別逗號來分割列。如果沒加,會出現原本多列數據導入後變為一列的情況。

na.strings = "":處理缺失值問題。

以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。如有錯誤或未考慮完全的地方,望不吝賜教。

推薦閱讀: