3.4 1つのテーブルに対するverb
dplyrパッケージはデータの操作に関する一貫した文法を持つ関数を提供しています。このパッケージにおいて、テーブル(データフレームやtibbleなど)に対して何らかの処理を行う関数のことをverbと呼びます。verbは以下のようなルールで用いられます。
- 最初の引数は処理対象となるテーブル
- 2番目以降の引数で、verbに関連するオプションを指定
- 帰ってくる値は常にテーブル
verbの説明のために、以下のように簡単なデータフレームを作成しておきます。
df <- data.frame(
color = c("blue", "black", "blue", "blue", "black"),
value = 1:5
)
df## color value
## 1 blue 1
## 2 black 2
## 3 blue 3
## 4 blue 4
## 5 black 5
3.4.1 値の条件による抽出:filter()
filter()関数は第2引数以降で指定した条件に合致する行のみを抽出するためのverbです。以下のようにすると、変数colorが"blue"である行のみが抽出されます。
filter(df, color == "blue")## color value
## 1 blue 1
## 2 blue 3
## 3 blue 4
「等しい」という表現は、==となることに注意してください。変数valueが1もしくは4の行のみ抽出する場合は
filter(df, value %in% c(1, 4))## color value
## 1 blue 1
## 2 blue 4
のようにします。条件部には以下のような、条件演算子を用いた条件式を記述します。
| 演算子 | 機能 | 演算子 | 機能 |
|---|---|---|---|
x > 1 |
1より大きい | x != 1 |
1と等しくない |
x >= 1 |
1以上 | x == 1 |
1と等しい |
x < 1 |
1より小さい | x %in% c(1, 2) |
1か2のいずれか |
x <= 1 |
1以下 |
また、複数の条件を用いる場合は、以下のような論理演算子を用います。
| 式 | 機能 |
|---|---|
a | b |
条件aと条件bのいずれかを満たす(論理和) |
a & b |
条件aと条件bの両方を満たす(論理積) |
!a |
条件aを満たさない(否定) |
xor(a, b) |
条件aと条件bの排他的論理和 |
colorが"blue"でvalueが3未満の行のみを抽出するには以下のようにします。
filter(df, color == "blue" & value <= 3)## color value
## 1 blue 1
## 2 blue 3
3.4.2 指定した列の抽出:select() #{select}
select()関数は第2引数以降で指定した列を抽出するためのverbです。dfから変数colorのみ、もしくはcolor以外の変数を抽出するには次のようにします。
select(df, color)## color
## 1 blue
## 2 black
## 3 blue
## 4 blue
## 5 black
select(df, -color)## value
## 1 1
## 2 2
## 3 3
## 4 4
## 5 5
3.4.3 指定した列を昇順でソート:arrange() #{arrange}
arrange()は、第2引数以降で指定した列について、昇順でソートするためのverbです。colorの列について、昇順でソートするには
arrange(df, color)## color value
## 1 black 2
## 2 black 5
## 3 blue 1
## 4 blue 3
## 5 blue 4
とします。colorの列は文字列であるため、アルファベット順に並びます。valueの列を降順にソートするためにはdesc()関数を用いて
arrange(df, desc(value))## color value
## 1 black 5
## 2 blue 4
## 3 blue 3
## 4 black 2
## 5 blue 1
とします。
3.4.4 新しい列の作成:mutate()
新しい列を作成して、他の列に対する演算結果等を格納する場合には、mutate()を用います。dfのvalue列の各値を2倍した結果を新たに作成したdouble列に格納するには、以下のようにします。
mutate(df, double = 2*value)## color value double
## 1 blue 1 2
## 2 black 2 4
## 3 blue 3 6
## 4 blue 4 8
## 5 black 5 10
第2引数で定義した変数を、第3引数以降での演算に利用できます。
mutate(df, double = 2*value, quadruple = 2*double)## color value double quadruple
## 1 blue 1 2 4
## 2 black 2 4 8
## 3 blue 3 6 12
## 4 blue 4 8 16
## 5 black 5 10 20
3.4.5 グループごとの要約:group_by()とsummarise()
グループごとに平均値や中央値などの要約を計算したい場合には、group_by()とsummarise()を組み合わせて用います。全体の要約を行う場合には、summarise()のみを用いることもあります。例えば、dfのvalueの合計を求めるには以下のようにします。
summarise(df, total = sum(value), .groups = "drop")## total
## 1 15
第3引数の.groups = "drop"は、要約後にグループ化の情報を残すかどうかの設定となります。特に必要が無ければ"drop"を指定しておくとよいでしょう。
colorごとに合計を求めるには、group_by()でグループ化を行ってから、summarise()で要約を行います。group_by()を実行することで、テーブルにグループ化された変数についての情報が付加されます。
by_color <- group_by(df, color)
by_color## # A tibble: 5 x 2
## # Groups: color [2]
## color value
## <chr> <int>
## 1 blue 1
## 2 black 2
## 3 blue 3
## 4 blue 4
## 5 black 5
この出力は、color列に2つのグループが設定されていることを示しています。この結果に対してsummarise()を適用すれば、グループごとの要約ができます。
summarise(by_color, total = sum(value), .groups = "drop")## # A tibble: 2 x 2
## color total
## <chr> <int>
## 1 black 7
## 2 blue 8
複数の列の値の組み合わせでグループ分けを行う場合には、それらの列名をgroup_by()の第2引数以降に並べます。
by_date <- group_by(flights, year, month, day)
by_date## # A tibble: 336,776 x 19
## # Groups: year, month, day [365]
## year month day dep_time sched_dep_time dep_delay arr_time sched_arr_time
## <int> <int> <int> <int> <int> <dbl> <int> <int>
## 1 2013 1 1 517 515 2 830 819
## 2 2013 1 1 533 529 4 850 830
## 3 2013 1 1 542 540 2 923 850
## 4 2013 1 1 544 545 -1 1004 1022
## 5 2013 1 1 554 600 -6 812 837
## 6 2013 1 1 554 558 -4 740 728
## 7 2013 1 1 555 600 -5 913 854
## 8 2013 1 1 557 600 -3 709 723
## 9 2013 1 1 557 600 -3 838 846
## 10 2013 1 1 558 600 -2 753 745
## # ... with 336,766 more rows, and 11 more variables: arr_delay <dbl>,
## # carrier <chr>, flight <int>, tailnum <chr>, origin <chr>, dest <chr>,
## # air_time <dbl>, distance <dbl>, hour <dbl>, minute <dbl>, time_hour <dttm>
要約のための関数には以下のようなものがあります。
| 関数 | 説明 |
|---|---|
min(x), max(x) |
xの最大値、最小値 |
median(x) |
xの中央値 |
n() |
グループごとの件数 |
n_distinct() |
グループごとのユニークな行数 |
sum(x), mean(x) |
xの合計、平均値 |
sum(x > 10) |
x > 10を満たす行数 |
mean(x > 10) |
x > 10を満たす比率 |
sd(x), var(x) |
xの標準偏差、分散 |