R言語

R言語 データ整形 データセットの分割・併合【初心者向け】

  1. HOME >
  2. R言語 >

R言語 データ整形 データセットの分割・併合【初心者向け】

スポンサーリンク

こんにちは、usagi-sanです。今回は教育用標準データセットSSDSE-2020B.csvを用いて、複数のデータセットを用いたデータ整形の練習をしていきます。

データセットを複数に分割したり、分割されたデータフレームを併合したりしていきます。

また、複数のデータセットの集計方法として、多元分割表の作成の仕方もみていきます。

また、今回用いるプログラミングコードも以下からダウンロード可能です。

練習用としてぜひぜひダウンロードしてください。

0815 ソースコードに間違いがあったので修正しました。

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

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

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

続きを見る

準備

データセットの読み込み

複数のデータセットを用意するために、まず解析するデータをread.csvを用いて読み込みます。

教育用標準データセットSSDSE-2020B.csvには、"Year"という列名があるため、年度別のデータセットをまず作成します(年度別のデータセットの入手が難しいため、1つのデータセットを複数のデータセットに分割しています)。次のようにdfの一部を参照すると、"Year"があるのが分かります。このleves別のデータセットを準備として作成します。

年度別データセットの作成

次のコードを実行し、年度別のデータセットを作成しましょう。

年度別のデータには"Year"という年度の列は必要ないため、上のfor文中で列を省いています。

では早速、年度別のデータセットを読み込んでみましょう。

複数のファイルを読み込みたいときは、1行目のdfListようにリストに格納すると便利です。

年度別データのリストdfListの1つ目の要素には2006年のデータが入っているのが確認できます。同様に2007年、2008年、… のデータがdfListに格納されています。

これで、1つのデータセットから年度別の複数のデータセットを作成することができました。

次に複数のデータセットを併合する方法について紹介します。

複数のデータフレームの併合

列名Yearの挿入

まず、dfListの各要素の列名には、年度を表すものがないため、各データフレームに"Year"という列を挿入します。

次を実行し、dfListの各データフレームに"Year"という列を追加しましょう。"Year"の列の要素には対応する年を代入しています。

上のfor文の中のように、データフレームにベクトルを挿入する場合はdata.frameなどを用いるとよいです。挿入する列を適切な位置に挟んで結合させます(cbindを用いても同様に挿入することができます)。

データフレームの併合

年度別のデータフレームを併合させ、元のSSDSE-2020B.csvの形に整えていきます。

データフレームの併合については以前の記事データフレーム練習で紹介した通り、関数mergerbindを用いることで可能です。

まず関数mergeを用いたデータフレームの併合方法を説明します。

次のようにmerge(データフレームA, データフレームB, all =T)とすることで2つのデータフレームA、Bを併合させることができます。

次にrbindを用いた方法は以下の通りです。

rbind(データフレームA, データフレームB)とすることで2つのデータフレームA、Bを行方向に結合させることができます。

注意としてmergerbind列名を紐づけしている点です。

そのため、違う列名を持つデータフレームを併合または結合させるときには注意が必要です。

データフレームdfを参照してみましょう。

次のように、"Year"に2006年から2020年までのlevelsを含むデータフレームを作成することができました。

これだけでも十分ですが、元のSSDSE-2020B.csvと比べると都道府県でソートされていないことが分かります。

文字列のソート

次のように、都道府県の列”Prefecture”をcharacter型からfator形に変更し、そのlevelsでソートすることで都道府県でデータフレームをソートすることができます。

上の2行目では、barにdfの2行目以降を代入しています。これは1行目もデータの列名を意味するためです。

3行目でbarを、levels=c("北海道", "青森県", ... ,"沖縄県")をlevelsとするfactorに変更し、これをtmpとしています。

4行目では、dfの列名である1行目とtmpをlevelsでソートしたものをrbindで結合させています。

上のように、文字列をソートするときは関数orderを用います。

factorのlevelsをas.numericとするとlevelsの順序となるため、この順序をorderでソートすることで文字列もソートすることが可能です。

dfをみてみると、実際に都道府県でソートされたことが確認できます。

 write.csvで併合後のデータフレームを出力してみましょう。

下の画像のように、併合前と併合後のデータが一致していることが分かります。

データ併合後

データフレームの併合が正しく行われていることが確認できました。

多元分割表

次に、多元分割表の作り方について説明します。

カテゴリカルデータを扱う際に、分割表は重要になってきます。

多元分割表の作り方

データフレームから多元分割表を作る際には、関数xtabsが便利です。

まず準備として、dfの列名と4列目以降のデータをas.numericで数値にします。

2元分割表

都道府県と年度に関する総人口の2元分割表を作ってみましょう。

次のようにして、2元分割表を作ることが可能です。

2元分割表tableは次のようにデータフレームとなっていることが確認できます。

関数xtabsの説明は、この後に説明しますが、 xtabs( ~ tab, data )のように~の前に何も指定しないと、セルの度数を返し、指定するとセルの合計を返します。

3元分割表

次に3元分割表を作ってみましょう。

まず、準備として、次の二つのカテゴリカルデータ”待機児童数カテゴリカル”、”各種学校数カテゴリカル”をdfに追加します。

多元分割表を作るには、次のようにxtabsの引数に、カテゴリカルデータの列名を追加し、関数ftableを用います。

xtabs(y ~, x1+x+2+x3, data)のように、カテゴリカルデータ分の多元分割表を作ることができます。

3行目に、関数ftaleの引数にtableをいれて実行することで、より多元分割表らしい見た目のデータフレームを作ることができます。

3元分割表Tableを参照すると、次のようになっています。

上のようなクロス集計表の作成方法については、R言語クロス集計表を参照してください。

またftableの引数にrow.varsを指定すると、表の行と列を反転させることができます。

関数xtabs

関数xtabs(formula = ~., data = parent.frame(), subset, sparse = FALSE, na.action, addNA = FALSE, exclude = if(!addNA) c(NA, NaN), drop.unused.levels = FALSE)の引数を以下にまとめました。

関数xtabsの引数
formulaクロス集計する式。yをx1とx2とx3で集計したい場合式y~x1+x1+x3のようにする。addNANAをカウントするかどうかを指定する
dataデータフレームexclude除外するデータ
subsetdata中で用いれるベクトルを指定するdrop.unused.levels用いられていないlevelsを除外する
sparseスパース行列とするかを指定しするna.actionデータにNAがあるときの処理を指定する関数

 

関数ftable

関数ftable(x, exclude=c(NA, NaN), row.vars = NULL, col.vars = NULL)の引数を以下にまとめました。

関数ftableの引数
exclude分割表の集計から除くオブジェクト。初期値としてNAとNaNを除く。
row.varsフラット分割表の行名
col.varsフラット分割表の列名

まとめ

今回は、R言語で複数のデータセットを扱う方法を紹介しました。

エクセルでは難しいデータ整形でも、R言語などのプログラミングを用いれば、自在にデータを分割させたり併合させたりすることができます。

特に複数のデータセットを同時に扱いたい場合は、プログラミングを組んだ方が堅実です(エクセルでもVBAの知識があれば可能です)。

スポンサーリンク

  • この記事を書いた人
  • 最新記事

usagi-san

統計学とゲームとかをメインに解説していくよ。 数式とかプログラミングコードにミスがあったり質問があったりする場合はコメントで受け付けます。すぐに対応します。

-R言語
-,