数据缺失值的处理

处理方式:

1:将含有缺失值的案例剔除

2:根据变量之间的相互关系填补缺失值

3:根据案例之间的相似性填补缺失值

4:使用能够处理缺失值的工具

 

一、将缺失值剔除

合适选该方案:当含有缺失值的记录所占的比例在可用数据集中非常小的时候,选该方案比较合理

#complete.cases()产生一个布尔值,当数据框的相应的行中不含有NA值,函数返回TURE

#显示所有含有空值的数据行

algae[!complete.cases(algae),]

#统计空行的总数

nrow(algae[!complete.cases(algae),])

#删除空值所在的行

algae <- na.omit(algae)



#删除62,199行

algae <- algae[-c(62,199),]

nrow(algae)





data(algae)

#apply()元函数,可以在某些条件下对对象应用其他函数。此处使用一个临时函数,统计每一行记录中空值的个数

apply(algae, 1, function(x) sum(is.na(x)))



manyNAs(algae, 0.2)

algae <- [-manyNAs(algae, 0.2),]

二、填补缺失值

 

1 用最高频率值来填补缺失值

 

一种方式:使用一些代表中心趋势的值来代替缺失值

1:所有的观测值都较好地聚集在平均值周围,平均值就是最好的选择

2:对于偏态分布(大多聚集在变量分布的一侧)或者存在离群值(会扭曲平均值),中位数是最好的选择

#方法二:填充缺失值

#求mxPH的平均值,来替代algae数据集48行mXPH对应的空值

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



#使用中位数来替代algae中Chla列中所有的空值

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



#函数centralImputation()可以用数据的中心趋势值来填补数据集的所有缺失值

#对于数值型变量,该函数用中位值。对于名义变量,采用众数

data(algae)

#library(DMwR)

#algae <- algae[manyNAs(algae),]#manyNAs(algae,0.2)第一个参数数据框名称,默认第二个参数为0.2,意思:空值个数大于列数的20%

algae <- centralImputation(algae)

 

2 通过变量的相关关系来填充缺失值

#cor()的功能是产生变量之间的相关值矩阵 设定参数为use = "complete.obs"时,忽略含有NA的记录

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

#由于cor()的输出不是很清晰,所有哦使用函数symnum()来改善结果的输出形式

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



library(DMwR)

data(algae)

algae <- algae[-manyNAs(algae), ]

#lm()函数获得PO4~oPO4的线性模型

lm(formula = PO4~oPO4, data=algae)

数据缺失值的处理_第1张图片

获得函数关系式:PO4 = 42.897 + 1.293 * oPO4

#对28行数据的处理

algae[28,"PO4"] <- 42.897 + 1.293 * algae[28, "oPO4"]



#函数批量处理

fillPO4 <- function(oP){

  if(is.na(oP)){

    return (NA)

  }else{

    return(42.897 + 1.293 * oP)

  }

}

algae[is.na(algae$PO4), "PO4"] <- sapply(algae[is.na(algae$PO4),"oPO4"], fillPO4)

#sapply()函数的第一个参数是一个向量,第二个参数是一个函数。将函数应用到一个参数所指向量的每一个元素,处理后,将结果输出 

 

#以下绘制的是:不同季节变量mxPH的直方图,如图1

library(DMwR)

data(algae)

#factor()函数,使algae$season按照时间顺序排序,即:春、夏、秋、冬

algae$season <- factor(algae$season, levels = c("spring", "summer", "autumn", "winter"))

histogram(~mxPH|season, data = algae)

 

#分析:收集样本时该年的季节对变量mxPH的值没有显著影响

#如果对于河流的大小(变量size)进行上面类似的分析,命令:

histogram(~mxPH | size, data = algae)

 

#下命令:说明河流大小和速度的所有组合的mxPH值的变化,如下图2

histogram(~mxPH | size * speed, data = algae)

数据缺失值的处理_第2张图片

 

                                            图1 不同季节变量mxPH的直方图

 

数据缺失值的处理_第3张图片

                                            图2 河流大小和速度的所有组合的mxPH值的变化

 

3 通过探索案例之间的相似性来填补缺失值

#用到知识:欧氏距离(判案例之间的相似性) 高斯核函数(从举例获得权重)

 

#函数knnImputation()用一个欧式距离的变种来找到距任何个案最近的k个邻居

data("algae")

algae <- knnImputation(algae, k=10)

 

#下代码,用中位数来填补

algae <- knnImputation(algae, k=10, meth="median")

 

 

 

你可能感兴趣的:(R语言)