Rで集計に使える関数 - summarise

summariseを使って個票データ(microdata)を足し上げよう
R
公開

2022年11月24日

これまではRの基本パッケージの関数について見てきましたが、 データ加工ならばdplyrパッケージは欠かせないところです。 個票データの集計に相当するのはその中のsummariseです。

使用するデータ

引き続きdatasets::CO2を例に使います。

head(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パッケージを呼び出しておきましょう。

library(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_byTypeTreatmentの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関数の説明でした。