主頁 > 軟體設計 > 【資料科學筆記】第三章 資料清洗與預處理

【資料科學筆記】第三章 資料清洗與預處理

2021-02-05 14:54:59 軟體設計

【資料科學筆記】第三章 資料清洗與預處理


文章目錄

  • 【資料科學筆記】第三章 資料清洗與預處理
  • 前言
  • 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),

  1. 缺失資料的識別:
    在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. 缺失資料的處理
    (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

下一篇:2021年跳槽該如何準備?c/c++ linux服務器開發崗

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more