dplyrでデータ処理

dplyrパッケージを用いれば、レコード数や変数の多いデータの処理が高速に行える。
特に、変数が増えても処理速度は変わらない。

データ例

MASSパッケージのbirthwtを用いる

data(birthwt,package="MASS")
head(d <- birthwt)
##    low age lwt race smoke ptl ht ui ftv  bwt
## 85   0  19 182    2     0   0  0  1   0 2523
## 86   0  33 155    3     0   0  0  0   3 2551
## 87   0  20 105    1     1   0  0  0   1 2557
## 88   0  21 108    1     1   0  0  1   2 2594
## 89   0  18 107    1     1   0  0  1   0 2600
## 91   0  21 124    3     0   0  0  0   0 2622

filterで行(レコード)を抽出

  • AND,で繋げる
  • OR|で繋げる
library(dplyr)
filter(d,smoke==1,age<=20,bwt<=2000)
##   low age lwt race smoke ptl ht ui ftv  bwt
## 1   1  19  91    1     1   2  0  1   0 1885
## 2   1  20 150    1     1   0  0  0   2 1928
filter(d,smoke==1,age<=20,bwt<=2000|bwt>=4000)
##   low age lwt race smoke ptl ht ui ftv  bwt
## 1   0  19 120    1     1   0  0  0   0 4238
## 2   1  19  91    1     1   2  0  1   0 1885
## 3   1  20 150    1     1   0  0  0   2 1928

selectで列(変数)を抽出

  • AND,で繋げる
  • 除外する変数は-をつける
  • 隣接する変数は:で表せる
head(select(d,low,age,lwt))
##    low age lwt
## 85   0  19 182
## 86   0  33 155
## 87   0  20 105
## 88   0  21 108
## 89   0  18 107
## 91   0  21 124
head(select(d,low:lwt))
##    low age lwt
## 85   0  19 182
## 86   0  33 155
## 87   0  20 105
## 88   0  21 108
## 89   0  18 107
## 91   0  21 124
head(select(d,-(low:lwt)))
##    race smoke ptl ht ui ftv  bwt
## 85    2     0   0  0  1   0 2523
## 86    3     0   0  0  0   3 2551
## 87    1     1   0  0  0   1 2557
## 88    1     1   0  0  1   2 2594
## 89    1     1   0  0  1   0 2600
## 91    3     0   0  0  0   0 2622

mutateで変数を追加

head(
  mutate(d,bwt.kg=bwt/1000,
         bwt.kg.cat=cut(bwt.kg,breaks=c(0,2.5,5)))
  )
##   low age lwt race smoke ptl ht ui ftv  bwt bwt.kg bwt.kg.cat
## 1   0  19 182    2     0   0  0  1   0 2523  2.523    (2.5,5]
## 2   0  33 155    3     0   0  0  0   3 2551  2.551    (2.5,5]
## 3   0  20 105    1     1   0  0  0   1 2557  2.557    (2.5,5]
## 4   0  21 108    1     1   0  0  1   2 2594  2.594    (2.5,5]
## 5   0  18 107    1     1   0  0  1   0 2600  2.600    (2.5,5]
## 6   0  21 124    3     0   0  0  0   0 2622  2.622    (2.5,5]

arrangeで並べ替え

  • 並べ替える変数は,で繋げる
  • desc(...)で降順
head(
  arrange(d,age,desc(bwt))
  )
##   low age lwt race smoke ptl ht ui ftv  bwt
## 1   0  14 135    1     0   0  0  0   0 3941
## 2   1  14 100    3     0   0  0  0   2 2495
## 3   1  14 101    3     1   1  0  0   0 2466
## 4   0  15  98    2     0   0  0  0   0 2778
## 5   1  15 115    3     0   0  0  1   0 2381
## 6   1  15 110    1     0   0  0  0   0 2353

summarizeで要約

  • 複数の要約は,で繋げる
  • n()でカウント
summarize(d,n=n(),m.bwt=mean(bwt),s.bwt=sd(bwt))
##     n    m.bwt    s.bwt
## 1 189 2944.587 729.2143

group_byでグループ化

  • sumamrizeと組合せてグループ別に要約
grouped.d <- group_by(d,smoke,race)
summarize(grouped.d,n=n(),m.bwt=mean(bwt),s.bwt=sd(bwt))
## Source: local data frame [6 x 5]
## Groups: smoke
## 
##   smoke race  n    m.bwt    s.bwt
## 1     0    1 44 3428.750 710.0989
## 2     0    2 16 2854.500 621.2543
## 3     0    3 55 2815.782 709.3493
## 4     1    1 52 2826.846 626.4725
## 5     1    2 10 2504.000 637.0568
## 6     1    3 12 2757.167 810.0446