前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基础知识 | R语言数据管理之缺失值

基础知识 | R语言数据管理之缺失值

作者头像
黑妹的小屋
发布2020-08-06 15:00:40
6170
发布2020-08-06 15:00:40
举报
文章被收录于专栏:菜鸟学数据分析之R语言

R语言数据管理之缺失值

在做任何数据分析的第一步,是根据个人需求创建数据集,存储数据的结构是多样的,包括向量,矩阵、数据框、因子以及列表等。其实,以上几个R语言的独特术语,在C++中也会经常用到,导致很多人都会认为自己很熟悉的错觉,然而在实际的应用中,却经常出现错误。最近在处理一波量大的数据,在运行程序的过程中,因为前期数据处理错误却出现各种bug,经过检查数据集发现是数据管理的问题,为了巩固R语言的基本数据管理,特地重新基础知识。

01

缺失值

NA(Not Available,不可用)表示缺失值;NaN(Not a Number,非数值)表示不可能出现的值。

#创建数据框

我们来创建一份关于某央企组织新员工的体检报告数据框吧

代码语言:javascript
复制
> PatientID<-c(1,2,3,4,5,6)
> Data<-c("03/20/20","03/21/20","03/22/20","03/23/20","03/24/20","03/25/20")
> Age<-c(18,25,26,35,48,50)
> Gender<-c("M","F","F","M","F","M")
> City<-c("福州","厦门","泉州","龙岩","漳州","三明")
> Pr1<-c("69","57","67","65","72","55")
> Pr2<-c("180","155","159","184","167","175")
> Pr3<-c("11","14","34","23","35","12")
> Pr4<-c("6","7","5","8","6","9")
> Pr5<-c("20","34","35","56","47","19")
> S1<-c(88,78,NA,56,45,60)
> S2<-c(67,87,45,25,NA,96)
> mydata<-data.frame(PatientID,Data,Age,Gender,City,Pr1,Pr2,Pr3,Pr4,Pr5,S1,S2)
> mydata
 PatientID     Data Age Gender City Pr1 Pr2 Pr3 Pr4 Pr5 S1 S2
1         1 03/20/20  18      M 福州  69 180  11   6  20 88 67
2         2 03/21/20  25      F 厦门  57 155  14   7  34 78 87
3         3 03/22/20  26      F 泉州  67 159  34   5  35 NA 45
4         4 03/23/20  35      M 龙岩  65 184  23   8  56 56 25
5         5 03/24/20  NA      F 漳州  72 167  35   6  47 45 NA
6         6 03/25/20  50      M 三明  55 175  12   9  19 60 96

02

缺失值的识别

is.na()函数检测缺失值是否存在,如果存在缺失值,相应的位置会标上TRUE,否则FALSE。

代码语言:javascript
复制
> is.na(S1)
[1] FALSE FALSE  TRUE FALSE FALSE FALSE
> is.na(mydata[,11:12])
        S1    S2
[1,] FALSE FALSE
[2,] FALSE FALSE
[3,]  TRUE FALSE
[4,] FALSE FALSE
[5,] FALSE  TRUE
[6,] FALSE FALSE

03

缺失值的计算

计算S1和S2的和,可以看到缺失值是无法使用比较运算符计算或识别的,只能用is.na()函数识别,而且含有缺失值的算术表达式和函数计算结果也是缺失值。

代码语言:javascript
复制
> attach(mydata)
> mydata$SumS<-S1+S2
> mydata
  PatientID     Data Age Gender City Pr1 Pr2 Pr3 Pr4 Pr5 S1 S2 SumS
1         1 03/20/20  18      M 福州  69 180  11   6  20 88 67  155
2         2 03/21/20  25      F 厦门  57 155  14   7  34 78 87  165
3         3 03/22/20  26      F 泉州  67 159  34   5  35 NA 45   NA
4         4 03/23/20  35      M 龙岩  65 184  23   8  56 56 25   81
5         5 03/24/20  48      F 漳州  72 167  35   6  47 45 NA   NA
6         6 03/25/20  50      M 三明  55 175  12   9  19 60 96  156

#确定缺失值之后,删除这些缺失值,可以考虑在函数计算之前去除缺失值,再使用剩余值进行计算

代码语言:javascript
复制
> S1<-c(88,78,NA,56,45,60)
> S3<-sum(S1,na.rm=TRUE)
> S3
[1] 327

