R言語

R言語 クロス集計表・ピボットテーブルの作り方

  1. HOME >
  2. R言語 >

R言語 クロス集計表・ピボットテーブルの作り方

スポンサーリンク

こんにちは、usagi-san です。

今回は集計表及び、ピボットテーブルの作成方法をみていきます。

クロス集計表は、factor型のデータの各levelの度数、和、平均を取り扱う際に便利です。

エクセルではピボットテーブルという機能を用いれば、直感的に簡単に集計表を作成することが可能です。

エクセルで作成した集計表を用いても解析が可能ですが、R言語でもパッケージを用いればピボットテーブルの作成ができます

今回はピボットテーブルの作成の例として、2元及び3元のテーブルを作成していきます(2元及び3元分割表を作成していきます)。

以下のダウンロードリンクから、今回用いるプログラミンコードをダウンロードできます。

是非是非ダウンロードしてください

また、データフレームの操作をすべてまとめた記事も書きました。データフレームの詳細については次の記事を参照。

【R言語】データフレーム操作 作成・値の代入・行と列の追加と削除など

R言語を使う際に避けては通れない道であるデータフレームの操作について解説します。 データフレーム(data.frame)はデータセットを格納するための行列であり、データ解析をするうえで必要不可欠です。 ...

続きを見る

クロス集計表の作り方

データセットの準備

まずは、クロス集計表(2元の分割表)を作る方法を解説していきます。

R言語にデフォルトで入っているmtcarsという自動車のテストデータセットを例に集計方法を解説していきます。

まず次のコードを実行し、dfmtcartを代入しましょう。

試しに、dfの列名および、データの構造を確認してみましょう。関数headを用いるとデータフレームの一部を参照することができます。

上の実行結果のように、dfはmpgなどのnumeric型の列とcyl、vs、am、gear、carbといったfactor型の列から成ることが分かります。

factor型のデータを例にいろいろな集計方法をみていきます。

クロス集計表の作成

では、vsとamに関するクロス集計を行います。

df$vsdf$amのように各2つの列名(タグ)を指定し、次のようにas.factorlevelsを用いることで、0と1のlevelをもつfactro型のデータであることが分かります(注意: vsamなどの列のデータはデフォルトだとcharacter型です)。

これら2つの列のクロス集計表を作成する際に、次の表のように4通りの組み合わせを考える必要があります。

vs\am01
0vs=0かつam=0vs=0かつam=1
1vs=1かつam=0vs=1かつam=1

度数についてのクロス集計

まず、上の表にある条件式を用いて各セルの度数を計算してみます。

次のようにして、上の表の4通りのパターンを計算することができます。

table_11には、vs=0かつam=0の度数が代入されているように、tableの添え字には、線形代数のブロック行列に対応するものとなっています(11の場合、左上の成分。12の場合、右上の成分, . . . )。

次のコードを実行することで、table_11, . . . table_22の各成分を用いてクロス集計表を作成することができます。

また、rownames(table)colnames(table)をそれぞれc(0, 1)にし、集計表の行名と列名を指定しています。

クロス集計表tableをコンソール上で確認すると、次のようにvsとamの集計表を作成できたことが分かります。

和についてのクロス集計

次に、列名mpg各セルの和についてのクロス主計表を作成していきます。

R言語 データフレーム練習【初心者向け】で説明したように、関数sumを用いることで、numeric型のデータの和を計算することができます。

度数の場合と同様に、各4パターンのdf$mpgを考え、関数sumを用いて、それぞれのnumeric型のベクトルの和を求めています。

例として、vs=0かつam=0のとき、関数sumの引数df$mpg[df$vs == 0 & df$am == 0]は次のようになっています。

2行目では、vs=0かつam=0である行のdf$mpgが 出力されていることが確認できます。

またlengthが12であることは、先ほど計算したvs=0かつam=0の度数と一致しているのもわかります。

度数の場合と同様に、次を実行することで、sumTable_11、sumTable_12、sumTable_21、sumTable_22をクロス集計表にまとめます。

コンソール上で、sumTableを確認すると、和に関するクロス集計表ができていることが確認できます。

平均についてのクロス集計

