前回dplyrひゃっはーって記事を書きました。
そしたら今日後輩がちょっとdplyrでできない事を相談してくれたので調子に乗って続編を書いてみます。
前回に続いてデータを集計します。
区と市町村でデータを小グループに分けて、それぞれのグループで部屋のサイズの平均と価格の平均を出します。
seven <- sample %.% group_by(ku,mati) %.% summarize(price.avg = mean(twoyp), area.avg = mean(area))
> seven
Source: local data frame [173 x 4]
Groups: ku
ku mati price.avg area.avg
1 港 愛宕 18960000 106.28929
2 港 海岸 4850246 48.93756
3 港 元赤坂 5894179 47.47393
4 港 元麻布 11086603 86.22490
5 港 虎ノ門 5376973 47.48465
6 港 港南 5528753 65.67752
7 港 高輪 4130777 44.27967
8 港 三田 4753924 45.34878
9 港 芝 3690141 35.38381
10 港 芝浦 4189471 46.21770
次にこれらの地区を平均面積でカテゴライズして、そのカテゴライズに該当する地区の数をカウントします。
sevenで先ほどのデータを読み込みます。先ほどグルーピングを行っているので、このままsummarizeとかを使うと思った通りの集計が出来ません。ので、ungroup()を使ってグループ化を一度解除します。
一度ungroupをすると、集計等はグループ単位ではなく、行単位で行われます。部屋の面積でグループ化させたいのでcategorizeの変数をmutateで作成します。次にその変数でグループ化を行って、グループに属するデータの数をsummarizeで集計します。
eight <- seven %.% ungroup() %.% mutate(categorize = ceiling(area.avg/10)) %.% group_by(categorize) %.% summarize(count = n())
> eight
Source: local data frame [10 x 2]
categorize count
1 3 27
2 4 84
3 5 39
4 6 12
5 7 5
6 8 1
7 9 2
8 11 1
9 15 1
10 26 1
業務とかだとユーザーごとに特性を集計して、その特性でカテゴライズするときとかによく使ってます。
さて、次にdplyrで集計したデータを見やすい形に整形します。
dplyrではこれが出来ない・・・はず。なので、reshape2を使います。まずはインストールですね。
install.packages(“reshape2”)
library(reshape2)
例のごとく区と面積でカテゴライズして物件数をカウントします。
nine <- sample %.% mutate(ten = ceiling(area/10)) %.% group_by(ku,ten) %.% summarize(count = n())
> nine
Source: local data frame [147 x 3]
Groups: ku
ku ten count
1 港 1 18
2 港 2 731
3 港 3 5149
4 港 4 2389
5 港 5 1720
6 港 6 1825
7 港 7 932
8 港 8 630
9 港 9 506
10 港 10 263
次に見やすくするためにdcastを用います。
ten ~ kuで行を面積でカテゴライズし、列を区でカテゴライズします。
カテゴライズの軸を増やしたいときには変数の次に別の変数を+で追加します。
ten + hoge ~ ku とか ten + hogeA ~ ku + hogeB って感じです。
fun.aggregate = sum は追加の集計で、今回は合計しています。本当は必要ないのですが、sumを指定しておかないと結果にNAが入ってしまって後で面倒なのでsumを入れています。
上で指定している縦軸と横軸の掛け合わせに対応するデータが一つしかないので、合計してしまっても問題ありません。
・・・というかあれですね、dplyrで合計しておかなくてもこっちで合計すればいいんすね・・。まぁいっか。
na.rm = TRUEでNAを0に変換しています。
dcast(nine, ten ~ ku, fun.aggregate = sum, na.rm = TRUE)
結果はこんな感じになります。
区×面積で物件数を集計できています。(ten = 1で0~10m^2で、ten = 2で11m^2 ~ 20m^2です)
> dcast(nine, ten ~ ku, fun.aggregate = sum, na.rm = TRUE)
Using count as value column: use value.var to override.
ten 港 渋谷 世田谷 品川 目黒
1 1 18 71 75 35 24
2 2 731 1500 7436 1929 1937
3 3 5149 5339 12730 6181 4113
4 4 2389 2829 5025 2006 2384
5 5 1720 1917 5034 1949 1616
6 6 1825 1393 3010 777 922
7 7 932 627 1689 305 585
8 8 630 308 981 281 421
9 9 506 216 465 87 318
10 10 263 119 314 67 87
いやー便利っすね。
dcastの使い方を覚えてからというもの、本当にエクセル触る機会が減ってきました。
データの構造がわかってるときはこういう集計で済ませていきたいですね。