3.4 1つのテーブルに対するverb
dplyrパッケージはデータの操作に関する一貫した文法を持つ関数を提供しています。このパッケージにおいて、テーブル(データフレームやtibbleなど)に対して何らかの処理を行う関数のことをverbと呼びます。verbは以下のようなルールで用いられます。
- 最初の引数は処理対象となるテーブル
- 2番目以降の引数で、verbに関連するオプションを指定
- 帰ってくる値は常にテーブル
verbの説明のために、以下のように簡単なデータフレームを作成しておきます。
<- data.frame(
df 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()
を実行することで、テーブルにグループ化された変数についての情報が付加されます。
<- group_by(df, color)
by_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引数以降に並べます。
<- group_by(flights, year, month, day)
by_date 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 の標準偏差、分散 |