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()を用います。dfvalue列の各値を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()のみを用いることもあります。例えば、dfvalueの合計を求めるには以下のようにします。

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の標準偏差、分散