【行の操作】直感的な操作ができる R パッケージ dplyr の簡単な使い方 その1
なぜかクロス集計表を作るのが苦手です。table()を使えばすぐに作れますが、その後、列に名前をつけたり、データフレーム形式に直す必要があるので面倒に感じていました。
そこでデータフレーム形式でクロス集計表を作る方法を知りたいなぁ、と思って検索。dplyr パッケージを使えばよさそう、というところまでたどり着きました。肝心の dplyr でクロス集計表づくりまでは行けなかったですが、dplyr のコア部分のまとめを記します。
■必要なパッケージ
dplyr
dplyr の特徴は、添字や $ を使わず、直感的な操作ができることです。参考にしたページによると「dplyr の哲学は1つのことをうまくやる小さな関数をもっていること」だそうです。動作スピードが速いというのがいちばんの特徴っぽいですが、私は大規模なデータをいじるわけではないので、そのメリットはよくわかりません。
dplyr の関数たちの動きは大きく2つにわかれます。行に対するものと列に対するものです。以下、簡単な説明と操作例を示します。使うデータは infert 。こんなデータ。
> head(infert, 5)
education age parity induced case spontaneous stratum pooled.stratum
1 0-5yrs 26 6 1 1 2 1 3
2 0-5yrs 42 1 1 1 0 2 1
3 0-5yrs 39 6 2 1 0 3 4
4 0-5yrs 34 4 2 1 0 4 2
5 6-11yrs 35 3 1 1 1 5 32
■行の操作に使う関数
filter() 1つまたは複数の列に対して条件を指定し、その条件にあう行を抽出する。
slice() 指定した行を切り出す。
arrange() 指定した列の中身を昇順にして並び替える。
filter() を使って、年齢が39歳のデータを抽出します。抽出したデータを df に入れます。結果、9行が抽出されています。= ではなくて、== であることに注意。
> df <- filter(infert, age == 39)
> df
education age parity induced case spontaneous stratum pooled.stratum
1 0-5yrs 39 6 2 1 0 3 4
2 6-11yrs 39 1 1 1 0 35 13
3 6-11yrs 39 3 0 1 2 41 33
4 0-5yrs 39 6 2 0 0 3 4
5 6-11yrs 39 1 0 0 0 35 13
6 6-11yrs 39 3 1 0 0 41 33
7 0-5yrs 39 6 2 0 0 3 4
8 6-11yrs 39 1 0 0 0 35 13
9 6-11yrs 39 3 0 0 0 41 33
slice() を使って、5行目から8行目を切り出します。切り出したデータを df に入れて表示させます。
> df <- slice(infert, 5:8)
> df
education age parity induced case spontaneous stratum pooled.stratum
1 6-11yrs 35 3 1 1 1 5 32
2 6-11yrs 36 4 2 1 1 6 36
3 6-11yrs 23 1 0 1 0 7 6
4 6-11yrs 32 2 0 1 0 8 22
arrange() を使って、データを年齢順に並び替えます。並び替えたデータを df に入れて、最初の20行を表示させてみます。df は昇順になっています。昇順とは、1,2,3,4,5… というように、小さなものから大きなものに並んでいることです。
> df <- arrange(infert, age)
> head(df, 20)
education age parity induced case spontaneous stratum pooled.stratum
1 6-11yrs 21 1 0 1 1 9 5
2 12+ yrs 21 1 0 1 1 67 39
3 6-11yrs 21 1 0 0 1 9 5
4 12+ yrs 21 1 0 0 1 67 39
5 6-11yrs 21 1 1 0 0 9 5
6 12+ yrs 21 1 0 0 0 67 39
7 6-11yrs 23 1 0 1 0 7 6
8 12+ yrs 23 1 0 1 1 83 40
9 6-11yrs 23 1 0 0 0 7 6
10 12+ yrs 23 1 0 0 1 83 40
11 6-11yrs 23 1 0 0 0 7 6
12 12+ yrs 23 1 0 0 1 83 40
13 12+ yrs 24 3 1 1 2 51 56
14 12+ yrs 24 3 2 0 1 51 56
15 12+ yrs 24 3 2 0 0 51 56
16 6-11yrs 25 3 2 1 1 19 28
17 12+ yrs 25 1 0 1 1 62 41
18 12+ yrs 25 1 1 1 0 70 41
19 12+ yrs 25 1 0 1 1 72 41
20 12+ yrs 25 1 1 1 0 78 41
ちゃんと年齢が昇順になっています。降順にする場合はdesc()を使います。降順とは、10,9,8,7,6… というように大きなものから小さなものに並んでいることです。年齢 age を降順にして、df に入れて、最初の20行を表示させてみます。
> df <- arrange(infert, desc(age))
> head(df, 20)
education age parity induced case spontaneous stratum pooled.stratum
1 6-11yrs 44 1 0 1 1 20 17
2 6-11yrs 44 1 0 0 0 20 17
3 6-11yrs 44 1 1 0 0 20 17
4 0-5yrs 42 1 1 1 0 2 1
5 6-11yrs 42 1 1 1 0 33 16
6 0-5yrs 42 1 0 0 0 2 1
7 6-11yrs 42 1 1 0 0 33 16
8 0-5yrs 42 1 0 0 0 2 1
9 6-11yrs 42 1 0 0 0 33 16
10 6-11yrs 41 1 0 1 0 43 15
11 6-11yrs 41 1 0 0 0 43 15
12 6-11yrs 41 1 0 0 0 43 15
13 6-11yrs 40 1 0 1 1 21 14
14 6-11yrs 40 2 0 1 2 26 27
15 6-11yrs 40 1 0 0 0 21 14
16 6-11yrs 40 2 0 0 0 26 27
17 6-11yrs 40 1 0 0 0 21 14
18 6-11yrs 40 2 0 0 0 26 27
19 0-5yrs 39 6 2 1 0 3 4
20 6-11yrs 39 1 1 1 0 35 13
ちゃんと、年齢 age が降順になっています。desc は descend(下る)の略だと思います。dplyr の関数の基本的な使い方は「関数(操作するデータ, 条件等)」になります。条件のところは列名をそのまま使えるので直感的です。
列の操作に使う関数は、また今度の機会に!
■参照文献
library(dplyr)をしたあとに
vignette("introduction", package = "dplyr")
で表示されるページ