如果在数据集中发现异常值,但只想继续其余的分析工作,那么有两种选择。
- 将带有可疑值的行全部丢弃:
library(dplyr)
library(ggplot2)
diamonds2 <- diamonds %>% filter(between(y,3,20))
但并不建议采用这种方式,因为一个无效测量不代表所有测量都是无效的。此外,如果数据质量不高,若对每个变量都采用这种做法,那么到最后可能会发现数据已经所剩无几!
- 相反可以用缺失值来代替异常值。最简单的做法就是使用
mutate()
函数创建一个新变量来代替原来的变量。可以使用ifelse()
函数将异常值替换为NA:
(diamonds2 <- diamonds %>% mutate(y=ifelse(y<3|y>20,NA,y)))
# A tibble: 53,940 x 10
carat cut color clarity depth table price x y z
<dbl> <ord> <ord> <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1 0.23 Ideal E SI2 61.5 55 326 3.95 3.98 2.43
2 0.21 Premium E SI1 59.8 61 326 3.89 3.84 2.31
3 0.23 Good E VS1 56.9 65 327 4.05 4.07 2.31
4 0.290 Premium I VS2 62.4 58 334 4.2 4.23 2.63
5 0.31 Good J SI2 63.3 58 335 4.34 4.35 2.75
6 0.24 Very Good J VVS2 62.8 57 336 3.94 3.96 2.48
7 0.24 Very Good I VVS1 62.3 57 336 3.95 3.98 2.47
8 0.26 Very Good H SI1 61.9 55 337 4.07 4.11 2.53
9 0.22 Fair E VS2 65.1 61 337 3.87 3.78 2.49
10 0.23 Very Good H VS1 59.4 61 338 4 4.05 2.39
# ... with 53,930 more rows
ifelse()
有三个参数。第一个参数是一个逻辑向量,如果为TRUE会返回第二个参数的值,如果为FALSE会返回第三个参数的值。
ggplot2绘图时会忽略缺失值,但是会提出警告信息:
ggplot(diamonds2,aes(x,y))+geom_point()
#Warning message:
#Removed 9 rows containing missing values (geom_point).
image.png
如要消除警告信息,可以使用
na.rm=TRUE
:
ggplot(diamonds2,aes(x,y))+geom_point(na.rm = TRUE)
如果想要弄清楚造成有缺失值的观测和没有缺失值的观测间的区别的原因。可以使用is.na()函数创建一个新变量来完成这个操作:
library(nycflights13)
flights %>% mutate(cancelled = is.na(dep_time),sched_hour = sched_dep_time%/%100,sched_min=sched_dep_time%%100,sched_dep_time=sched_hour+sched_min/60) %>% ggplot(aes(sched_dep_time))+geom_freqpoly(aes(color=cancelled),binwidth=1/4)
image.png
在
nycflights13::flights
中dep_time变量中的缺失值表示航班取消了。因此,对已取消航班和未取消航班的计划出发时间做出比较。
网友评论