これまではRの基本パッケージの関数について見てきましたが、 データ加工ならばdplyrパッケージは欠かせないところです。 個票データの集計に相当するのはその中のsummarise
です。
使用するデータ
引き続きdatasets::CO2
を例に使います。
Plant Type Treatment conc uptake
1 Qn1 Quebec nonchilled 95 16.0
2 Qn1 Quebec nonchilled 175 30.4
3 Qn1 Quebec nonchilled 250 34.8
4 Qn1 Quebec nonchilled 350 37.2
5 Qn1 Quebec nonchilled 500 35.3
6 Qn1 Quebec nonchilled 675 39.2
また、dplyr
パッケージを呼び出しておきましょう。
summarise
summarise
の引数は次のようになっています。
- 1つ目に集計するdata frame(もしくはtibble)を指定
- 2つ目以降に集計する関数を指定
分類を指定するところがありませんね。 実は分類は別の関数のgroup_by
で指定します。
関数が別々になっているのは、それぞれの処理を分けた方が汎用性が高くなる(集計だけに特化しない)ことと、 それぞれの処理の名前を明示した方が分かりやすい、とdplyr
パッケージが考えているからだと思います。
そしてその別々の関数を同時に実行するよい方法が、パイプ演算子の利用です。
もともとmagrittr
パッケージで提供されていたパイプ演算子%>%
ですが、 R4.1.0からはbase
パッケージでパイプ演算子|>
が使えるようになりました。ここでは|>
の方を使います。
これらを使って結果数値のuptake
を分類のType
別に合計した値を出してみましょう。
group_by(CO2, Type) |> summarise(sum=sum(uptake))
# A tibble: 2 × 2
Type sum
<fct> <dbl>
1 Quebec 1409.
2 Mississippi 877.
結果はtibbleで返ってきます。データの加工・集計を入力・出力ともにtibbleに統一して行うのがdplyr
の思想です。 tibbleということで、結果の形はaggregate
関数の戻り値に近いですね。
分類を2つに増やすとこうなります。
group_by(CO2, Type, Treatment) |> summarise(sum=sum(uptake))
# A tibble: 4 × 3
# Groups: Type [2]
Type Treatment sum
<fct> <fct> <dbl>
1 Quebec nonchilled 742
2 Quebec chilled 667.
3 Mississippi nonchilled 545
4 Mississippi chilled 332.
想定どおりの結果ですが、最初に何かメッセージが出ています。 これは「結果のtibbleにはグループ属性としてType
が残っている」ということを教えてくれています。 もともとはgroup_by
でType
とTreatment
の2つのグループを指定したけれど、末尾のTreatment
の方は1行1データになったから落としたということですね。 この集計結果を得ることが目的であれば、結果のグループ属性はあまり関係ないので気にしなくても大丈夫です。
分類3つだとこうなります。
group_by(CO2, Type, Treatment, conc) |> summarise(sum=sum(uptake))
# A tibble: 28 × 4
# Groups: Type, Treatment [4]
Type Treatment conc sum
<fct> <fct> <dbl> <dbl>
1 Quebec nonchilled 95 45.8
2 Quebec nonchilled 175 90.1
3 Quebec nonchilled 250 112.
4 Quebec nonchilled 350 121.
5 Quebec nonchilled 500 119.
6 Quebec nonchilled 675 124.
7 Quebec nonchilled 1000 130.
8 Quebec chilled 95 38.6
9 Quebec chilled 175 72.4
10 Quebec chilled 250 103.
# ℹ 18 more rows
本来は縦に長い結果ですが、tibble流の「画面を圧迫しない表示」でコンパクトにまとまっています。
このようにdplyr
パッケージを使ってデータの集計ができます。 ここでのdplyr
の利点は引数に渡すtibble(data frame)内の変数の記述が簡潔になるところだと思います。 data-maskingとも呼ばれますが、aggregate
関数と比べてdata frameの名前を何度も書かなくてよい点や、列名にダブルクォーテーションが不要である点がスマートであると感じます。
データ集計という観点で見たdplyr::summarise
関数の説明でした。