Knowledge As Practice

JAIST(東京)で Transformative Service Research に取り組んでる社会人大学院生の研究・勉強メモ

dplyr と tidyr でクロス集計表をつくる count() 編

どうやったらデータフレーム形式のクロス集計表が簡単にできるかな、と探していたところ、次の2つにページに行き着きました。

d.hatena.ne.jp

newscentral.exsees.com


もちろん 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 が原因なのかちょっとわかりません。文字コードの対応は難しそうなので、このへんにしようと思います。

クリエイティブ・コモンズ・ライセンス
この 作品 は クリエイティブ・コモンズ 表示 - 継承 4.0 国際 ライセンスの下に提供されています。