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
参考资料
©哈尔滨商业大学 银河统计工作室
银河统计工作室成员由在校统计、计算机部分师生和企业数据数据分析师组成,维护和开发银河统计网和银河统计博客(技术文档)。专注于数据挖掘技术研究和运用,探索统计学、应用数学和IT技术有机结合,尝试大数据条件下新型统计学教学模式。