読者です 読者をやめる 読者になる 読者になる

Knowledge As Practice

JAIST(東京)でサービス経営の研究をしている社会人大学院生の研究・勉強メモ(統計分析多め)。

【行の操作】直感的な操作ができる R パッケージ dplyr の簡単な使い方 その1

ノンプログラマーのためのR入門

なぜかクロス集計表を作るのが苦手です。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")
で表示されるページ

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。