dplyr

島田 芳男
2015/09/08

使い方

基本関数は5つ。

これにgroup_byを組み合わせることで集計していく。

関数名 _ 内容_ 類似の組み込み関数

filter _ 指定した条件に合うデータを抽出_ subset

select _ 列を抽出 _ data[,c('hoge','fuga')]などと同じ

mutate _ 列を追加 _ transform

arrange _ 並び替え _ order, sort

summarise _ 集約する _ aggregate

filterで抽出

filterは条件に沿った行を抽出する。

使い方としては、最初の引数にデータフレームを指定して2つ目以降の引数に条件を指定する。

この書き方は他の関数においても同じ。

AND条件の時はカンマで区切るだけで良い(&を使っても良い)。

OR条件の時は|演算子でつなぐ。

# install.packages(c("dplyr","hflights")
library(dplyr)
library(hflights)
dim(hflights)
[1] 227496     21

hflightsデータはデータ数が大きいのでtbl_df形式に変換しておく

hflights_df <- tbl_df(hflights)
head(hflights_df,3)
Source: local data frame [3 x 21]

  Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
1 2011     1          1         6    1400    1500            AA       428
2 2011     1          2         7    1401    1501            AA       428
3 2011     1          3         1    1352    1502            AA       428
Variables not shown: TailNum (chr), ActualElapsedTime (int), AirTime
  (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest (chr),
  Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
  CancellationCode (chr), Diverted (int)

filterで抽出

filterは条件に沿った行を抽出する。

使い方としては、最初の引数にデータフレームを指定して2つ目以降の引数に条件を指定する。

この書き方は他の関数においても同じ。

AND条件の時はカンマで区切るだけで良い(&を使っても良い)。

OR条件の時は|演算子でつなぐ。

head(filter(hflights_df, Month==1, DayofMonth==1),3)
Source: local data frame [3 x 21]

  Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
1 2011     1          1         6    1400    1500            AA       428
2 2011     1          1         6     728     840            AA       460
3 2011     1          1         6    1631    1736            AA      1121
Variables not shown: TailNum (chr), ActualElapsedTime (int), AirTime
  (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest (chr),
  Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
  CancellationCode (chr), Diverted (int)

```

head(filter(hflights_df, Month==1|DayofMonth==1),3)
Source: local data frame [3 x 21]

  Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
1 2011     1          1         6    1400    1500            AA       428
2 2011     1          2         7    1401    1501            AA       428
3 2011     1          3         1    1352    1502            AA       428
Variables not shown: TailNum (chr), ActualElapsedTime (int), AirTime
  (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest (chr),
  Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
  CancellationCode (chr), Diverted (int)

selectとmutateで列を操作

selectは列を抽出する。

複数列を指定する時は、カンマで区切る。

隣接した列なら:で指定できる。

指定した列以外を抽出したい時はカッコで囲んで-をつける。

複数列を指定する時は、カンマで区切る。

head(select(hflights_df, Year, Month, DayOfWeek),5)
Source: local data frame [5 x 3]

  Year Month DayOfWeek
1 2011     1         6
2 2011     1         7
3 2011     1         1
4 2011     1         2
5 2011     1         3

隣接した列なら:で指定できる。

head(select(hflights_df, Year:DayOfWeek),5)
Source: local data frame [5 x 4]

  Year Month DayofMonth DayOfWeek
1 2011     1          1         6
2 2011     1          2         7
3 2011     1          3         1
4 2011     1          4         2
5 2011     1          5         3

指定した列以外を抽出したい時はカッコで囲んで-をつける。

head(select(hflights_df, -(Year:DayOfWeek)),3)
Source: local data frame [3 x 17]

  DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime
1    1400    1500            AA       428  N576AA                60
2    1401    1501            AA       428  N557AA                60
3    1352    1502            AA       428  N541AA                70
Variables not shown: AirTime (int), ArrDelay (int), DepDelay (int), Origin
  (chr), Dest (chr), Distance (int), TaxiIn (int), TaxiOut (int),
  Cancelled (int), CancellationCode (chr), Diverted (int)

mutateは列を追加する。

似たような働きをする関数にplyrパッケージのtransformがあるが、mutateは新しく追加した列を同一操作内で指定できる

head(
  mutate(hflights_df, gain=ArrDelay - DepDelay, gain_per_hour=gain/(AirTime/60)),2)
Source: local data frame [2 x 23]

  Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
1 2011     1          1         6    1400    1500            AA       428
2 2011     1          2         7    1401    1501            AA       428
Variables not shown: TailNum (chr), ActualElapsedTime (int), AirTime
  (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest (chr),
  Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
  CancellationCode (chr), Diverted (int), gain (int), gain_per_hour (dbl)

arrangeで並び替え_1

arrangeは指定した列において並び替える

head(
  arrange(hflights_df, ArrDelay, Month),3)
Source: local data frame [3 x 21]

  Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
1 2011     7          3         7    1914    2039            XE      2804
2 2011    12         25         7     741     926            OO      4591
3 2011     8         21         7     935    1039            OO      2001
Variables not shown: TailNum (chr), ActualElapsedTime (int), AirTime
  (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest (chr),
  Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
  CancellationCode (chr), Diverted (int)

arrangeで並び替え_2

desc関数と組み合わせることで逆順に並べられる。

head(
arrange(hflights_df, desc(ArrDelay)),3)
Source: local data frame [3 x 21]

  Year Month DayofMonth DayOfWeek DepTime ArrTime UniqueCarrier FlightNum
1 2011    12         12         1     650     808            AA      1740
2 2011     8          1         1     156     452            CO         1
3 2011    11          8         2     721     948            MQ      3786
Variables not shown: TailNum (chr), ActualElapsedTime (int), AirTime
  (int), ArrDelay (int), DepDelay (int), Origin (chr), Dest (chr),
  Distance (int), TaxiIn (int), TaxiOut (int), Cancelled (int),
  CancellationCode (chr), Diverted (int)

summariseで集約

summariseは関数を指定することで、その関数で集約した結果を得ることができる

summarise(hflights_df, delay=mean(DepDelay, na.rm=TRUE))
Source: local data frame [1 x 1]

     delay
1 9.444951

group_byでグループ化

group_byで指定した列でもって、グループ化することができる。 この結果にこれまで挙げてきた関数を適用することで、グループ単位の結果が得られる。

planes <- group_by(hflights_df, TailNum)
delay <- summarise(planes,
                   count=n(),
                   dist=mean(Distance, na.rm=TRUE),
                   delay=mean(ArrDelay, na.rm=TRUE))
delay <- filter(delay, count>20, dist<2000)
head(delay,5)
Source: local data frame [5 x 4]

  TailNum count      dist     delay
1           795  938.7157       NaN
2  N0EGMQ    40 1095.2500  1.918919
3  N10156   317  801.7192  8.199357
4  N10575    94  631.5319 18.148936
5  N11106   308  774.9805 10.101639

視覚化

library(ggplot2)
ggplot(delay, aes(dist, delay)) + 
  geom_point(aes(size=count), alpha=1/2) + 
  geom_smooth() + 
  scale_size_area()

plot of chunk unnamed-chunk-13