R语言学习笔记

《R语言实战》学习笔记---Chapter4(3) 基础数据管理

2023-08-10  本文已影响0人  RSP小白之路

在任何项目中,数据缺失问题都是不可避免的。因此对缺失值进行合理的处理是数据处理过程中很重要的一环。
在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

R中多数数值函数都拥有一个na.rm = TRUE的选项,可以在计算之前移除缺失值并使用剩余值进行计算:

x <- c(1, 3, NA, 7)
z <- sum(x, na.rm = TRUE)
> print(z)
[1] 11
> 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章再学习。

上一篇下一篇

猜你喜欢

热点阅读