【資料科學筆記】第三章 資料清洗與預處理
文章目錄
- 【資料科學筆記】第三章 資料清洗與預處理
- 前言
- 3.1 資料分類
- 3.2 資料清洗
- 3.2.1處理缺失值
- 3.2.2 處理噪聲資料
- 3.3 資料轉換
- 3.4 R語言實作
- 3.4.1 資料集的基本操作
前言
博客已上傳為PDF資源,系統沒辦法直接開源,只有關注帥氣的不二程式猿才能下載,(不想關注可以私信或評論,備注資源名稱可以獲取)🆓資源鏈接:【資料科學筆記】第三章 資料清洗與預處理.pdf 428KB
3.1 資料分類
資料是資料物件及屬性的集合,在大資料時代,資料的來源越來越多樣化,
3.2 資料清洗
資料清洗是準備資料重要的一步,通過填補缺失值,光滑噪聲資料,識別或洗掉離群點解決不一致性來清洗資料,
3.2.1處理缺失值
從資料缺失的分布來講,缺失值分為完全隨機缺失(Missing Completely At Random,MCAR), 隨機缺失(Missing At Randon,MAR) 和完全非隨機缺失(Missing Not At Random,MNAR),
- 缺失資料的識別:
在R語言中,缺失值以符號 NA 表示,我們可以使用賦值陳述句將某些值重新編碼為缺失值,
在問卷中年齡的值為 99,要讓R語言明白 99 是缺失值,例如:
dataframe $ age [ datafarme $ age == 99 ] <- NA
任何等于 99 的年齡都會被修改為 NA,
2. 缺失資料的探索與檢驗
R語言中提供了一些函式用來識別包含缺失值的觀測, is.na() 函式檢測缺失值是否存在,假設有一個向量:
> y <- c( 1, 2, 3, NA )
> is.na( y ) # 使用函式
[1] FALSE FALSE FALSE TRUE
complete.cases() 函式可以用來識別矩陣或資料框的行是否完整,也就是有無缺失值,回傳結果是邏輯值,如果一行中沒有缺失值回傳 TRUE, 若有一個或者多個缺失值,回傳 FALSE ,可以使用 sum() 函式和 mean() 函式計算完整資料的行數和完整率,以 VIM 包中的 sleep 資料舉例子:
> data( sleep , package = 'VIM' ) # 讀取VIM包中的sleep資料
> sleep[ ! complete.cases( sleep ) , ] # 提取sleep資料中不完整行(沒在Rstudio中運行成功)
> sum( ! complete.cases( sleep ))
[1] 20 # 列出了20個缺失值的觀測值
> mean( complete.cases( sleep ))
[1] 0.6774194 # 有67.7%的完整實體
- 缺失資料的處理
(1) 行洗掉,通過na.omit( sleep )函式移除所有含缺失值的觀測值,也可以洗掉所有缺失資料的行,
> newsleep <- na.omit ( sleep )
(2) 均值插補法(Mean Imputation)
(3) 多重插補(Multiple Imputation,MI) 面對復雜的問題時,MI 是最好的解決方法,它從一個包含缺失值的資料集中生成一組完整的資料集,缺失的資料用蒙特卡洛方法填補,R語言中的 mice 包能多重插補,
> library( mice )
> data( sleep , package = 'VIM' )
> imp <- mice ( sleep , m = 5 , seed = 6666 )
iter imp variable
1 1 NonD Dream Sleep Span Gest
1 2 NonD Dream Sleep Span Gest
1 3 NonD Dream Sleep Span Gest
1 4 NonD Dream Sleep Span Gest
1 5 NonD Dream Sleep Span Gest
2 1 NonD Dream Sleep Span Gest
2 2 NonD Dream Sleep Span Gest
> fit <- with ( imp , expr = lm( Dream ~ Span + Gest ))
> pooled <- pool( fit )
> summary( pooled )
term estimate std.error statistic df p.value
1 (Intercept) 2.566278726 0.243596941 10.5349382 55.44495 7.549517e-15
2 Span -0.004067545 0.011600780 -0.3506269 56.39153 7.271747e-01
3 Gest -0.004002280 0.001486934 -2.6916336 50.77112 9.604566e-03
>
其中,imp 包含 m 個插補資料集的串列物件;m 默認是 5 ;exp 是一個運算式物件;lm() 是線性回歸模型;廣義線性模型 glm() 函式,
3.2.2 處理噪聲資料
資料噪聲是指資料中存在的隨機性錯誤或偏差,產生的原因很多,噪聲資料的處理方法通常有分箱、聚類分析和回歸分析等,something depend on people’s 經驗,
只需了解,現階段暫時用不上,不做詳細介紹,
3.3 資料轉換
資料變換包括平滑、聚合、泛化、規范化、屬性和特征的重構操作,
1. 資料平滑: 是指將噪聲從資料中移除,
2. 資料聚合: 是指將資料進行匯總,以便分析,
3. 資料泛化: 是指資料在概念層次上轉化為較高層次的概念程序,
4.資料規范化:
(1) 標準差標準化,
(2) 極差標準化,
(3) 極差正規化,
5.最小——最大規范化
3.4 R語言實作
對于資料預處理的基本函式,例如集合并
merge()、資料篩選subset()等,在此介紹R語言中的 dplyr 包,專注接受 dataframe 物件,
下面以R語言中 rpart 包中的 car90 資料集進行示范,
3.4.1 資料集的基本操作
由于 dplyr 基于C語言開發,處理 tbl(表格)物件非常快,在做預處理時,可以使用
tbl_df()函式將原資料轉為tbl物件,
> library( dplyr )
> library( rpart ) # 需要載入rapart包中的car90資料集
> data( car90 )
> car90_df <- tbl_df( car90 )
1. 資料篩選
如果需要對資料集按照某些邏輯條件進行篩選得到符合要求的記錄,可以用
filter()函式,例如: 分別篩選出產自日本的中型車資料和產自日本或者美國的汽車資料:
> filter( car90_df , Country == 'Janpan' , Type == 'Medium' ) # 且的關系
# A tibble: 0 x 34
# … with 34 variables: Country <fct>, Disp <dbl>, Disp2 <dbl>, Eng.Rev <dbl>,
# Front.Hd <dbl>, Frt.Leg.Room <dbl>, Frt.Shld <dbl>, Gear.Ratio <dbl>,
# Gear2 <dbl>, HP <dbl>, HP.revs <dbl>, Height <dbl>, Length <dbl>,
# Luggage <dbl>, Mileage <dbl>, Model2 <fct>, Price <dbl>, Rear.Hd <dbl>,
# Rear.Seating <dbl>, RearShld <dbl>, Reliability <ord>, Rim <fct>,
# Sratio.m <dbl>, Sratio.p <dbl>, Steering <fct>, Tank <dbl>, Tires <fct>,
# Trans1 <fct>, Trans2 <fct>, Turning <dbl>, Type <fct>, Weight <dbl>,
# Wheel.base <dbl>, Width <dbl>
> filter( car90_df , Country == 'Janpan' | Country == 'USA' )
# A tibble: 39 x 34
Country Disp Disp2 Eng.Rev Front.Hd Frt.Leg.Room Frt.Shld Gear.Ratio Gear2 HP
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 USA 151 2.5 NA 4 42 56.5 NA 2.84 110
2 USA 231 3.8 NA 6 42 58.5 NA 1.99 165
3 USA 231 3.8 NA 5 41 59 NA 1.99 165
4 USA 231 3.8 NA 3.5 41.5 58 NA 1.99 165
5 USA 307 5 NA 5 43 60.5 NA 1.96 140
6 USA 273 4.5 NA 6 42 59.5 NA 2.08 180
7 USA 273 4.5 NA 3 42 58 NA 2.08 180
8 USA 262 4.3 1630 5 42 61.5 2.07 2.26 150
9 USA 133 2.2 2375 3.5 42 55.5 2.83 3.18 95
10 USA 191 3.1 2085 3.5 41.5 58 2.6 2.26 140
# … with 29 more rows, and 24 more variables: HP.revs <dbl>, Height <dbl>,
# Length <dbl>, Luggage <dbl>, Mileage <dbl>, Model2 <fct>, Price <dbl>,
# Rear.Hd <dbl>, Rear.Seating <dbl>, RearShld <dbl>, Reliability <ord>,
# Rim <fct>, Sratio.m <dbl>, Sratio.p <dbl>, Steering <fct>, Tank <dbl>,
# Tires <fct>, Trans1 <fct>, Trans2 <fct>, Turning <dbl>, Type <fct>,
# Weight <dbl>, Wheel.base <dbl>, Width <dbl>
此外,可以將
filter.all()、filter.if()、filter.at()函式與all_vars()和any_vars()函式等結合起來更強大,例如,篩選出 car_90 資料集中所有變數大于 100 時:
> filter_all( car90_df , all_vars( .>100 ))
# A tibble: 0 x 34
# … with 34 variables: Country <fct>, Disp <dbl>, Disp2 <dbl>, Eng.Rev <dbl>,
# Front.Hd <dbl>, Frt.Leg.Room <dbl>, Frt.Shld <dbl>, Gear.Ratio <dbl>,
# Gear2 <dbl>, HP <dbl>, HP.revs <dbl>, Height <dbl>, Length <dbl>,
# Luggage <dbl>, Mileage <dbl>, Model2 <fct>, Price <dbl>, Rear.Hd <dbl>,
# Rear.Seating <dbl>, RearShld <dbl>, Reliability <ord>, Rim <fct>,
# Sratio.m <dbl>, Sratio.p <dbl>, Steering <fct>, Tank <dbl>, Tires <fct>,
# Trans1 <fct>, Trans2 <fct>, Turning <dbl>, Type <fct>, Weight <dbl>,
# Wheel.base <dbl>, Width <dbl>
Warning messages:
1: In Ops.factor(Country, 100) : ‘>’ not meaningful for factors
2: In Ops.factor(Model2, 100) : ‘>’ not meaningful for factors
3: In Ops.factor(Rim, 100) : ‘>’ not meaningful for factors
4: In Ops.factor(Steering, 100) : ‘>’ not meaningful for factors
5: In Ops.factor(Tires, 100) : ‘>’ not meaningful for factors
6: In Ops.factor(Trans1, 100) : ‘>’ not meaningful for factors
7: In Ops.factor(Trans2, 100) : ‘>’ not meaningful for factors
8: In Ops.factor(Type, 100) : ‘>’ not meaningful for factors
或者篩選出 car_90 資料集中任一變數值都大于 100 ,
> filter_all( car90_df , any_vars( .>100 ))
# A tibble: 111 x 34
Country Disp Disp2 Eng.Rev Front.Hd Frt.Leg.Room Frt.Shld Gear.Ratio Gear2 HP
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Japan 112 1.8 2935 3.5 41.5 53 3.26 3.21 130
2 Japan 163 2.7 2505 2 41.5 55.5 2.95 3.02 160
3 Germany 141 2.3 2775 2.5 41.5 56.5 3.27 3.25 130
4 Germany 121 2 2835 4 42 52.5 3.25 3.25 108
5 Germany 152 2.5 2625 2 42 52 3.02 2.99 168
6 Germany 209 3.5 2285 3 42 54.5 2.8 2.85 208
7 USA 151 2.5 NA 4 42 56.5 NA 2.84 110
8 USA 231 3.8 NA 6 42 58.5 NA 1.99 165
9 USA 231 3.8 NA 5 41 59 NA 1.99 165
10 NA 189 3.1 NA 5.5 41 58 NA 2.33 101
# … with 101 more rows, and 24 more variables: HP.revs <dbl>, Height <dbl>,
# Length <dbl>, Luggage <dbl>, Mileage <dbl>, Model2 <fct>, Price <dbl>,
# Rear.Hd <dbl>, Rear.Seating <dbl>, RearShld <dbl>, Reliability <ord>,
# Rim <fct>, Sratio.m <dbl>, Sratio.p <dbl>, Steering <fct>, Tank <dbl>,
# Tires <fct>, Trans1 <fct>, Trans2 <fct>, Turning <dbl>, Type <fct>,
# Weight <dbl>, Wheel.base <dbl>, Width <dbl>
Warning messages:
1: In Ops.factor(Country, 100) : ‘>’ not meaningful for factors
2: In Ops.factor(Model2, 100) : ‘>’ not meaningful for factors
3: In Ops.factor(Rim, 100) : ‘>’ not meaningful for factors
4: In Ops.factor(Steering, 100) : ‘>’ not meaningful for factors
5: In Ops.factor(Tires, 100) : ‘>’ not meaningful for factors
6: In Ops.factor(Trans1, 100) : ‘>’ not meaningful for factors
7: In Ops.factor(Trans2, 100) : ‘>’ not meaningful for factors
8: In Ops.factor(Type, 100) : ‘>’ not meaningful for factors
如果需要選取資料集中的部分行,則可以用
silce()函式, 例如,選取 car90_df 資料集中的前 20 行,
> slice( car90_df , 1:20 )
# A tibble: 20 x 34
Country Disp Disp2 Eng.Rev Front.Hd Frt.Leg.Room Frt.Shld Gear.Ratio Gear2 HP
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Japan 112 1.8 2935 3.5 41.5 53 3.26 3.21 130
2 Japan 163 2.7 2505 2 41.5 55.5 2.95 3.02 160
3 Germany 141 2.3 2775 2.5 41.5 56.5 3.27 3.25 130
4 Germany 121 2 2835 4 42 52.5 3.25 3.25 108
5 Germany 152 2.5 2625 2 42 52 3.02 2.99 168
6 Germany 209 3.5 2285 3 42 54.5 2.8 2.85 208
7 USA 151 2.5 NA 4 42 56.5 NA 2.84 110
8 USA 231 3.8 NA 6 42 58.5 NA 1.99 165
9 USA 231 3.8 NA 5 41 59 NA 1.99 165
10 NA 189 3.1 NA 5.5 41 58 NA 2.33 101
11 USA 231 3.8 NA 3.5 41.5 58 NA 1.99 165
12 USA 307 5 NA 5 43 60.5 NA 1.96 140
13 USA 273 4.5 NA 6 42 59.5 NA 2.08 180
14 USA 273 4.5 NA 3 42 58 NA 2.08 180
15 NA NA NA NA 3 42 57.5 NA NA NA
16 USA 262 4.3 1630 5 42 61.5 2.07 2.26 150
17 USA 133 2.2 2375 3.5 42 55.5 2.83 3.18 95
18 USA 191 3.1 2085 3.5 41.5 58 2.6 2.26 140
19 USA 305 5 NA 5 41 61 NA 1.83 170
20 USA 133 2.2 2160 4 41 53.5 2.55 2.84 95
# … with 24 more variables: HP.revs <dbl>, Height <dbl>, Length <dbl>,
# Luggage <dbl>, Mileage <dbl>, Model2 <fct>, Price <dbl>, Rear.Hd <dbl>,
# Rear.Seating <dbl>, RearShld <dbl>, Reliability <ord>, Rim <fct>,
# Sratio.m <dbl>, Sratio.p <dbl>, Steering <fct>, Tank <dbl>, Tires <fct>,
# Trans1 <fct>, Trans2 <fct>, Turning <dbl>, Type <fct>, Weight <dbl>,
# Wheel.base <dbl>, Width <dbl>
dplyr 包還可以實作從資料集中隨機抽取樣本,在建模時,當需要把樣本隨機劃分訓練集和測驗集時就很有用,
> sample_n( car90_df , 20 ) # 隨機從資料集中選取20個樣本
# A tibble: 20 x 34
Country Disp Disp2 Eng.Rev Front.Hd Frt.Leg.Room Frt.Shld Gear.Ratio Gear2 HP
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Japan 80 1.3 2430 1.5 42 53 2.86 2.81 160
2 USA 114 1.9 2320 3.5 41 51.5 2.66 3.26 90
3 Japan 112 1.8 2935 3.5 41.5 53 3.26 3.21 130
4 USA 153 2.5 2160 4 41.5 54.5 2.51 3.02 150
5 NA 231 3.8 NA 4 42 59 NA 1.99 165
6 USA 133 2.2 2530 3 41.5 54.5 2.94 2.59 110
7 USA 273 4.5 NA 3 42 58 NA 2.08 180
8 Japan 146 2.4 2395 3.5 40.5 55 2.75 2.53 138
9 USA 302 5 NA 3 42 56 NA 2.06 225
10 Japan/… 91 1.5 2855 3.5 41 53.5 3.13 3.28 92
11 Japan 109 1.8 2935 2 42 53 3.29 2.69 97
12 France 132 2.2 NA 2.5 42 55.5 NA 3.38 120
13 NA NA NA NA 4 41.5 54.5 NA NA NA
14 Korea 90 1.5 2825 2.5 41 52 3.12 2.78 81
15 Japan 181 3 NA 1.5 40 53.5 NA 2.54 142
16 USA 151 2.5 NA 4 42 56.5 NA 2.84 110
17 Korea 90 1.5 2825 4 40 52 3.12 2.78 81
18 Japan 180 3 2350 2 41.5 56.5 2.9 2.53 160
19 Japan/… 97 1.6 2765 4 40.5 53 3.03 3.53 102
20 USA 97 1.6 3125 4.5 41 53.5 3.47 2.78 113
# … with 24 more variables: HP.revs <dbl>, Height <dbl>, Length <dbl>,
# Luggage <dbl>, Mileage <dbl>, Model2 <fct>, Price <dbl>, Rear.Hd <dbl>,
# Rear.Seating <dbl>, RearShld <dbl>, Reliability <ord>, Rim <fct>,
# Sratio.m <dbl>, Sratio.p <dbl>, Steering <fct>, Tank <dbl>, Tires <fct>,
# Trans1 <fct>, Trans2 <fct>, Turning <dbl>, Type <fct>, Weight <dbl>,
# Wheel.base <dbl>, Width <dbl>
> sample_frac( car90_df , 0.2 ) # 隨機從資料集中選取20%的樣本
# A tibble: 22 x 34
Country Disp Disp2 Eng.Rev Front.Hd Frt.Leg.Room Frt.Shld Gear.Ratio Gear2 HP
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Brazil 109 1.8 2765 3 42 51.5 3.03 NA 81
2 Korea 98 1.6 2295 5 41.5 53.5 2.64 3.43 74
3 Japan 180 3 NA 2 41 55 NA 2.76 190
4 USA 97 1.6 3125 4.5 41 53.5 3.47 2.78 113
5 USA 153 2.5 2160 4 41.5 54.5 2.51 3.02 150
6 Mexico 109 1.8 3000 3.5 41.5 53 3.26 NA 105
7 Sweden 141 2.3 2330 3.5 41.5 54 2.71 2.57 114
8 USA 153 2.5 NA 4 42 57.5 NA 3.26 90
9 Japan 180 3 2350 2 41.5 56.5 2.9 2.53 160
10 USA 135 2.2 2280 3 41 51.5 2.55 2.78 93
# … with 12 more rows, and 24 more variables: HP.revs <dbl>, Height <dbl>,
# Length <dbl>, Luggage <dbl>, Mileage <dbl>, Model2 <fct>, Price <dbl>,
# Rear.Hd <dbl>, Rear.Seating <dbl>, RearShld <dbl>, Reliability <ord>,
# Rim <fct>, Sratio.m <dbl>, Sratio.p <dbl>, Steering <fct>, Tank <dbl>,
# Tires <fct>, Trans1 <fct>, Trans2 <fct>, Turning <dbl>, Type <fct>,
# Weight <dbl>, Wheel.base <dbl>, Width <dbl>
> sample_frac( car90_df , 2 , replace = TRUE ) # 重復抽樣選取兩倍樣本
# A tibble: 222 x 34
Country Disp Disp2 Eng.Rev Front.Hd Frt.Leg.Room Frt.Shld Gear.Ratio Gear2 HP
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Korea 81 1.3 2545 4 40.5 52 2.61 3.23 63
2 USA 153 2.5 NA 4 42 57.5 NA 3.26 90
3 USA 202 3.3 NA 4 42 56 NA 2.36 150
4 Germany 181 3 NA 3 42.5 56 NA 2.87 177
5 USA 114 1.9 2320 3.5 41 51.5 2.66 3.26 90
6 Japan/… 91 1.5 2855 3.5 41 53.5 3.13 3.28 92
7 USA 140 2.3 2225 3.5 41 55.5 2.73 2.8 88
8 Germany 209 3.5 2285 3 42 54.5 2.8 2.85 208
9 USA 191 3.1 NA 4.5 41 60.5 NA 3.18 120
10 USA 202 3.3 NA 4 40.5 58 NA 2.36 150
# … with 212 more rows, and 24 more variables: HP.revs <dbl>, Height <dbl>,
# Length <dbl>, Luggage <dbl>, Mileage <dbl>, Model2 <fct>, Price <dbl>,
# Rear.Hd <dbl>, Rear.Seating <dbl>, RearShld <dbl>, Reliability <ord>,
# Rim <fct>, Sratio.m <dbl>, Sratio.p <dbl>, Steering <fct>, Tank <dbl>,
# Tires <fct>, Trans1 <fct>, Trans2 <fct>, Turning <dbl>, Type <fct>,
# Weight <dbl>, Wheel.base <dbl>, Width <dbl>
2. 資料排序
arrange()函式可以實作按給定的列名依次排序,例如,按差您國和汽車型別的順序將 car_df 資料集進行重新升序排序,
> arrange( car90_df , Country , Type )
# A tibble: 111 x 34
Country Disp Disp2 Eng.Rev Front.Hd Frt.Leg.Room Frt.Shld Gear.Ratio Gear2 HP
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Brazil 109 1.8 2765 3 42 51.5 3.03 NA 81
2 England 163 2.7 2470 2 42 55 2.95 3.02 160
3 France 116 2 2760 4 41 55.5 3.08 3.12 120
4 France 132 2.2 NA 2.5 42 55.5 NA 3.38 120
5 Germany 121 2 2835 4 42 52.5 3.25 3.25 108
6 Germany 152 2.5 2625 2 42 52 3.02 2.99 168
7 Germany 159 2.6 2780 2 44 53.5 3.27 3.27 158
8 Germany 141 2.3 2775 2.5 41.5 56.5 3.27 3.25 130
9 Germany 209 3.5 2285 3 42 54.5 2.8 2.85 208
10 Germany 181 3 NA 3 42.5 56 NA 2.87 177
對列名加
desc()可按該列進行倒序排序,
> arrange( car90_df , desc( Weight ))
# A tibble: 111 x 34
Country Disp Disp2 Eng.Rev Front.Hd Frt.Leg.Room Frt.Shld Gear.Ratio Gear2 HP
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 USA 307 5 NA 5 43 60.5 NA 1.96 140
2 USA 302 5 NA 4.5 41 62 NA 2.06 150
3 USA 262 4.3 1630 5 42 61.5 2.07 2.26 150
4 Japan 274 4.5 NA 2.5 41.5 57.5 NA 2.46 278
5 Japan 242 4 NA 3 43 57 NA 2.55 250
6 USA 305 5 NA 5 41 61 NA 1.83 170
7 USA 302 5 NA 3.5 41.5 61.5 NA 1.83 150
8 USA 302 5 NA 3 42 56 NA 2.06 225
9 USA 202 3.3 NA 4 40.5 58 NA 2.36 150
10 Japan 181 3 2510 5 41 57.5 3.04 2.71 150
3.變數選取
如果想選擇部分列構建子資料集,可以使用 dplyr 包中的
select()函式進行這個函式用列名作為引數來選擇子資料集,可以用 “: " 來鏈接列名,就是把列名當數字一樣使用,還可以用”-"來排除列名,例如,徐阿內爾 car90_df 資料集中 Country、 Disp、 Disp2 和 Eng.Rev 這四列資料,選擇 Country 到 Eng.Rev 的所有資料,洗掉從 Country 到 Eng.Rev 的所有資料,
> select( car90_df , Country , Disp , Disp2 , Eng.Rev )
> select( car90_df , Country : Eng.Rev ) # 篩選出Country到Eng.Rev的列
# A tibble: 111 x 4
Country Disp Disp2 Eng.Rev
<fct> <dbl> <dbl> <dbl>
1 Japan 112 1.8 2935
2 Japan 163 2.7 2505
3 Germany 141 2.3 2775
4 Germany 121 2 2835
5 Germany 152 2.5 2625
6 Germany 209 3.5 2285
7 USA 151 2.5 NA
8 USA 231 3.8 NA
9 USA 231 3.8 NA
10 NA 189 3.1 NA
# … with 101 more rows
> select( car90_df , -( Country : Eng.Rev )) # 剔除COuntry到Eng.Rev的列
# A tibble: 111 x 30
Front.Hd Frt.Leg.Room Frt.Shld Gear.Ratio Gear2 HP HP.revs Height Length
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 3.5 41.5 53 3.26 3.21 130 6000 47.5 177
2 2 41.5 55.5 2.95 3.02 160 5900 50 191
3 2.5 41.5 56.5 3.27 3.25 130 5500 51.5 193
4 4 42 52.5 3.25 3.25 108 5300 50.5 176
5 2 42 52 3.02 2.99 168 5800 49.5 175
6 3 42 54.5 2.8 2.85 208 5700 51 186
7 4 42 56.5 NA 2.84 110 5200 49.5 189
8 6 42 58.5 NA 1.99 165 4800 50.5 197
9 5 41 59 NA 1.99 165 4800 51 197
10 5.5 41 58 NA 2.33 101 4400 50.5 192
另外,將 iris 資料集中的 petal 開頭的兩列篩選出來,或者 width 結尾的兩列都篩選出來,
> select( iris , starts_with( 'Petal' )) # 選擇以petal字符開頭的變數
Petal.Length Petal.Width
1 1.4 0.2
2 1.4 0.2
3 1.3 0.2
> select( iris , ends_with( 'Width' )) # 選擇一Width 字符結尾的變數
Sepal.Width Petal.Width
1 3.5 0.2
2 3.0 0.2
3 3.2 0.2
> select( iris , matches( '.t.' )) # 正則運算式匹配,回傳變數名中包含t的列
Sepal.Length Sepal.Width Petal.Length Petal.Width
1 5.1 3.5 1.4 0.2
2 4.9 3.0 1.4 0.2
3 4.7 3.2 1.3 0.2
此外,
contains(x)選擇所有包含 x 得變數,matches(x)選擇匹配正則運算式變數,num_range('x',1:5,width = 2)選擇 x01 到 x05 的變數,
4.資料變形
對已有的列進行資料運算并添加新列,可以使用
mutate()函式, 并且mutate()函式可以在同一陳述句中對新增加的列進行操作,
例如,計算手動變速器和自動變速器齒輪轉動比的差 (gear.Ratio-Gear2),
> mutate( car90_df , diff = Gear.Ratio - Gear2 )
# A tibble: 111 x 35
Country Disp Disp2 Eng.Rev Front.Hd Frt.Leg.Room Frt.Shld Gear.Ratio Gear2 HP
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Japan 112 1.8 2935 3.5 41.5 53 3.26 3.21 130
2 Japan 163 2.7 2505 2 41.5 55.5 2.95 3.02 160
3 Germany 141 2.3 2775 2.5 41.5 56.5 3.27 3.25 130
4 Germany 121 2 2835 4 42 52.5 3.25 3.25 108
5 Germany 152 2.5 2625 2 42 52 3.02 2.99 168
6 Germany 209 3.5 2285 3 42 54.5 2.8 2.85 208
7 USA 151 2.5 NA 4 42 56.5 NA 2.84 110
8 USA 231 3.8 NA 6 42 58.5 NA 1.99 165
9 USA 231 3.8 NA 5 41 59 NA 1.99 165
10 NA 189 3.1 NA 5.5 41 58 NA 2.33 101
# … with 101 more rows, and 25 more variables: HP.revs <dbl>, Height <dbl>,
# Length <dbl>, Luggage <dbl>, Mileage <dbl>, Model2 <fct>, Price <dbl>,
# Rear.Hd <dbl>, Rear.Seating <dbl>, RearShld <dbl>, Reliability <ord>,
# Rim <fct>, Sratio.m <dbl>, Sratio.p <dbl>, Steering <fct>, Tank <dbl>,
# Tires <fct>, Trans1 <fct>, Trans2 <fct>, Turning <dbl>, Type <fct>,
# Weight <dbl>, Wheel.base <dbl>, Width <dbl>, diff <dbl>
5.匯總操作
dplyr 包中的
summarise()函式可以對呼叫其他函式鎖執行的操作進行匯總,回傳一個一維結果,
> summarise( car90_df , a = n_distinct( Country ), b = mean( Price,na.rm = TRUE ),c = max( Luggage ))
# A tibble: 1 x 3
a b c
<int> <dbl> <dbl>
1 11 15805. 22
summarise()與mean()、median()、sd()、quantile()等函式結合起來,可以回傳想要的匯總資料,
6.資料分組
在 dplyr 包中, 有一個很好用的功能是
group_by()函式對資料集進行分組操作,當資料集通過group_by()添加了分組資訊后,mutate()、arrange()和summarise()函式會自動對這些tbl類資料執行分組操作,
例如對 car90_df 資料集按汽車型別(Type)進行分組,計算不同型別汽車數(count = n())和平均價格(meanprice = mean(Price, na.rm = TRUE)),
> cars <- group_by( hflights_df , Type )
> analysis <- summarise( cars , count = n() , meanprice = mean ( Price , na.rm = TRUE ))
7.變數重命名
dplyr 包中使用
rename()函式實作變數重命名,
> rename( car90_df , Eng_Rev = Eng.Rev )
# A tibble: 111 x 34
Country Disp Disp2 Eng_Rev Front.Hd Frt.Leg.Room Frt.Shld Gear.Ratio Gear2 HP
<fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Japan 112 1.8 2935 3.5 41.5 53 3.26 3.21 130
2 Japan 163 2.7 2505 2 41.5 55.5 2.95 3.02 160
3 Germany 141 2.3 2775 2.5 41.5 56.5 3.27 3.25 130
4 Germany 121 2 2835 4 42 52.5 3.25 3.25 108
5 Germany 152 2.5 2625 2 42 52 3.02 2.99 168
6 Germany 209 3.5 2285 3 42 54.5 2.8 2.85 208
7 USA 151 2.5 NA 4 42 56.5 NA 2.84 110
8 USA 231 3.8 NA 6 42 58.5 NA 1.99 165
9 USA 231 3.8 NA 5 41 59 NA 1.99 165
10 NA 189 3.1 NA 5.5 41 58 NA 2.33 101
# … with 101 more rows, and 24 more variables: HP.revs <dbl>, Height <dbl>,
# Length <dbl>, Luggage <dbl>, Mileage <dbl>, Model2 <fct>, Price <dbl>,
# Rear.Hd <dbl>, Rear.Seating <dbl>, RearShld <dbl>, Reliability <ord>,
# Rim <fct>, Sratio.m <dbl>, Sratio.p <dbl>, Steering <fct>, Tank <dbl>,
# Tires <fct>, Trans1 <fct>, Trans2 <fct>, Turning <dbl>, Type <fct>,
# Weight <dbl>, Wheel.base <dbl>, Width <dbl>
此外, 重命名函式還有
rename_all()、rename_at()、rename_if(),
8.其他小函式
dplyr 包中其他使用的小函式:
| 函式 | 功能 |
|---|---|
| n() | 計算個數 |
| n_distinct() | 計算唯一值的個數 |
| first(x) | 類似自帶函式 x[ 1 ] |
| last(x) | 類似自帶函式 x[ length(x)] |
| nth(x,n) | 類似自帶函式 x[n] |
| top_n(x, n) | 篩選最大或者最小(n為負)的n個數 |
同時,這些小函式可以與
summarise()、mutate()和filter()函式結合使用,
> summarise( car90_df , a = n_distinct( Country ))
# A tibble: 1 x 1
a
<int>
1 11
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/256839.html
標籤:其他
上一篇:服務配置中心:Config
