如何进行大数据中R语言的缺失值处理
本篇文章给大家分享的是有关如何进行大数据中R语言的缺失值处理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。
拿到数据后,在清楚了分析需求后,别急着各种统计、模型一块上,先给数据做个"清洁"再说。数据中往往会有各种缺失值,异常值,错误值等,今天先介绍一下如何处理缺失值,才能更好的数据分析,更准确高效的建模。
一 查看数据集的缺失情况
R中使用NA代表缺失值,用is.na识别缺失值,返回值为TRUE或FALSE。由于逻辑值TRUE和FALSE分别等价于数值1和0,可用sum()和mean()来获取数据集的缺失情况。
载入R包及内置数据集
library(VIM)#VIM包的sleep数据集示例data(sleep,package="VIM")
1)查看数据集整体有多少缺失值及百分比
sum(is.na(sleep))mean(is.na(sleep))
2)查看数据集特定变量(列)有多少缺失值及百分比
sum(is.na(sleep$Sleep))mean(is.na(sleep$Sleep))
3)数据集中多个行包含缺失值
mean(!complete.cases(sleep))
4)列出没有缺失值的行
sleep[complete.cases(sleep),] #利用函数
list <-which(rowSums(is.na(sleep)) > 0) ; sleep[-list,] # 效果同上
5)列出有一个或多个缺失值的行
sleep[!complete.cases(sleep),]list <-which(rowSums(is.na(sleep)) > 0) ; sleep[list,]
二 探索缺失值
2.1 mice包展示数据整体的缺失情况
library(mice)md.pattern(sleep)BodyWgt BrainWgt Pred Exp Danger Sleep Span Gest Dream NonD 42 1 1 1 1 1 1 1 1 1 1 09 1 1 1 1 1 1 1 1 0 0 23 1 1 1 1 1 1 1 0 1 1 12 1 1 1 1 1 1 0 1 1 1 11 1 1 1 1 1 1 0 1 0 0 31 1 1 1 1 1 1 0 0 1 1 22 1 1 1 1 1 0 1 1 1 0 22 1 1 1 1 1 0 1 1 0 0 3 0 0 0 0 0 4 4 4 12 14 38
其中 '1'代表完好数据,'0'代表缺失值。左侧第一列,'42'代表有42条数据无缺失值,第一个'9'代表9条数据Dream和NonD同时缺失。最后一行返回的就是每一个变量(列)对应的缺失数目,38为一共有多少缺失值。下图同样的意思。
2.2 VIM包展示数据缺失情况
1)展示sleep数据集的整体缺失情况
library("VIM")aggr(sleep,prop=FALSE,numbers=TRUE)
2)展示sleep数据集感兴趣的变量的缺失情况
marginplot(sleep[c("Sleep","Dream")],pch=c(20),col=c("darkgray","red","blue"))
三 处理缺失值
当充分了解了缺失值的情况后,可以根据数据量的大小,以及某一列是否为重要的预测作用变量,对数据集中的NA行和某些NA列进行处理。
3.1 删除缺失值
1)删除数据集中所有含有NA的行和列
sleep_noNA <- na.omit(sleep)sleep_noNA <- x[complete.cases(sleep),] #两种一样的效果
2)删除所有含有NA的列
na_flag <- apply(is.na(sleep), 2, sum)sleep[,which(na_flag == 0)]
3)删除所有含有NA的行
na_flag <- apply(is.na(sleep), 1, sum)sleep[which(na_flag == 0),]
4)根据某些列的NA,移除相应的行
sleep[complete.cases(sleep[,c(1,3)]),]
4)表示将向量x中所以NA元素用某个值来代替
sleep[is.na(sleep)] <- 999
3.2 填充缺失值
当数据量不是很大或者变量比较重要时候,可以考虑对缺失值进行填充。
1)常见数值填补
library(Hmisc)data(sleep)#均值填充,适用于接近正态分布impute(sleep$NonD , mean) #中位数填充,偏态数据但是不是很严重impute(sleep$Dream , median)# 填充特定值impute(sleep$Span, 0)
2)DMwR包进行kNN最近邻插补
library(DMwR)data(sleep)data <- sleep # 备份数据,对比填充结果set.seed(1120)sleep$BrainWgt[sample(nrow(sleep), 20)] <- NAhead(sleep) BodyWgt BrainWgt NonD Dream Sleep Span Gest Pred Exp Danger1 6654.000 5712.0 NA NA 3.3 38.6 645 3 5 32 1.000 6.6 6.3 2.0 8.3 4.5 42 3 1 33 3.385 NA NA NA 12.5 14.0 60 1 1 14 0.920 5.7 NA NA 16.5 NA 25 5 2 35 2547.000 4603.0 2.1 1.8 3.9 69.0 624 3 5 46 10.550 NA 9.1 0.7 9.8 27.0 180 4 4 4
# 最近邻填补缺失值
knnOutput <- knnImputation(sleep[c(1:6)])anyNA(knnOutput)head(knnOutput)BodyWgt BrainWgt NonD Dream Sleep Span1 6654.000 5712.00000 2.534467 1.675830 3.3 38.6000002 1.000 6.60000 6.300000 2.000000 8.3 4.5000003 3.385 19.67034 10.109710 2.248604 12.5 14.0000004 0.920 5.70000 12.803345 3.353104 16.5 8.1735685 2547.000 4603.00000 2.100000 1.800000 3.9 69.0000006 10.550 95.83459 9.100000 0.700000 9.8 27.000000
# 将插补值与实际值进行对照
actuals <-data$BrainWgt[is.na(sleep$BrainWgt)]
predicteds <- knnOutput[is.na(sleep$BrainWgt),"BrainWgt"]
# 两样本均值检验并计算其相似度
t.test(actuals, predicteds) # 接受差值为0的假设cor(actuals, predicteds) # 相关系数
当然根据数据和目的的不同,采用的缺失值处理方式肯定不一样,需要我们对数据和需求有足够的认识,做出比较好的判断和处理。
以上就是如何进行大数据中R语言的缺失值处理,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。