R语言-缺失值处理3

R语言:处理缺失值

前言

  实际工作中,数据集很少是完整的,许多情况下样本中都会包括若干缺失值NA,这在进行数据分析和挖掘时比较麻烦。

  缺失值是数据中经常出现的问题,也是任何数据集中都可能出现的问题,无回答、录入错误等调查中常会出现的现象都会导致缺失数据。缺失值通常会用一些特殊符号进行标记,比如9999、1990年1月1日,或者是“*”、“?”、“#”、“$”等符号。

  对于缺失数据通常有三种应付手段

  (1)当缺失数据较少时直接删除相应样本

  删除缺失数据样本,其前提是缺失数据的比例较少,而且缺失数据是随机出现的,这样删除缺失数据后对分析结果影响不大。

  (2)对缺失数据进行插补

  用变量均值或中位数来代替缺失值,其优点在于不会减少样本信息,处理简单。但是缺点在于当缺失数据不是随机出现时会产成偏误。

  多重插补法(Multiple imputation):多重插补是通过变量间关系来预测缺失数据,利用蒙特卡罗方法生成多个完整数据集,再对这些数据集分别进行分析,最后对这些分析结果进行汇总处理。可以用mice包实现。

  (3)使用对缺失数据不敏感的分析方法,例如决策树。

  基本上缺失数据处理的流程是首先判断其模式是否随机,然后找出缺失的原因,最后对缺失值进行处理。

目录

 1. 缺失值与数值比较

 2. 缺失值检测

 3. 函数中忽略缺失值

 4. 向量中的删除缺失值

 5. na.fail和na.omit函数处理缺失值

 小结:常用示例

1. 缺失值与数值比较

  有时,你的数据中会包含一些缺失值,NULL, NA, 或者 NaN。它们与正常值不同,可能需要检测缺失值是否存在。

	x <- NULL
	x > 5
	# logical(0)
	
	y <- NA
	y > 5
	# NA
	
	z <- NaN
	z > 5
	# NA

2. 缺失值检测

  缺失值检测:

	is.null(x)
	# TRUE
	
	is.na(y)
	# TRUE
	
	is.nan(z)
	# TRUE

  注意NULL不同于其它两个。NULL是没有值,即空。而NA和NaN是有值的,尽管这些值是无用的。下面一个例子凸显了它们的差别:

	# Is y null?
	is.null(y)
	# FALSE
	
	# Is x NA?
	is.na(x)
	# logical(0)
	# Warning message:
	# In is.na(x) : is.na() applied to non-(list or vector) of type 'NULL'

  第一个例子是检测y是否为NULL,结果是否定的。第二个例子是尝试检测x是否为NA,但是x没有值能够被检测。

  注意:无限数值用Inf(正无穷)和-Inf(负无穷)表示,相应的检测函数为is.finite()和is.infinite()。

3. 函数中忽略缺失值

  如果你对一个包含NA或NaN的向量使用诸如mean()或sum()这样的汇总函数时,将返回NA或NaN,尽管它将会提醒你有缺失值存在,但通常是无用的。所以,需要使用na.rm这样的函数来标记,告诉它们忽略缺失值。

	vy <- c(1, 2, 3, NA, 5)
	# 1  2  3 NA  5
	mean(vy)
	# NA
	mean(vy, na.rm=TRUE)
	# 2.75
	
	vz <- c(1, 2, 3, NaN, 5)
	# 1   2   3 NaN   5
	sum(vz)
	# NaN
	sum(vz, na.rm=TRUE)
	# 11
	
	# NULL不存在问题,因为它里面根本不存在值 
	vx <- c(1, 2, 3, NULL, 5)
	# 1 2 3 5
	sum(vx)
	# 11

4. 向量中的删除缺失值

  使用is.na()或is.nan()过滤来删除向量中的缺失值。

	vy
	# 1  2  3  NA  5
	vy[ !is.na(vy) ]
	# 1  2  3  5
	
	vz
	# 1   2   3  NaN   5
	vz[ !is.nan(vz) ]
	# 1  2  3  5

