在任何项目中,数据缺失问题都是不可避免的。因此对缺失值进行合理的处理是数据处理过程中很重要的一环。
在R中,缺失值以符号NA(Not Available,不可用)表示,且数值型和字符型使用的缺失值符号都是相同的。
识别缺失值
R提供了一些函数, 用于识别包含缺失值的观测。 函数is.na()
允许你检测缺失值是否存在。
y <- c(1 , 2,3, NA)
is.na(y)
[1] FALSE FALSE FALSE TRUE
可以看到is.na()
函数作用于一个对象上。返回一个和原来数据长度相同的对象,元素是逻辑值。
原对象某个元素为缺失值,则返回的对象对应位置是TRUE
,不缺失的位置是FALSE
。
依然以第4章开始的管理者信息数据为例,查看is.na()
函数的作用。
manager <- c(1, 2, 3, 4, 5)
date <- c("10/24/08", "10/28/08", "10/1/08", "10/12/08", "5/1/09")
country <- c("US", "US", "UK", "UK", "UK")
gender <- c("M", "F", "F", "M", "F")
age <- c(32, 45, 25, 39, 99)
q1 <- c(5, 3, 3, 3, 2)
q2 <- c(4, 5, 5, 3, 2)
q3 <- c(5, 2, 5, 4, 1)
q4 <- c(5, 5, 5, NA, 2)
q5 <- c(5, 5, 2, NA, 1)
leadership <- data.frame(manager, date, country, gender, age,
q1, q2, q3, q4, q5, stringsAsFactors=FALSE)
print(leadership )
manager date country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2
4 4 10/12/08 UK M 39 3 3 4 NA NA
5 5 5/1/09 UK F 99 2 2 1 2 1
is.na(leadership[, 6:10])
q1 q2 q3 q4 q5
[1,] FALSE FALSE FALSE FALSE FALSE
[2,] FALSE FALSE FALSE FALSE FALSE
[3,] FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE TRUE TRUE
[5,] FALSE FALSE FALSE FALSE FALSE
书中重要的注意点:
第一, 缺失值被认为是不可比较的, 即便是与缺失值自身的比较。 这意味着无法使用比较运算符来检测缺失值是否存在。 例如, 逻辑测试
myvar == NA
的结果永远不会为TRUE
。 可以看到缺失值相应位置是TRUE
。
第二, R 并不把无限的或者不可能出现的数值标记成缺失值。正无穷和负无穷分别用Inf
和-Inf
所标记。 因此5/0
返回Inf
。 不可能的值(比如说,sin(Inf)
) 用NaN
符号来标记(not a number, 不是一个数) 。若要识别这些数值, 你需要用到is.infinite()
或is.nan()
。
重编码值为缺失值
如之前的例子中的年龄大于等于99岁的,在分析前需要被编码为缺失值。在分析这一数据集之前,需要编码这些值为缺失值。
leadership$age[leadership$age == 99] <- NA
排除缺失值
确定了缺失值的位置后,需要删除缺失值。
原因是, 含有缺失值的算术表达式和函数的计算结果也是缺失值。
x <- c(1, 3, NA, 7)
y <- x[1] + x[2] + x[3] + x[4]
z <- sum(x)
> print(y)
[1] NA
> print(z)
[1] NA
- 使用
na.rm = TRUE
选项去除函数
R中多数数值函数都拥有一个na.rm = TRUE
的选项,可以在计算之前移除缺失值并使用剩余值进行计算:
x <- c(1, 3, NA, 7)
z <- sum(x, na.rm = TRUE)
> print(z)
[1] 11
- 使用na.omit()删除所有含有缺失数的行/观测
> print(leadership)
manager date country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2
4 4 10/12/08 UK M 39 3 3 4 NA NA
5 5 5/1/09 UK F NA 2 2 1 2 1
newdata <- na.omit(leadership)
> print(newdata)
manager date country gender age q1 q2 q3 q4 q5
1 1 10/24/08 US M 32 5 4 5 5 5
2 2 10/28/08 US F 45 3 5 2 5 5
3 3 10/1/08 UK F 25 3 5 5 5 2
可以看到包含缺失值的2行观测都已经被去除了。
这种粗暴的处理方式只适用于缺失值较少且集中于少量观测中,更复杂的处理方式第18章再学习。
网友评论