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值了!數據清理完畢。