R语言入门:处理缺失值和数据清洗
R语言给我们提供了一些有用的函数来处理数据的缺失值,让我们先来看看什么是数据的缺失值吧!
一.数据的缺失值
在R语言当中数据的缺失值用NA来表示,有的时候我们会发现在一个数据集当中的某些值显示的是NA,那么就说明这个值是缺失的值了,那么缺失值是否可以用来做运算呢?
比如说我们建立一个第一个数字为缺失值的向量,第一个数字为NA,后面的数字为1到49,那因此我们可以得到:
> a<-c(NA,1:49)
构建出来的a为:
> a [1] NA 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 [22] 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 [43] 42 43 44 45 46 47 48 49
如果我们想要计算a当中所有数字的和将会也是NA,因为在这个序列当中一旦有一个数值为缺失值,那么数据的总和很显然也不知道是多少,如下面的代码所示:
> sum(a) [1] NA
那么我们如何才能够解决这个问题呢?那就是在使用sum()函数的时候,后面加上参数na.rm=T即可,英文含义是移除(remove)缺失值(na)是真的(T),代码如下所示:
> sum(a,na.rm = T) [1] 1225
这样我们就可以计算除了缺失值之外所有数字的总和了。同样的我们可以将这个规律应用于求解平均值mean:
> mean(a,na.rm = T) [1] 25
那么我们思考一下我们求解的平均值除以的数字总数是加上了NA这个数还是加上呢?答案是没有!因为缺失值已经被我们移除这个序列了,系统并不会记录在内。我们可以利用一个新的序列来证明这一点:
> mean(1:49) [1] 25
在只有49个数字的情况下,得到的平均值还是25,所以确实我们通过这个参数已经将缺失值移除了。
二.数据清洗
假设我们有一个数据框变量,里面有各种变量,其中有一些变量已经被缺失了,为NA值。一个典型的数据框变量我们能够使用的,现成的数据集为VIM包里的sleep数据框,引入它的代码如下:
> library(VIM) Loading required package: colorspace Loading required package: grid Loading required package: data.table data.table 1.12.8 using 2 threads (see ?getDTthreads). Latest news: r-datatable.com VIM is ready to use. Since version 4.0.0 the GUI is in its own package VIMGUI. Please use the package to use the new (and old) GUI. Suggestions and bug-reports can be submitted at: https://github.com/alexkowa/VIM/issues Attaching package: ‘VIM’ The following object is masked from ‘package:datasets’: sleep Warning messages: 1: package ‘VIM’ was built under R version 3.6.3 2: package ‘data.table’ built under R version 3.6.3
然后引入其中的sleep数据集:
> sleep BodyWgt BrainWgt NonD Dream Sleep Span Gest Pred Exp Danger 1 6654.000 5712.00 NA NA 3.3 38.6 645.0 3 5 3 2 1.000 6.60 6.3 2.0 8.3 4.5 42.0 3 1 3 3 3.385 44.50 NA NA 12.5 14.0 60.0 1 1 1 4 0.920 5.70 NA NA 16.5 NA 25.0 5 2 3 5 2547.000 4603.00 2.1 1.8 3.9 69.0 624.0 3 5 4 6 10.550 179.50 9.1 0.7 9.8 27.0 180.0 4 4 4 7 0.023 0.30 15.8 3.9 19.7 19.0 35.0 1 1 1 8 160.000 169.00 5.2 1.0 6.2 30.4 392.0 4 5 4 9 3.300 25.60 10.9 3.6 14.5 28.0 63.0 1 2 1 10 52.160 440.00 8.3 1.4 9.7 50.0 230.0 1 1 1 11 0.425 6.40 11.0 1.5 12.5 7.0 112.0 5 4 4 12 465.000 423.00 3.2 0.7 3.9 30.0 281.0 5 5 5 13 0.550 2.40 7.6 2.7 10.3 NA NA 2 1 2 14 187.100 419.00 NA NA 3.1 40.0 365.0 5 5 5 15 0.075 1.20 6.3 2.1 8.4 3.5 42.0 1 1 1 16 3.000 25.00 8.6 0.0 8.6 50.0 28.0 2 2 2 17 0.785 3.50 6.6 4.1 10.7 6.0 42.0 2 2 2 18 0.200 5.00 9.5 1.2 10.7 10.4 120.0 2 2 2 19 1.410 17.50 4.8 1.3 6.1 34.0 NA 1 2 1 20 60.000 81.00 12.0 6.1 18.1 7.0 NA 1 1 1 21 529.000 680.00 NA 0.3 NA 28.0 400.0 5 5 5 22 27.660 115.00 3.3 0.5 3.8 20.0 148.0 5 5 5 23 0.120 1.00 11.0 3.4 14.4 3.9 16.0 3 1 2 24 207.000 406.00 NA NA 12.0 39.3 252.0 1 4 1 25 85.000 325.00 4.7 1.5 6.2 41.0 310.0 1 3 1 26 36.330 119.50 NA NA 13.0 16.2 63.0 1 1 1 27 0.101 4.00 10.4 3.4 13.8 9.0 28.0 5 1 3 28 1.040 5.50 7.4 0.8 8.2 7.6 68.0 5 3 4 29 521.000 655.00 2.1 0.8 2.9 46.0 336.0 5 5 5 30 100.000 157.00 NA NA 10.8 22.4 100.0 1 1 1 31 35.000 56.00 NA NA NA 16.3 33.0 3 5 4 32 0.005 0.14 7.7 1.4 9.1 2.6 21.5 5 2 4 33 0.010 0.25 17.9 2.0 19.9 24.0 50.0 1 1 1 34 62.000 1320.00 6.1 1.9 8.0 100.0 267.0 1 1 1 35 0.122 3.00 8.2 2.4 10.6 NA 30.0 2 1 1 36 1.350 8.10 8.4 2.8 11.2 NA 45.0 3 1 3 37 0.023 0.40 11.9 1.3 13.2 3.2 19.0 4 1 3 38 0.048 0.33 10.8 2.0 12.8 2.0 30.0 4 1 3 39 1.700 6.30 13.8 5.6 19.4 5.0 12.0 2 1 1 40 3.500 10.80 14.3 3.1 17.4 6.5 120.0 2 1 1 41 250.000 490.00 NA 1.0 NA 23.6 440.0 5 5 5 42 0.480 15.50 15.2 1.8 17.0 12.0 140.0 2 2 2 43 10.000 115.00 10.0 0.9 10.9 20.2 170.0 4 4 4 44 1.620 11.40 11.9 1.8 13.7 13.0 17.0 2 1 2 45 192.000 180.00 6.5 1.9 8.4 27.0 115.0 4 4 4 46 2.500 12.10 7.5 0.9 8.4 18.0 31.0 5 5 5 47 4.288 39.20 NA NA 12.5 13.7 63.0 2 2 2 48 0.280 1.90 10.6 2.6 13.2 4.7 21.0 3 1 3 49 4.235 50.40 7.4 2.4 9.8 9.8 52.0 1 1 1 50 6.800 179.00 8.4 1.2 9.6 29.0 164.0 2 3 2 51 0.750 12.30 5.7 0.9 6.6 7.0 225.0 2 2 2 52 3.600 21.00 4.9 0.5 5.4 6.0 225.0 3 2 3 53 14.830 98.20 NA NA 2.6 17.0 150.0 5 5 5 54 55.500 175.00 3.2 0.6 3.8 20.0 151.0 5 5 5 55 1.400 12.50 NA NA 11.0 12.7 90.0 2 2 2 56 0.060 1.00 8.1 2.2 10.3 3.5 NA 3 1 2 57 0.900 2.60 11.0 2.3 13.3 4.5 60.0 2 1 2 58 2.000 12.30 4.9 0.5 5.4 7.5 200.0 3 1 3 59 0.104 2.50 13.2 2.6 15.8 2.3 46.0 3 2 2 60 4.190 58.00 9.7 0.6 10.3 24.0 210.0 4 3 4 61 3.500 3.90 12.8 6.6 19.4 3.0 14.0 2 1 1 62 4.050 17.00 NA NA NA 13.0 38.0 3 1 1
我们可以看到里面有很多已经缺失的数据:NA,我们如何才能够将它们清理掉呢?那就是利用na.omit()函数,这个函数会将所有出现NA缺失值的行全部删除,只保留在数据框里没有缺失值的行,代码的使用如下所示:
> na.omit(sleep)#将数据框当中拥有无效值NA的那一行全部删除 BodyWgt BrainWgt NonD Dream Sleep Span Gest Pred Exp Danger 2 1.000 6.60 6.3 2.0 8.3 4.5 42.0 3 1 3 5 2547.000 4603.00 2.1 1.8 3.9 69.0 624.0 3 5 4 6 10.550 179.50 9.1 0.7 9.8 27.0 180.0 4 4 4 7 0.023 0.30 15.8 3.9 19.7 19.0 35.0 1 1 1 8 160.000 169.00 5.2 1.0 6.2 30.4 392.0 4 5 4 9 3.300 25.60 10.9 3.6 14.5 28.0 63.0 1 2 1 10 52.160 440.00 8.3 1.4 9.7 50.0 230.0 1 1 1 11 0.425 6.40 11.0 1.5 12.5 7.0 112.0 5 4 4 12 465.000 423.00 3.2 0.7 3.9 30.0 281.0 5 5 5 15 0.075 1.20 6.3 2.1 8.4 3.5 42.0 1 1 1 16 3.000 25.00 8.6 0.0 8.6 50.0 28.0 2 2 2 17 0.785 3.50 6.6 4.1 10.7 6.0 42.0 2 2 2 18 0.200 5.00 9.5 1.2 10.7 10.4 120.0 2 2 2 22 27.660 115.00 3.3 0.5 3.8 20.0 148.0 5 5 5 23 0.120 1.00 11.0 3.4 14.4 3.9 16.0 3 1 2 25 85.000 325.00 4.7 1.5 6.2 41.0 310.0 1 3 1 27 0.101 4.00 10.4 3.4 13.8 9.0 28.0 5 1 3 28 1.040 5.50 7.4 0.8 8.2 7.6 68.0 5 3 4 29 521.000 655.00 2.1 0.8 2.9 46.0 336.0 5 5 5 32 0.005 0.14 7.7 1.4 9.1 2.6 21.5 5 2 4 33 0.010 0.25 17.9 2.0 19.9 24.0 50.0 1 1 1 34 62.000 1320.00 6.1 1.9 8.0 100.0 267.0 1 1 1 37 0.023 0.40 11.9 1.3 13.2 3.2 19.0 4 1 3 38 0.048 0.33 10.8 2.0 12.8 2.0 30.0 4 1 3 39 1.700 6.30 13.8 5.6 19.4 5.0 12.0 2 1 1 40 3.500 10.80 14.3 3.1 17.4 6.5 120.0 2 1 1 42 0.480 15.50 15.2 1.8 17.0 12.0 140.0 2 2 2 43 10.000 115.00 10.0 0.9 10.9 20.2 170.0 4 4 4 44 1.620 11.40 11.9 1.8 13.7 13.0 17.0 2 1 2 45 192.000 180.00 6.5 1.9 8.4 27.0 115.0 4 4 4 46 2.500 12.10 7.5 0.9 8.4 18.0 31.0 5 5 5 48 0.280 1.90 10.6 2.6 13.2 4.7 21.0 3 1 3 49 4.235 50.40 7.4 2.4 9.8 9.8 52.0 1 1 1 50 6.800 179.00 8.4 1.2 9.6 29.0 164.0 2 3 2 51 0.750 12.30 5.7 0.9 6.6 7.0 225.0 2 2 2 52 3.600 21.00 4.9 0.5 5.4 6.0 225.0 3 2 3 54 55.500 175.00 3.2 0.6 3.8 20.0 151.0 5 5 5 57 0.900 2.60 11.0 2.3 13.3 4.5 60.0 2 1 2 58 2.000 12.30 4.9 0.5 5.4 7.5 200.0 3 1 3 59 0.104 2.50 13.2 2.6 15.8 2.3 46.0 3 2 2 60 4.190 58.00 9.7 0.6 10.3 24.0 210.0 4 3 4 61 3.500 3.90 12.8 6.6 19.4 3.0 14.0 2 1 1
这样我们就可以看到处理后的数据已经没有缺失的NA值了!数据清理完毕。