R(6): 數據處理包dplyr

    dplyr包是Hadley Wickham的新做,主要用於數據清洗和整理,該包專一dataframe數據格式,從而大幅提升了數據處理速度,而且提供了與其它數據庫的接口,本節學習dplyr包函數基本用法。dplyr()可以使用%>%(鏈式操做),其功能是用於實現將一個函數的輸出傳遞給下一個函數的第一個參數。注意,傳遞給下一個函數的第一個參數,那麼下一個函數的第一個參數就不用寫。正則表達式

目錄:數據庫

  • 篩選: filter()
  • 排列: arrange()
  • 選擇: select()
  • 變形: mutate()
  • 彙總: summarise()
  • 分組: group_by()
  • 數據關連
  • bind

篩選: filter()函數


  •  dplyr包安裝及載入,使用datasets包中的mtcars數據集作演示,首先將過長的數據整理成友好的tbl_df數據:
    install.packages("dplyr")
    library(dplyr)
    mtcars_df = tbl_df(mtcars)
  • 按給定的邏輯判斷篩選出符合要求的子數據集
  • 注意:只能將指定條件的觀測篩選出來,爲了彌補這個缺陷,可使用select()函數篩選指定的變量,並且比subset()函數更靈活,並且選擇變量的同時也能夠從新命名變量。若是剔除某些變量的話,只需在變量前加上負號「-」。之因此說他比subset()函數靈活,是由於能夠在select()函數傳遞以下參數:
    1. starts_with(x, ignor.case = TRUE)#選擇以字符x開頭的變量
    2. ends_with(x, ignor.case = TRUE)#選擇以字符x結尾的變量
    3. contains(x, ignor.case = TRUE)#選擇全部包含x的變量
    4. matches(x, ignor.case = TRUE)#選擇匹配正則表達式的變量
    5. num_range('x', 1:5, width = 2)#選擇x01到x05的變量
    6. one_of('x','y','z')#選擇包含在聲明變量中的
    7. everything()#選擇全部變量,通常調整數據集中變量順序時使用
  • > filter(mtcars_df, hp<110 & vs == 1)
    # A tibble: 10 × 11
         mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
       <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    1   22.8     4 108.0    93  3.85 2.320 18.61     1     1     4     1
    2   18.1     6 225.0   105  2.76 3.460 20.22     1     0     3     1
    3   24.4     4 146.7    62  3.69 3.190 20.00     1     0     4     2
    4   22.8     4 140.8    95  3.92 3.150 22.90     1     0     4     2

排列: arrange()學習


  • 按給定的列名依次對行進行排序:
    > a <- head(mtcars_df,2)
    > a
    # A tibble: 2 × 11
        mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    1    21     6   160   110   3.9 2.620 16.46     0     1     4     4
    2    21     6   160   110   3.9 2.875 17.02     0     1     4     4
    > arrange(a,desc(wt,qsec))
    # A tibble: 2 × 11
        mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    1    21     6   160   110   3.9 2.875 17.02     0     1     4     4
    2    21     6   160   110   3.9 2.620 16.46     0     1     4     4
    > arrange(a,wt,qsec)
    # A tibble: 2 × 11
        mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
      <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
    1    21     6   160   110   3.9 2.620 16.46     0     1     4     4
    2    21     6   160   110   3.9 2.875 17.02     0     1     4     4

選擇: select()spa


  • 用列名做參數來選擇子數據集:
    > mtcars_df %>% select(mpg,wt,qsec)
    # A tibble: 32 × 3
         mpg    wt  qsec
    *  <dbl> <dbl> <dbl>
    1   21.0 2.620 16.46
    2   21.0 2.875 17.02

變形: mutate()code


  • 對已有列進行數據運算並添加爲新列:
    > mutate(mtcars_df, NO = 1:dim(mtcars_df)[1])
    # A tibble: 32 × 12
         mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb    NO
       <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
    1   21.0     6 160.0   110  3.90 2.620 16.46     0     1     4     4     1
    2   21.0     6 160.0   110  3.90 2.875 17.02     0     1     4     4     2
    3   22.8     4 108.0    93  3.85 2.320 18.61     1     1     4     1     3
    4   21.4     6 258.0   110  3.08 3.215 19.44     1     0     3     1     4
    5   18.7     8 360.0   175  3.15 3.440 17.02     0     0     3     2     5
    6   18.1     6 225.0   105  2.76 3.460 20.22     1     0     3     1     6

彙總: summarise()對象


  • 對數據框調用其它函數進行彙總操做, 返回一維的結果:
    > summarise(mtcars, mean(disp))
      mean(disp)
    1   230.7219
    > summarise(group_by(mtcars, cyl), mean(disp))
    # A tibble: 3 × 2
        cyl `mean(disp)`
      <dbl>        <dbl>
    1     4     105.1364
    2     6     183.3143
    3     8     353.1000
  • 能夠用來聚合的函數有:  
    1. min():返回最小值
    2. max():返回最大值
    3. mean():返回均值
    4. sum():返回總和
    5. sd():返回標準差
    6. median():返回中位數
    7. IQR():返回四分位極差
    8. n():返回觀測個數
    9. n_distinct():返回不一樣的觀測個數
    10. first():返回第一個觀測
    11. last():返回最後一個觀測
    12. nth():返回n個觀測

分組: group_by()blog


  • 當對數據集經過group_by()添加了分組信息後,mutate(),arrange() 和 summarise() 函數會自動對這些 tbl 類數據執行分組操做。
    > cars <- group_by(mtcars_df, cyl)
    > summarise(cars, count = n()) # count = n()用來計算次數
    # A tibble: 3 × 2
        cyl count
      <dbl> <int>
    1     4    11
    2     6     7
    3     8    14

 數據關連排序


  • 數據庫中常常須要將多個表進行鏈接操做,如左鏈接、右鏈接、內鏈接等,這裏dplyr包也提供了數據集的鏈接操做,具體以下
    1. left_join(a, b, by="x1")
    2. right_join(a, b, by="x1")
    3. inner_join(a, b, by="x1")
    4. outer_join(a, b, by="x1")
    5. semi_join(a, b, by="x1") # 數據集a中能與數據集b匹配的記錄
    6. anti_join(a, b, by="x1") # 數據集a中雨數據集b不匹配的記錄
    7. intersect(x, y): x 和 y 的交集(按行)
    8. union(x, y): x 和 y 的並集(按行)
    9. setdiff(x, y): x 和 y 的補集 (在x中不在y中)

bind接口


    • 在R基礎包裏有cbind()函數和rbind()函數實現按列的方向進行數據合併和按行的方向進行數據合併,而在dplyr包中也添加了相似功能的函數,它們是bind_cols()函數和bind_rows()函數
    • bind_rows()函數須要兩個數據框或tbl對象有相同的列數,而bind_cols()函數則須要兩個數據框或tbl對象有相同的行數。
      mydf1 <- data.frame(x = c(1,2,3,4), y = c(10,20,30,40))
      mydf2 <- data.frame(x = c(5,6), y = c(50,60))
      mydf3 <- data.frame(z = c(100,200,300,400))
      bind_rows(mydf1, mydf2)
      bind_cols(mydf1, mydf3)
相關文章
相關標籤/搜索