博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
R语言-缺失值处理3
阅读量:4605 次
发布时间:2019-06-09

本文共 4133 字,大约阅读时间需要 13 分钟。

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内包括至少1个NA,则返回错误;如果不包括任何NA,则返回原有向量a
na.omit | na.omit() 返回删除NA后的向量a
attr(na.omit(),"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

参考资料

转载于:https://www.cnblogs.com/cloudtj/articles/5508767.html

你可能感兴趣的文章
Solved problems updating perl-XML-SAX-0.96-7.el6.noarch on CentOS 6
查看>>
redis为什么快
查看>>
【树状数组(二叉索引树)】轻院热身—candy、NYOJ-116士兵杀敌(二)
查看>>
116830
查看>>
c#,将pdf文件转换成图片文件。
查看>>
美国 100 名以后的大学还有去读研究生的必要吗?[无聊的时候看看]
查看>>
吴昊品游戏核心算法 Round 12(特别篇) —— 吴昊教你玩筷子游戏(计算几何)
查看>>
nginx的域名解析
查看>>
第一次Sprint
查看>>
Yii2.0中文开发向导——控制器(Controller)
查看>>
Java实战之01Struts2-02配置文件
查看>>
记一次安装VS2015后启动失败的修复过程
查看>>
cmd netstat 查看某监听端口 对应的Process ID 及使用taskkill 中止某进程
查看>>
[转]Android项目快速开发框架探索(Mysql + OrmLite + Hessian + Sqlite)
查看>>
FireMonkey 源码学习(1)
查看>>
访问阿里云 vue项目的 127.0.0.1:+ip
查看>>
A Swift Tour(3) - Functions and Closures
查看>>
关于在firefox下SSL error renegotiation not allowed的问题
查看>>
Subsets
查看>>
旋转数组
查看>>