Rでちゃんとしたクロス集計表を出力する関数

Rで困ることはもうほとんどないのですが,唯一致命的なのが,まともなクロス集計表を出力する関数がないことです。論文で標準的な形式の,周辺度数込みで度数と行パーセントを並べているだけのものでいいんですが,tableやらprop.tableやらaddmarginsやらを駆使してもなかなか思い通りのものが作れない。gmodelsとかのCrossTable関数は悪くはないんですが,返り値がtableじゃない,オプションをいっぱい指定しないと好みのものができない,3重クロス表に非対応,など不満点はけっこう多いです。

パッケージでいい関数が作られてないか,数年間探し続けてたんですが,ラチがあかないので作りました。

使い方は簡単です。

 

> # 擬似データ作成
> 性別 <- factor(rbinom(1:1000, 1, 0.5), labels=c("男性", "女性"))
> 年齢 <- factor(rbinom(1:1000, 2, 0.4), labels=c("若年層", "中年層", "高年層"))
> 身長 <- factor(rbinom(1:1000, 2, 0.6), labels=c("低", "中", "高"))
> 
> # CrossTableオブジェクト作成用関数。使い方もオプションもtable関数とまったく同じ。
> t1 <- crossTable(性別, 年齢, 身長)
> 
> # クロス集計表出力
> summary(t1)
===================================================
                               身長                
                       ---------------------       
                          低     中     高   Total 
---------------------------------------------------
性別 男性 年齢  若年層      41     99     68    208
                         19.7%  47.6%  32.7%   100%
                中年層      29    116     85    230
                         12.6%  50.4%  37.0%   100%
                高年層      13     47     32     92
                         14.1%  51.1%  34.8%   100%
          -----------------------------------------
          Total             83    262    185    530
                         15.7%  49.4%  34.9%   100%
     ----------------------------------------------
     女性 年齢  若年層      22     75     62    159
                         13.8%  47.2%  39.0%   100%
                中年層      33    111     89    233
                         14.2%  47.6%  38.2%   100%
                高年層       8     35     35     78
                         10.3%  44.9%  44.9%   100%
          -----------------------------------------
          Total             63    221    186    470
                         13.4%  47.0%  39.6%   100%
===================================================

Chi-Square Test for Independence

性別 : 男性

Number of cases in table: 530 
Number of factors: 2 
Test for independence of all factors:
    Chisq = 4.494, df = 4, p-value = 0.3432

性別 : 女性

Number of cases in table: 470 
Number of factors: 2 
Test for independence of all factors:
	Chisq = 1.4735, df = 4, p-value = 0.8313

crossTable関数は使い方もオプションもtable関数とまったく同じです。crossTable関数はCrossTableオブジェクトを返しますが,CrossTableクラスはtableクラスを継承しているので,tableとまったく同じように使えます。summary関数に渡すと,クロス集計表と,独立性の検定の結果を出力します。クロス集計表の形式は完全に僕の好みに合わせているので,異論があれば言ってください。なにかオプションを付けるかもしれません。

これで,Rでもカテゴリ変数を心置きなく使えるようになりました。