dplyr と tidyr でクロス集計表をつくる count() 編
どうやったらデータフレーム形式のクロス集計表が簡単にできるかな、と探していたところ、次の2つにページに行き着きました。
もちろん table() でもクロス集計表はできますが、データフレーム形式ではありません。なので、dplyr と tidyr を使ってデータフレーム形式のクロス集計表がほしかったので、調べていました。すでにやっていらっしゃる方がいて、たいへん勉強になりました。感謝です。
私のクロス集計表の作り方は以下のとおりです。上記2ページは、普段からプログラミングに親しんでいるような方(たぶん)なので、私のやり方は違っているかもしれません。
■必要なパッケージ
dplyr
tidyr
■使う関数
count
spread
■扱うデータ
haisya01.txt(タブ区切りのテキストファイルです)
※私が専門職学位論文を書いたときに使ったデータの一部です。
まず、元データから編集用データを作成して、少し確認。
> df <- haisya01
> head(df)
user_id 性別 年齢 来院動機 費用負担 来院経路
1 1 男性 48 治療 保険 ホームページ
2 2 男性 55 治療 保険 ホームページ
3 3 男性 55 治療 保険 友達・知人紹介
4 4 男性 57 治療 保険 その他
5 5 男性 47 治療 自費 その他
6 6 女性 27 治療 保険 その他
過去1年間に歯医者さんに通ったことがある様々な地域の500人分のデータです。これから、性別と来院動機のクロス集計表を作ってみます。まず、性別と来院動機の数を数え、それを df2 に入れます。
> df2 <- count(df, 性別, 来院動機)
> df2
Source: local data frame [6 x 3]
Groups: 性別
性別 来院動機 n
1 女性 その他 9
2 女性 検診 131
3 女性 治療 152
4 男性 その他 8
5 男性 検診 77
6 男性 治療 123
とりあえず、性別と来院動機でカウントできました。count() は1番目に書かれた列名でグループを作り、そのグループをもとに来院動機別にカウントしてくれたようです。でも、なんか縦長で見にくいので広げます。
> df3 <- spread(df2, 来院動機, n)
> df3
Source: local data frame [2 x 4]
性別 その他 検診 治療
1 女性 9 131 152
2 男性 8 77 123
この場合の spread() は来院動機別に n の数値を入れてくれる働きをしてくれました。いちおう、これでクロス集計表のできあがり。しかし、なんか少ないものが左にあって気持ち悪いです。並び替えます。
> df4 <- select(df3, 性別, 治療, 検診, その他)
> df4
Source: local data frame [2 x 4]
諤ァ蛻・ 豐サ逋<82> 讀懆ィコ 縺昴<81>ョ莉<96>
1 女性 152 131 9
2 男性 123 77 8
あれ!? 文字化けしました。いちおう並び替えには成功しているみたいですが…。Rstudio を使っているので、R そのものが原因なのか、Rstudio が原因なのかちょっとわかりません。文字コードの対応は難しそうなので、このへんにしようと思います。