04

编码某些数值为缺失值

编码某些数值为缺失值是很有必要的,在数据处理的过程中,能够通过na.omit()函数删除某个值所在的行。往期文章gganimate动画GIF&nbsp;|&nbsp;让你的图形跳动起来!!!的data_province2就是通过给data_province1中的Hubei赋值为缺失值,而后用na.rm()移除缺失值所得。

代码语言:javascript
复制
> mydata$Age[mydata$Age==48]<-NA
> mydata
  PatientID     Data Age Gender City Pr1 Pr2 Pr3 Pr4 Pr5 S1 S2 SumS
1         1 03/20/20  18      M 福州  69 180  11   6  20 88 67  155
2         2 03/21/20  25      F 厦门  57 155  14   7  34 78 87  165
3         3 03/22/20  26      F 泉州  67 159  34   5  35 NA 45   NA
4         4 03/23/20  35      M 龙岩  65 184  23   8  56 56 25   81
5         5 03/24/20  NA      F 漳州  72 167  35   6  47 45 NA   NA
6         6 03/25/20  50      M 三明  55 175  12   9  19 60 96  156

#删除缺失值所在的行

方法1:na.omit()函数

代码语言:javascript
复制
> mydata1<-na.omit(mydata)
> mydata1
  PatientID     Data Age Gender City Pr1 Pr2 Pr3 Pr4 Pr5 S1 S2 SumS
1         1 03/20/20  18      M 福州  69 180  11   6  20 88 67  155
2         2 03/21/20  25      F 厦门  57 155  14   7  34 78 87  165
4         4 03/23/20  35      M 龙岩  65 184  23   8  56 56 25   81
6         6 03/25/20  50      M 三明  55 175  12   9  19 60 96  156

方法2:tidyr::drop_na()

代码语言:javascript
复制
> mydata2<-tidyr::drop_na(mydata,S1,S2)
> mydata2


  PatientID     Data Age Gender City Pr1 Pr2 Pr3 Pr4 Pr5 S1 S2 SumS
1         1 03/20/20  18      M 福州  69 180  11   6  20 88 67  155
2         2 03/21/20  25      F 厦门  57 155  14   7  34 78 87  165
4         4 03/23/20  35      M 龙岩  65 184  23   8  56 56 25   81
6         6 03/25/20  50      M 三明  55 175  12   9  19 60 96  156

#使用邻近的元素填充NA

处理前数据框mydata:

代码语言:javascript
复制
  PatientID     Data Age Gender City Pr1 Pr2 Pr3 Pr4 Pr5 S1 S2 SumS
1         1 03/20/20  18      M 福州  69 180  11   6  20 88 67  155
2         2 03/21/20  25      F 厦门  57 155  14   7  34 78 87  165
3         3 03/22/20  26      F 泉州  67 159  34   5  35 NA 45   NA
4         4 03/23/20  35      M 龙岩  65 184  23   8  56 56 25   81
5         5 03/24/20  NA      F 漳州  72 167  35   6  47 45 NA   NA
6         6 03/25/20  50      M 三明  55 175  12   9  19 60 96  156

tidyr::fill()处理后数据框:

代码语言:javascript
复制
>tidyr::fill(mydata,S1,S2,SumS)
  PatientID     Data Age Gender City Pr1 Pr2 Pr3 Pr4 Pr5 S1 S2 SumS
1         1 03/20/20  18      M 福州  69 180  11   6  20 88 67  155
2         2 03/21/20  25      F 厦门  57 155  14   7  34 78 87  165
3         3 03/22/20  26      F 泉州  67 159  34   5  35 78 45  165
4         4 03/23/20  35      M 龙岩  65 184  23   8  56 56 25   81
5         5 03/24/20  NA      F 漳州  72 167  35   6  47 45 25   81
6         6 03/25/20  50      M 三明  55 175  12   9  19 60 96  156

小结

R语言最大的优势是绘图,学R的初心就是为了绘制实验过程产生的数据图,然而随着深度学习,会发现,R语言的数据分析也很重要,常常会在绘制图形的过程中,因为数据框中存在格式不统一,字符或者缺失值等原因导致绘图失败。对于非数学专业又喜欢R语言的人来说,学R之路漫漫其修远,没有极客基因是不行的,打好基础是进阶的前提!

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-04-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 菜鸟学数据分析之R语言 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档