5. na.fail()和na.omit()函数处理缺失值

  R语言通过na.fail和na.omit函数可以很好地处理样本中的缺失值。这两个函数的说明如下所示。

函数与说明
函 数 说 明
na.fail | na.fail(<向量a>) 如果向量a内包括至少1个NA,则返回错误;如果不包括任何NA,则返回原有向量a
na.omit | na.omit(<向量a>) 返回删除NA后的向量a
attr(na.omit(<向量a>),"na.action") 返回向量a中元素为NA的下标

  下面来看如下相关示例:

	> data <- c(1,2,NA,2,4,2,10,NA,9)
	> data
	[1]  1  2 NA  2  4  2 10 NA  9
	> data.na.fail <- na.fail(data)
	Error in na.fail.default(data) : 对象里有遺漏值
	> data.na.fail
	Error: object 'data.na.fail' not found
	> data.na.omit <- na.omit(data)
	> data.na.omit
	[1]  1  2  2  4  2 10  9
	attr(,"na.action")
	[1] 3 8
	attr(,"class")
	[1] "omit"
	> attr(data.na.omit,"na.action")
	[1] 3 8
	attr(,"class")
	[1] "omit"

  其中,函数na.fail和 na.omit 不仅可以应用于向量,也可以应用于矩阵和数据框。另外还可以使用!x方式方便地删除NA。例如:

	> a<-c(1,2,3,NA,NA,2,NA,5)
	> a[!is.na(a)]
	[1] 1 2 3 2 5

  其中,is.na用于判断向量内的元素是否为NA,返回结果应该是:向量FALSE FALSE FALSE TRUE TRUE FALSE TRUE FALSE

  即a内元素为NA,其对应的下标元素是TRUE,反之是FALSE。!x是取非逻辑运算符,!is.na(a)表示a内元素不为NA,其对应的下标元素是TRUE,反之是FALSE。通过a[!is.na(a)]进行索引后,即可取出a内不为NA的元素,将其过滤。

小结:常用示例

  对付缺失值有用的函数:

is.na(x)
which(is.na(x))
mean(x,na.rm=TRUE)

  R中如何删除全部是na的行和列:

	> testmatrix <- matrix(nrow=6, ncol=4)
	> testmatrix
	     [,1] [,2] [,3] [,4]
	[1,]   NA   NA   NA   NA
	[2,]   NA   NA   NA   NA
	[3,]   NA   NA   NA   NA
	[4,]   NA   NA   NA   NA
	[5,]   NA   NA   NA   NA
	[6,]   NA   NA   NA   NA
	> testmatrix[2:5,2:3] <- seq(2)
	> testmatrix
	     [,1] [,2] [,3] [,4]
	[1,]   NA   NA   NA   NA
	[2,]   NA    1    1   NA
	[3,]   NA    2    2   NA
	[4,]   NA    1    1   NA
	[5,]   NA    2    2   NA
	[6,]   NA   NA   NA   NA
	> tm1<-testmatrix[,-which(apply(testmatrix,2,function(x) all(is.na(x))))]
	> tm1
	     [,1] [,2]
	[1,]   NA   NA
	[2,]    1    1
	[3,]    2    2
	[4,]    1    1
	[5,]    2    2
	[6,]   NA   NA
	> tm2<-tm1[-which(apply(testmatrix,1,function(x) all(is.na(x)))),]
	> tm2
	     [,1] [,2]
	[1,]    1    1
	[2,]    2    2
	[3,]    1    1
	[4,]    2    2

  R中如何如何替换na值:

	#读取数据
	ts <- read.csv("ts.csv",header=TRUE) 
	#将缺失值替换为0
	ts[is.na(ts)] <- 0   
	#如果希望将所有的0值再替换为100,使用语句:
	ts[ts==0] <- 100
	#当然也可以根据其他的判断条件进行替换,如:
	#将所有大于50的元素都替换为50
	ts[ts>50] <- 50    

参考资料

posted @ 2016-05-19 15:12  银河统计  阅读(6330)  评论(0编辑  收藏  举报