最後に、列名mpg各セルの平均についてのクロス主計表を作成していきます。

各セルの平均は、度数の集計表と和の集計表から計算することができます

ベクトルや行列、データフレームは各要素についての四則演算が可能であるように、次の割り算/で平均についてのクロス集計表を求めることができます。

コンソール上で、meanTableを参照すると、次の平均についてのクロス集計表ができていることが分かります。

2元の場合のクロス集計の方法を説明しましたが、実行するとわかるように、factor型のlevelの数が多くなればなるほど、作成が困難になります。

そのため次では、集計用の関数xtabsを用いた集計表の作成の一連の流れを説明します。

xtabsを用いた作成

クロス集計用の関数として、xtabsを紹介します。

先ほどのクロス集計表の作成の例では、各levelsのパターンを考えて1から作成しましたが、xtabsを用いることで、この計算の手間を省くことができます

xtabsを用いた度数のクロス集計

xtabsを用いて度数についてのクロス集計表を作成するには、xtabsの引数を次のように与えます。

1つ目の引数には式を代入します。今、vsとamの集計表を得たいので"~ vs + am"としています。

2つ目に、集計するデータフレームを代入しています。

tableを参照すると、tableには次のようなint型のリストが格納されているのが分かります。

xtabsを用いた和のクロス集計

xtabsを用いて和の集計を行うには、xtabsの最初の引数である式の"~"の前に和を求める列名を指定します。

次のようにxtabsの引数を指定することで、df$mpgの和についての集計表を作成することができます。

度数の場合と同様に、sumtableには次のようなint型のリストが格納されているのが分かります。

xtabsを用いた平均のクロス集計

xtabsで出力される度数と和の集計表を用いて、平均のクロス集計表を作成することができます。

次のように、割り算/により平均についてのクロス集計表を作成できます。

meanTableには、平均に関するint型のリストが格納されていることがわかります。

csvファイルへの出力

xtabsで作成した集計表は、参照するとわかるようにlint型のリストとなっており、集計表の形でのcsvファイルへの出力は難しいです。

行名や列名を結合しなおすことで、集計表の形を維持したままcsvファイルに出力することができます

まず扱いやすくするために、int型のリストをmatrixに変換します。

次のrbindとcbindで、クロス集計表の行名と列名およびvsとamを結合させています。

例として、tableを参照すると、集計表の形をしたデータフレームが作成されていることが確認できます。

最後に、csvファイルへの出力には、write.csvではなく、write.tableを用います。

これは、write.csvでは引数col.names = TRUEなどの変更が許されないためです。今、上の実行結果から、tableにはすでに列名が挿入されているのが分かるのでcol.names = Fとしてcsvファイルに出力していきます。

次のようにwrite.tableの引数にrow.names = F や col.names = Fを指定することで、上の出力結果の集計表をcsvファイルを出力することができます。

次の画像のように、分割表(度数).csvをみてみると、xtabsで出力した集計表が保存されていることが分かります。

クロス集計表のcsvファイルへの出力

3元以上のクロス集計表

3元以上のクロス集計表の作成

3元以上のクロス集計表を解説していきます。

dfvsとamとgearを例にクロス集計表を作成してみます。

as.factor(df$gear)を参照してみます。

df$gearは上の3つのlevelsをもつfactor型のデータであることと、クロス集計表の作成からdfvsとamとgearのクロス集計表は次の12パターンのセルから成る表であることが分かります。

gear345
vsam
00vs=0かつam=0かつgear=3vs=0かつam=0かつgear=4vs=0かつam=0かつgear=5
1vs=0かつam=1かつgear=3vs=0かつam=1かつgear=4vs=0かつam=1かつgear=5
10vs=1かつam=0かつgear=3vs=1かつam=0かつgear=4vs=1かつam=0かつgear=5
1vs=1かつam=1かつgear=3vs=1かつam=1かつgear=4vs=1かつam=1かつgear=5

クロス集計(3元)

2元の場合と同様に、まずxtabsを用いないでクロス集計表を作ってみます。

上の表にある条件式を用いて各セルの度数を計算してみます。

次のようにして、上の表の12通りのパターンを計算することができます。