いずにゃんの研究日記

専門性を広げるための練習場

はじめてのdplyr(1):行のソートと選択,変数のkeepとdropまで

本記事は,Rのパッケージdplyrを自分が数日前に使い始めて感動したので,まだ使ってない人が気軽に使えるようになるための解説である。dplyrが使いこなせれば,データの整理が非常に楽になりそう。

すでにdplyrが話題になって久しいことは感じていたが,なかなか踏み出せずにいた。そんな中, kazutan v3.4.1 (@kazutan) | Twitterさんの記事 qiita.com

で紹介されていた,

"Data Wrangling with dplyr and tidyr"  
「dplyrとtidyrによるデータハンドリングのチートシート」

を見て使い始めてみたら,これは使わないと損だと強く感じたので,自分の知識の定着のためにもこの記事を書いてみた。

すでにdplyrの解説はweb上で大量に見つけられるが,本記事の独自性は以下の点にある。


はじめる前に

いくつか準備しておくべき点や実行環境などを示す。

  • 使用したOSはWindows 7
  • RStudioで実行(version 1.0.44)
  • パッケージdplyrをインストール(本記事執筆時点ではversion 0.5.0)

dplyrが入っていない人は,ネットにつながった環境で以下を実行

install.packages("dplyr")


データを読み込む

データは(自分にとって)なじみやすいものがよいので,2016年を代表するアニメ作品の1つである「ラブライブ!サンシャイン!!」から,スクールアイドルグループAqoursのメンバーのデータを使用する。出典はラブライブ!サンシャイン!! Official Web Site

以下のコードを貼り付けて実行したら,データが読みこまれる。

dat <-
  data.frame(
             name=c("高海千歌","桜内梨子","松浦果南","黒澤ダイヤ","渡辺曜","津島善子","国木田花丸","小原鞠莉","黒澤ルビィ"),
             grade=c(2,2,3,3,2,1,1,3,1),
             height=c(157,160,162,162,157,156,152,163,154),
             B=c(82,80,83,80,82,79,83,87,76),
             W=c(59,58,58,57,57,58,57,60,56),
             H=c(83,82,84,80,81,80,83,84,79)
            )
dat
        name grade height  B  W  H
1   高海千歌     2    157 82 59 83
2   桜内梨子     2    160 80 58 82
3   松浦果南     3    162 83 58 84
4 黒澤ダイヤ     3    162 80 57 80
5     渡辺曜     2    157 82 57 81
6   津島善子     1    156 79 58 80
7 国木田花丸     1    152 83 57 83
8   小原鞠莉     3    163 87 60 84
9 黒澤ルビィ     1    154 76 56 79

変数名のgradeは学年,heightは身長(cm),B・W・Hはスリーサイズである。 さて,それではここから実際にdplyrを使ってみよう。

library(dplyr)


行の並び替え(ソート)

入力したデータは並び方が公式サイト掲載順だったので,まずは変数gradeを使って学年順に並び変えてみる。つまりデータのソートである。チートシートでは,"Reshaping Data"の部分に出てくる。

arrange(dat, grade)
        name grade height  B  W  H
1   津島善子     1    156 79 58 80
2 国木田花丸     1    152 83 57 83
3 黒澤ルビィ     1    154 76 56 79
4   高海千歌     2    157 82 59 83
5   桜内梨子     2    160 80 58 82
6     渡辺曜     2    157 82 57 81
7   松浦果南     3    162 83 58 84
8 黒澤ダイヤ     3    162 80 57 80
9   小原鞠莉     3    163 87 60 84

dplyrの解説でよく目にする書き方は,

dat %>% arrange(grade)

であろう。これも同じことができるし便利なのでこの先はこちらに統一するが,解説は以下の通り。

  • %>%という記号を初めて見た方は何これ?と思うかもしれない。これは,パイプ演算子と呼ばれ,%>%の左側にあるものを右側に渡すことを意味している。
    記号で書くと,x %>% f(y) f(x, y) と同じということになる
  • つまり,いちいちデータセット名のdatを書かなくてもよいことになるから,コードが簡単で見やすくなる。他にも利点はあるけど,解説はまたの機会に
  • RStudioならば,Ctrl+Shift+Mで %>% が出てきて便利。(MacはCmd+Shift+Mらしい)
  • チートシートを見ると,すべてにdplyr::とついているが,library()require()dplyrを呼び出してあれば,これは不要


なお降順にソートするにはキーとなる変数をdesc()で囲む。

dat %>% arrange(desc(grade))


行の選択

たとえば今は9名のデータ(行,ケース,またはオブザベーションとも)が表示されているが,1年生だけ表示したい!という時に使用。チートシートでは,"Subset Observations (Rows)“の部分。

dat %>% filter(grade==1)
        name grade height  B  W  H
1   津島善子     1    156 79 58 80
2 国木田花丸     1    152 83 57 83
3 黒澤ルビィ     1    154 76 56 79

filter( )の中身を変えれば好きなように選択できる。 たとえば,

height>=160  (身長160cm以上)
grade!=2  (2年生以外)
grade==1 & B>80    (1年生かつバスト80より上)
height<155 | height>162 (身長155未満,または身長162より上)

これまでは表示するだけだったが,ケースを選択してそれを新しいデータセットにしたい場合がある。その時は次のようにする

dat_grade3 <- dat %>% filter(grade==3)

3年生だけの新しいデータセットdat_grade3ができているはずである。


変数の選択

変数が多すぎると使いたい変数を探すのも大変だったりするので,使いたい変数を選び出したい時がある。 チートシートでは,"Subset Variables (Columns)“の部分。

名前と学年の変数だけを残す。つまり変数のkeep。

dat %>% select(name, grade)
        name grade
1   高海千歌     2
2   桜内梨子     2
3   松浦果南     3
4 黒澤ダイヤ     3
5     渡辺曜     2
6   津島善子     1
7 国木田花丸     1
8   小原鞠莉     3
9 黒澤ルビィ     1

一方,特定の変数を残さないようにしたい場合もある。いわゆる変数のdrop。 そんな時は変数の前に-をつける。

dat %>% select(-name, -grade)
  height  B  W  H
1    157 82 59 83
2    160 80 58 82
3    162 83 58 84
4    162 80 57 80
5    157 82 57 81
6    156 79 58 80
7    152 83 57 83
8    163 87 60 84
9    154 76 56 79

ちなみに,並びが連続している変数については,:で範囲を示すことができる。上の例は,次のコードでも同じ結果になる。

dat %>% select(-name:-grade)

【更新履歴】 2017/07/08 チートシートの部分を取り消し