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

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

2022年11月22日

個票データを集計するシリーズ、今回はstatsパッケージのaggregateを見ていきましょう。

使用するデータ

引き続き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

aggregate

aggregateの引数は次のようになっています。

  • 1つ目に集計する値が入った列を指定
  • 2つ目に分類に使いたい列をListの形で指定
  • 3つ目に集計関数を指定

ということで、tapplyとほぼ同じです。 では結果数値のuptakeを分類のType別に合計した値を出してみましょう。

aggregate(CO2["uptake"], CO2["Type"], sum)
         Type uptake
1      Quebec 1408.8
2 Mississippi  877.1

実はこの集計結果はdata frameになっています。これがaggregateの特徴です。

上の例では引数1つ目をわざとList型にしました。こうすると結果のdata frameの列に名前が付きます。 (正確には、名前付きの変数を渡すとその名前がdata frameの列名になります)

分類を2つに増やすとこうなります。

aggregate(CO2["uptake"], CO2[c("Type", "Treatment")], sum)
         Type  Treatment uptake
1      Quebec nonchilled  742.0
2 Mississippi nonchilled  545.0
3      Quebec    chilled  666.8
4 Mississippi    chilled  332.1

さらに分類3つだとこうなります。

aggregate(CO2["uptake"], CO2[c("Type", "Treatment", "conc")], sum)
          Type  Treatment conc uptake
1       Quebec nonchilled   95   45.8
2  Mississippi nonchilled   95   33.9
3       Quebec    chilled   95   38.6
4  Mississippi    chilled   95   28.8
5       Quebec nonchilled  175   90.1
6  Mississippi nonchilled  175   60.6
7       Quebec    chilled  175   72.4
8  Mississippi    chilled  175   44.3
9       Quebec nonchilled  250  112.2
10 Mississippi nonchilled  250   82.6
11      Quebec    chilled  250  103.4
12 Mississippi    chilled  250   48.3
13      Quebec nonchilled  350  121.1
14 Mississippi nonchilled  350   89.7
15      Quebec    chilled  350  107.4
16 Mississippi    chilled  350   49.8
17      Quebec nonchilled  500  118.8
18 Mississippi nonchilled  500   91.8
19      Quebec    chilled  500  110.0
20 Mississippi    chilled  500   49.9
21      Quebec nonchilled  675  124.5
22 Mississippi nonchilled  675   91.6
23      Quebec    chilled  675  112.5
24 Mississippi    chilled  675   54.8
25      Quebec nonchilled 1000  129.5
26 Mississippi nonchilled 1000   94.8
27      Quebec    chilled 1000  122.5
28 Mississippi    chilled 1000   56.2

お分かりのように、aggregateでは分類の組み合わせの数だけdata frameの行が作られて、それに対応する値が格納されます。

この形だと分類の列がいくら多くなっても見やすさが変わらないというメリットがあります(縦に長くなってしまうことを除いては)。 tapplyのようにinteractionで列をまとめなくてもよいのは楽ですね。

data frameで結果が返ってくると次の分析にも使いやすいので、aggregateはおすすめできる関数です。