個票データを集計するシリーズ、今回はstats
パッケージのaggregate
を見ていきましょう。
使用するデータ
引き続き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
はおすすめできる関数です。