第五章 R语言的缺失值

我们在记录数据时,经常会遇到缺失值。比如,统计一下全班同学的身高,恰巧有些同学今天生病没来,只记录了姓名或序号,却没有记录身高数值,这就造成了缺失。在R语言中,缺失值有两种形式,一种是NA,另一种是NaN,注意大小写。缺失值在实际统计运算中会对结果造成干扰,因此,在一些运算中需要先删除缺失值或使用补缺失(imputation)的方法,将缺失填充上值,再进行计算,降低对结果的影响。

NA表示的是测定的时候为空(Missing)或当前值不可用(Not available)。NaN表示无意义的值,比如0除以0(0/0)或者无穷减去无穷(Inf-Inf)。NaN在实际应用中并不常用,而NA在实际应用中非常常见。NA和NaN都是占位符,无意义,无法进行运算。

可以看一下实例,我们假设记录一个班级同学的身高(height),全班共7名同学(n=7)。

height <- c(171,165,159,198,146,NA,184) # 其中有一个缺失值

接下来,我们需要验证我们一共调差了几个同学,用到之前的length()函数。

length(height) # 查看向量中元素的个数

[1] 7

得到的答案是7,也就是我们一共调查了7个人。接下来,我们做一些基本的统计运算,比如计算这几个人的平均身高。还记得求平均值的函数吗?mean()

mean(height) # 计算平均身高,可以看到,下面的结果是NA,也就是NA对数据的计算造成了干扰

[1] NA

那么,我们应该怎么计算带有NA的均值呢?最简单的方法就是将NA去掉,然后再进行计算。R的内置函数中,已经集成了去掉NA的功能,即是用na.rm=T参数先去除数据中的NA再进行计算。

mean(height, na.rm=T) # 先去掉NA,再计算均值

[1] 170.5

在一些高级运算中,没有直接可用的R语言的内置函数,需要我们自己编写代码进行计算。我们该怎样处理缺失值呢?这就要求我们先知道缺失值的位置或个数,然后再进行相应处理。这里我们用sum()函数再算一次均值。

sumHeight <- sum(height, na.rm=T) # 对所有数据求和

numberHeight <- length(height)-sum(is.na(height)) # 有效数据数量

sumHeight/numberHeight # 计算均值

[1] 170.5

is.na()是专门处理缺失值的函数,它会得到一个与原向量等长的向量,并标注每一个对应的位置是否为缺失值。我们将sum()函数与is.na()函数连用,可以得到缺失值的个数,这可能很难理解,原因很简单,逻辑值FALSE被视为0,而逻辑值TRUE被视为1;is.na()得到的向量中,NA变成了TRUE(也就是1),非NA变成了FLASE(0),因此,用sum()函数可以求出缺失个数。下面,我们手动去掉缺失值,然后再计算平均值,用到which()函数,用来显示某个值的下标(位置)。

heightNoNA <- height[-which(is.na(height))] # 将有NA的数据去掉

heightNoNA <- height[!is.na(height)] # 将有NA的数据去掉

mean(heightNoNA) # 计算均值

[1] 170.5

思考题:

  1. 用is.na()求缺失值个数。
  2. 不使用is.na()求出缺失值的个数。
  3. 写出能将NA下标(位置)显示出来的函数组合。
  4. 组合上面函数,写一行代码,直接算出平均值。
    # mean(height[!is.na(height)])

评论

一条对“第五章 R语言的缺失值”的回复

  1. Prtal Berita 的头像

    What is the difference between R language and other programming languages ​​in data analysis?

    Regard Prtal Berita

发表回复