一定要先了解缺失機制,即為什麼會產生缺失值。
對於隨機產生的缺失值,可以刪除,刪除的物件分為兩類,變數的刪除,以及觀測值的刪除。當某一變數的缺失值比例很高的時候,可以直接刪除,也可以用啞變數進行標誌。
但缺失值的產生不是隨機的,要根據它產生原因用不同的方法填補;
主要介紹三個包的常用於填補缺失值的函式。
思路一般是要定位缺失值以及檢視缺失值的數量:
is.na()
sum(is.na())
md.pattern() mice包
computemissings包
填充:na.fill()
填充,是乙個比較有意思的操作,你的原始資料有可能會有缺失值na,在做各種計算時,就會出現有問題。一種方法是,你把na值都去掉;另外一種方法是,你把na值進行填充後再計算。那麼在填充值時,就有一些講究了。
把na值進行填充。
# 生成資料框
> df<-data.frame(a=c(1,na,na,2,na),
+ b=c('b','a','b','b',na),
+ c=c(rnorm(2),na,na,na));df
a b c
1 1 b 0.2670988
2 na a -0.5425200
3 na b na
4 2 b na
5 na na
# 把資料框a列的na,用9進行填充
> na.fill(df$a,9)
[1] 1 9 9 2 9
# 把資料框中的na,用1進行填充
> na.fill(df,1)
a b c
[1,] " 1" "b" " 0.2670988"
[2,] "true" "a" "-0.5425200"
[3,] "true" "b" "true"
[4,] " 2" "b" "true"
[5,] "true" "true" "true"
填充時,有時並不是用某個固定的值,而是需要基於某種規則去填充。
# 生成乙個zoo型別的資料
> z <- zoo(c(2, na, 1, 4, 5, 2), c(1, 3, 4, 6, 7, 8));z
1 3 4 6 7 8
2 na 1 4 5 2
# 對na進行線性插值
1 3 4 6 7 8
2.000000 1.333333 1.000000 4.000000 5.000000 2.000000
# 對na進行線性插值
1 3 4 6 7 8
2.0 1.5 1.0 4.0 5.0 2.0
# 對na進行樣條插值
> na.spline(z)
1 3 4 6 7 8
2.0000000 0.1535948 1.0000000 4.0000000 5.0000000 2.0000000
另外,我們可以針對na的位置進行填充,比如用前值來填充或後值來填充。
> df
a b c
1 1 b 0.2670988
2 na a -0.5425200
3 na b na
4 2 b na
5 na na
# 用當前列中,na的前值來填充
> na.locf(df)
a b c
1 1 b 0.2670988
2 1 a -0.5425200
3 1 b -0.5425200
4 2 b -0.5425200
5 2 b -0.5425200
# 用當前列中,na的後值來填充
> na.locf(df,fromlast=true)
a b c
1 1 b 0.2670988
2 2 a -0.5425200
3 2 b 4 2 b
以下函式引數較為簡單,help檢視就可以了。
compute函式 計算資料集缺少值,並確定用那種方法進行填補,method有median/mode以及random forest三個方法;
而對於random forest是不支援字元型別值得。所以只能用於數值或者因子型別。而median/mode,當變數取值為字元、因子型時一般為mode,數值型時為median。資料資料的格式一定要是data.frame
impute函式,則是將compute的訓練結果運用於需要進行填補的資料集上,該資料集為data.frame,且變數名要求和compute中data的一樣。
例子:train <- data.frame(v_int=as.integer(c(3,3,2,5,1,2,4,6))
v_num=as.numeric(c(4.1,na,12.2,11,3.4,1.6,3.3,5.5)),
v_fact=as.factor(c('one','two',na,'two','two','one','two','two')), stringsasfactors = false))
values <- compute(train, method="randomforest")
values2 <- compute(train) i
newdata <- data.frame(v_int=as.integer(c(1,1,2,na))
v_num=as.numeric(c(1.1,na,2.2,na)),
v_fact=as.factor(c('one','one','one',na)), stringsasfactors = false))
is.na(newdata)
colsums(is.na(newdata))
impute(newdata,object=values)
impute(newdata,object=values2)
R語言處理缺失值
在處理資料過程中,避免不了會產生一些缺失值,如未填寫資料或者編碼錯誤等原因,用na表示缺失值。在r語言中,is.na 函式可以判斷元素是否是缺失值,從而返回邏輯值 true false 所以該函式將會返回和元資料集一樣大小的資料集。在判斷缺失值的過程中,需要注意以下兩點 既然缺失值可能無處不在,那麼...
R語言矩陣 缺失值處理
缺失值處理一般包括三步 1.識別缺失資料 2.檢查導致資料缺失的原因 3.刪除包含缺失值的例項或用合理的數值代替 插補 缺失值。x is.na x 1 true is.nan x 1 false is.infinite x 1 false 函式complete.cases 可用來識別矩陣或資料框中沒...
R 缺失值處理
假設有一組資料集如下 data data.frame y c 1,2,3,na,5,6 x1 c 6,na,4,3,2,1 x2 c 1,3,6,9,12,na na 即表示缺失值。在r中輸入該資料。判斷缺失資料 is.na data 統計缺失值個數 sum is.na data 檢視每個樣本資料是...