数据价值-DataValues

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 631|回复: 0

[R语言] R语言-缺失值处理3_缺失值与数值比较

[复制链接]

1万

主题

1万

帖子

3万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
39797
发表于 2017-3-6 14:24:02 | 显示全部楼层 |阅读模式
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  5
    # logical(0)
   
    y  5
    # NA
   
    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 1, 2, 3, NA, 5)
    # 1  2  3 NA  5
    mean(vy)
    # NA
    mean(vy, na.rm=TRUE)
    # 2.75
   
    vz 1, 2, 3, NaN, 5)
    # 1   2   3 NaN   5
    sum(vz)
    # NaN
    sum(vz, na.rm=TRUE)
    # 11
   
    # NULL不存在问题,因为它里面根本不存在值
    vx 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 NA,2,4,2,10,NA,9)
    > data
    [1]  1  2 NA  2  4  2 10 NA  9
    > data.na.fail data)
    Error in na.fail.default(data) : 对象里有遺漏值
    > data.na.fail
    Error: object 'data.na.fail' not found
    > data.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。例如:
    > a1,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 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] 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
    > tm12,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
    > tm21,function(x) all(is.na(x)))),]
    > tm2
         [,1] [,2]
    [1,]    1    1
    [2,]    2    2
    [3,]    1    1
    [4,]    2    2
R中如何如何替换na值:
    #读取数据
    ts "ts.csv",header=TRUE)
    #将缺失值替换为0
    ts[is.na(ts)] 0   
    #如果希望将所有的0值再替换为100,使用语句:
    ts[ts==0] 100
    #当然也可以根据其他的判断条件进行替换,如:
    #将所有大于50的元素都替换为50
    ts[ts>50] 50   
参考资料
,
转载请注明:数据分析 » R语言-缺失值处理3_缺失值与数值比较
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|DataValues ( 赣ICP备16006919号-3 点击这里给我发消息 DataValues

GMT+8, 2019-2-17 14:35 , Processed in 0.105341 second(s), 34 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表