R软件处理数据集中的缺失值

时间:2021-12-03 21:09:57

现实中的数据集经常会遇到缺失值的情况,在模型分析之前往往需要对其进行适当的处理,其方法无外乎删除与填补。

但无论是删除还是填补,均应该先查看缺失值情况,以algae数据集为例:

>ld<-algae[!complete.cases(algae),]#取数的思路就是先定位到缺失值,再提取出来,记住R中所有操作皆是函数

>nrow(ld)

(一)直接删除缺失值

与有效观察值相比,如果缺失值占比较少,则可直接将其删除。

>algae<-na.omit(algae)#或者algae<-algae[complete.cases(algae),]

(二)填补缺失值

填补的方法有很多,需要根据不同的情况做出科学合理的选择。

(1)集中值填补(Central values)

很容易理解,缺失值有更大的概率离集中值尽可能的小。

如果是接近于正态分布,那么可以采用均值法填补:

>algae[is.na(algae$mxPH),"mxPH"]<-mean(algae$mxPH,na.rm = T)

如果是有偏的,则采用中位数法更合适:

>algae[is.na(algae$Chla),"mxPH"]<-median(algae$Chla,na.rm = T)

(2)利用变量间的强相关性关系填补

 首先找到与缺失值所在变量相关性最强的其他变量

>cor(algae[,4:18],use = "complete.obs)

或者更直观的表述:

>symnum(cor(algae[,4:18],use="complete.obs"))

找到后建立模型:

>ft<-lm(PO4~oPO4 ,data=algae)

写填补函数:

> fillPO4 <- function(oP) {
+ if (is.na(oP)) return(NA)#NA一定要大写,否则报错
+ else return(fit)
+ }
> algae[is.na(algae$PO4),’PO4’] <-
+ sapply(algae[is.na(algae$PO4),“oPO4”],fillPO4)