本站分享:AI、大数据、数据分析师培训认证考试,包括:Python培训Excel培训Matlab培训SPSS培训SAS培训R语言培训Hadoop培训Amos培训Stata培训Eviews培训

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

r语言 cdadata 5188℃

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    

参考资料

转载请注明:数据分析 » R语言-缺失值处理3_缺失值与数值比较

喜欢 (3)or分享 (0)