2009年10月3日土曜日

aggregate関数の動作に関する調査

Rを用いてグループごとに集計したいという場合に用いるものに,aggregate関数があるらしい.今まではインデックスでグループごとに切り出して操作していた(フィルタという)が,それよりも楽に作業ができそうなので,どのような挙動になるか調べてみた.

基本的な使い方はヘルプによると,

aggregate(x, by, FUN, ...)

となっている.「データxをリスト構造のbyのグループごとに,関数FUNで統計量としてまとめる」という使い方のようである.FUNはスカラを返すものでないとダメらしい.早速

example(aggregate)

にあった例の一部を引っ張り出して

aggregate(state.x77, by = list(Region = state.region), FUN=mean)
aggregate(state.x77, by = list(Region = state.region,Cold = state.x77[,"Frost"] > 130), FUN=mean)

で動作を確認してみる.アメリカの州ごとの国勢調査のデータから,各地域の平均値が得られるはずである.結果は,

> aggregate(state.x77, by = list(Region = state.region), FUN=mean)
Region Population   Income Illiteracy Life Exp    Murder  HS Grad    Frost      Area
1     Northeast   5495.111 4570.222   1.000000 71.26444  4.722222 53.96667 132.7778  18141.00
2         South   4208.125 4011.938   1.737500 69.70625 10.581250 44.34375  64.6250  54605.12
3 North Central   4803.000 4611.083   0.700000 71.76667  5.275000 54.51667 138.8333  62652.00
4          West   2915.308 4702.615   1.023077 71.23462  7.215385 62.00000 102.1538 134463.00

> aggregate(state.x77, by = list(Region = state.region,Cold = state.x77[,"Frost"] > 130), FUN=mean)
Region  Cold Population   Income Illiteracy Life Exp    Murder  HS Grad    Frost      Area
1     Northeast FALSE  8802.8000 4780.400  1.1800000 71.12800  5.580000 52.06000 110.6000  21838.60
2         South FALSE  4208.1250 4011.938  1.7375000 69.70625 10.581250 44.34375  64.6250  54605.12
3 North Central FALSE  7233.8333 4633.333  0.7833333 70.95667  8.283333 53.36667 120.0000  56736.50
4          West FALSE  4582.5714 4550.143  1.2571429 71.70000  6.828571 60.11429  51.0000  91863.71
5     Northeast  TRUE  1360.5000 4307.500  0.7750000 71.43500  3.650000 56.35000 160.5000  13519.00
6 North Central  TRUE  2372.1667 4588.833  0.6166667 72.57667  2.266667 55.66667 157.6667  68567.50
7          West  TRUE   970.1667 4880.500  0.7500000 70.69167  7.666667 64.20000 161.8333 184162.17

となった.リストの中に論理式が入った場合の例が興味深い.また,Southに分類される州でCold=TRUEとなるものはないということがすぐ分かる.

比較のため,面倒だがインデックス操作で挙動を確認してみる.

> apply(state.x77[state.region == "Northeast",],2,mean)
Population       Income   Illiteracy     Life Exp       Murder      HS Grad        Frost         Area 
5495.111111  4570.222222     1.000000    71.264444     4.722222    53.966667   132.777778 18141.000000

結果の一行目に一致していることが確認できた.逐一インデックス操作で切り出していたらスクリプトを書くのも面倒なので,今後はaggregateを使おう.

0 件のコメント:

コメントを投稿

フォロワー

ページビューの合計