株初心者が本気で儲けるブログ

株式投資に関連するテーマについて取り扱ってます。

【R言語】 dplyrを用いたデータ処理方法


dplyrパッケージとはRにおいてデータフレームの操作に特化したパッケージです。
Rにあるplyrでのデータフレームの結合などの処理速度はあまり早くないのですが、dplyrはC++で書かれているので、高速動作が可能となります。


まず関連パッケージのインストールと展開


>install.packages("dplyr")
>library(dplyr)

>install.packages("hflights")
>library(hflights)

>install.packages("devtools")
>library(devtools)


dplyrの操作に必要なコマンドは


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

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

mutate() 列を追加

arrange() 並び替え

summarise() 集約する


の5つです。


ここではサンプルデータhflightを使ってこのパッケージをつかっていきます。


データの説明は下のようになっています。

f:id:oruka199665:20161211191938j:plain

f:id:oruka199665:20161211192240j:plain 


一応行列の大きさを研鑽してくれるdim()関数を使うと


> dim(hflights)
[1] 227496 21

つまり227496行21列の行列であることがわかります。


このようにhflightsはデータが大きすぎるのでそのまま読み込まずtbl_df形式に変換します。


hflights_df <- tbl_df(hflights)


・filter()で抽出

filter()関数は、指定した条件に沿った行を抽出するコマンドです。 使い方としては、最初の引数にデータフレームを指定して2つ目以降の引数に条件を指定します。 この書き方は他の関数においても同じで、 AND条件の時はカンマで区切り OR条件の時は|演算子でつなぎます


>filter(hflights_df, Month==1, DayofMonth==1)


# A tibble: 552 × 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
4 2011 1 1 6 1756 2112 AA 1294



>filter(hflights_df, Month==1|DayofMonth==1)


# A tibble: 25,769 × 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
4 2011 1 4 2 1403 1513 AA 428
5 2011 1 5 3 1405 1507 AA 428
6 2011 1 6 4 1359 1503 AA 428


・select()での列の操作


selectは列を抽出するコマンドです。複数列を指定する時は、カンマで区切ります。


>select(hflights_df, Year, Month, DayOfWeek)


# A tibble: 227,496 × 3
Year Month DayOfWeek

1 2011 1 6
2 2011 1 7
3 2011 1 1
4 2011 1 2
5 2011 1 3
6 2011 1 4
7 2011 1 5
8 2011 1 6
9 2011 1 7
10 2011 1 1
# ... with 227,486 more rows


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


>select(hflights_df, -(Year:DayOfWeek))


# A tibble: 227,496 × 17
DepTime ArrTime UniqueCarrier FlightNum TailNum ActualElapsedTime AirTime

1 1400 1500 AA 428 N576AA 60 40
2 1401 1501 AA 428 N557AA 60 45
3 1352 1502 AA 428 N541AA 70 48
4 1403 1513 AA 428 N403AA 70 39
5 1405 1507 AA 428 N492AA 62 44
6 1359 1503 AA 428 N262AA 64 45
7 1359 1509 AA 428 N493AA 70 43
8 1355 1454 AA 428 N477AA 59 40
9 1443 1554 AA 428 N476AA 71 41
10 1443 1553 AA 428 N504AA 70 45
# ... with 227,486 more rows, and 10 more variables: ArrDelay ,


・mutate()で列の追加


> mutate(hflights_df, gain=ArrDelay - DepDelay, gain_per_hour=gain/(AirTime/60))

# A tibble: 227,496 × 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
3 2011 1 3 1 1352 1502 AA 428


・arrange()での並び替え


arrange()では指定した列の並び替えができます。また、desc()関数と組み合わせることで逆順に並べることもできます。(こっちの方がrev()関数より簡単)


>arrange(hflights_df, ArrDelay, Month)

# A tibble: 227,496 × 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
4 2011 8 31 3 934 1039 OO 2040



・Summarise()関数


集約した結果を得ることができる


> summarise(hflights_df, delay=mean(DepDelay, na.rm=TRUE))


# A tibble: 1 × 1
delay

1 9.444951



・group_by()関数


group_byで指定した列でもって、グループ化することができる。 この結果にこれまで挙げてきた関数を適用することで、グループ単位の結果が得られる。この場合航空会社ごとの到着遅延時間をのメジアンを求めるために、まず航空会社ごとにグループ分けを行います。


>carrier_group<-group_by(hflights_df,UniqueCarrier)

> carrier_group
Source: local data frame [227,496 x 21]
Groups: UniqueCarrier [15]

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
4 2011 1 4 2 1403 1513 AA 428
5 2011 1 5 3 1405 1507 AA 428




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)


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


f:id:oruka199665:20161211230806p:plain



データフレームの他に使えるデータ形式としてdata.tableがありますが、処理になれればこちらの方が早く便利なのでこちらの方がオススメです。



【R言語】dplyrパッケージの使い方 - 暇人の研究室