R言語

R言語 データ整形 numericやfactorの操作【初心者向け】

  1. HOME >
  2. R言語 >

R言語 データ整形 numericやfactorの操作【初心者向け】

スポンサーリンク

こんにちは、usagi-sanです。今回は前回の記事に続いて、データ整形の練習をしていきます。

前回は教育用データセットを扱いやすい形に整えました。

今回はデータフレームのnumeric型のデータやfactor型のデータの操作について学んでいきます。

今回用いるプログラミングコードは以下で ダウンロードできます

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

データセットを読み込む

では早速、教育用データセットを読み込み、前回の記事と同様に整形後のデータフレームを用意します。

次のコードは前回の記事と同様のものとなります。

実行するとdf整形後のデータフレームが代入されています。

以降、このdfのnumeric型のデータやfactor型のデータの操作を説明します。

numeric型のデータをカテゴリカルデータに

まず、数値データ(numeric型のデータ)をカテゴリカルデータに変更する方法を紹介します。

カテゴリカルデータの例

例えば、次の身長を意味するheightというデータを次で与えます。

このデータを~160、160~170、170~という3つのグループに分けると、heightは次のようになります。

身長というnumeric型のデータを~160、160~170、170~の3つのグループで分けることで3つ水準からなるfactor型のカテゴリカルデータを作成しました。

このような大小関係をもつfactor型のデータに変更できます。

関数cut

カテゴリカルデータを作成する際には、関数cutを用いると便利です。

dfの"2015_総人口"という列に対して、関数cutを使ってみます。

総人口を「0~5000、5000~10000、10000~15000、15000~20000、20000~」という5つのカテゴリに分けたいときには、次を実行します。

barを参照すると次のように、df[,"2015総人口"]が「0~5000、5000~10000、10000~15000、15000~20000、20000~」を水準としてもつfactor型のデータに変わっていることが分かります。

cut引数breaksに分割する区間を指定し、labelsに水準の名前を指定します。

また、引数rightは区間の閉区間、開区間の設定を行います。

上を例に挙げて説明すると、

  • right=TRUEのとき「0~5000」という区間は(0, 5000]、すなわち「0より大きく5000以下」
  • right = FALSEのとき、「0~5000」という区間は[0, 5000)、すなわち「0以上5000未満」

を意味します。

特にこだわりがないのであれば、right = FALSEをお勧めします

余談にはなりますが、次のようにbreaksを設定すると、10000個の区間を作ることもできます。

関数cut(x, breaks, labels = NULL, include.lowest = FALSE, right = TRUE, dig.lab = 3, ordered_result = FALSE, ...)の引数について、以下の表にまとめました。

関数cutの引数
breaksカットポイントの数値ベクトル。またはカットする間隔。
labelsカテゴリカルデータの各レベルのラベルを指定する
include.lowest閉区間に等しいデータをその区間のカテゴリに含めるか。デフォルトのright=TRUEの場合、左側の閉区間を含めるかどうか。
right区間を右側で閉じるか、また閉じないか。right = TRUEの場合、左側を閉じる。
dig.labラベルを指定していないときに、levelsに使用される数値の桁数
ordered_result順序付けられた結果を返すかどうか

データの挿入

barにdf[,"2015_総人口"]のカテゴリカルデータが入っているので、このベクトルをdfに挿入しましょう。

cbind、data.frameを用いてデータフレームにベクトルを挿入できます。他の方法として、関数transformを用いる方法もあります。

次のように実行することでdfの一番右に、ベクトルを挿入することでできます

注意として、今回用いるデータの列名は"2015_~"などと数字で始まるため、transformを用いると列名の最初にXが加わります。cbindやdata.frameを用いるのが賢明です。

関数transform(x, tag = y)の引数を以下にまとめました。

関数transformの引数
yデータフレームxに挿入するベクトル。tagを指定すると、tagが列名となる。

factor型のデータの操作

dfの都道府県の列を用いてfactorの操作の練習をしてみます。

factorのlevels(水準)を変更したり、levelsをプール(組み合わせ)したり、levelsの順番を変更したりしていきます。

levelsの参照

まず、df[, "年度_都道府県"]を参照してみます。

 levels47都道府県であることが分かります。levelsは関数levelsを用いることで次のようにあることができます。

上の実行例を見ればわかる通り、辞書順(levelsはアルファベット順、またはあいうえお順)になっていることができます。
levelsの数を参照するときには、関数nlevelsを用います。

levelsの変更

では、levelsを都道府県別から地方別に変更してみましょう。

準備として、次のように各都道府県に対応する地方のリストを定義します。

各地方のリストの最初の要素にその地方の都道府県を、2つ目の要素に地方の名前を代入しました。

これらのリストをさらにリストlist_regionに格納することで参照が楽になります(fot文を用いるときに楽になります)。

levelsを変更する用意が整いました。関数replaceを用いて、都道府県に対応する地方に置き換えてみましょう。

for文について、iはlist_regionの要素である各都道府県のリストであり、jは各都道府県のリストiの1番目の要素である都道府県のベクトルを指します。都道府県のベクトルi[[1]]の要素jに等しいbarの要素を地方i$regionで置き換えています。

注意として、最初にfactorであるdf[,"年度_都道府県"]をcharacter変更してます。

factor型のデータにreplaceを用いるとエラーを出すため、注意しましょう。

最後に9行目でcharacter型のbarをfactor形に戻します

次を実行すると都道府県のlevelsが地方に置き換わっていることが分かります。

また、関数levelsで次のようにも、levelsの順序が変更されたことが分かります。

levelsの順番の変更

今度はlevelsの順序を変更する方法を説明します。

先ほどの地方のfactorのlevelsの順序を見てみると、辞書順に並んでおり、これを「北海道、東北地方、関東地方、. . . 、九州地方」に変更したい時があると思います。

関数factor引数levelsを指定してあげることでlevelsの変更が可能です。

下のコード2行目のように、levelsのように順序を指定実行します。

順序が変更されているか確認してみます。

上のようにLevesの項目が「関東地方 近畿地方 九州地方、. . . 」から「北海道地方 東北地方 関東地方、. . . 」に変更されたことが分かります。

最後に列名"地方"として、このfactorの列をdfの一番右に挿入します。

水準のプール

統計解析を行う上で、水準をプール(組み合わせる)したい場合があります。

levelsをプールしたいときには、前にも紹介したreplaceを用います。

北海道地方と東北地方をプールを例に説明していきます。

2行目でfactorをcharacterに変更後、3行目でreplaceを用いて"東北地方"、または"北海道地方"を"東北地方.北海道地方"に置き換えています。最後に4ぎょうめで再びfactorに戻します。

levelsを用いて確認してみると、次のようにlevelsの項目に東北地方と北海道地方をプールしたlevelが加えられたことが分かります。

最後にdfの一番右にプール後の列を挿入します。

levelsの名前の変更

levelsをの変更方法について紹介します。

「男性、女性」「Male、Female」や「1、0」に変更したい場合などがあります。

次のように関数factor引数にlevelsとlabelsを指定することで、変更したいlevelsをlabelsの名前に変更することができます。

上のコードでは、factorは、labelsがlevelsに対応付けられることを利用しています。

barを参照してみると、「0~5000、5000~10000、10000~15000、15000~20000、20000~」というlevelsが「とても少ない、少ない、普通、多い、とても多い」に変更されたことが確認できます。

levelsに大小関係を持たせる

levelsに大小関係を持たせる方法を紹介します。

先ほどのlevels「とても少ない、少ない、普通、多い、とても多い」「とても少ない<少ない<普通<多い<とても多い」というように大小関係を持たせ、数値のようにふるまいたい場合があると思います。

levelsに大小関係を持たせるときは、関数orderedを用います。

levelsの変更との違いは、大小関係を持たせることで比較演算子「<、>」が使えるようになることです。

まず準備として、先ほどのbarをcharacterに変更しfactorにすることで、levelsを辞書順にします。

barを参照すると、levelsの順序がおかしくなっていることが分かります。これを関数orderedを用いて、大小関係を持たせていきます。

orderedの引数は、levelsの変更で行った指定方法と同じです。変更後のlevelsを引数levelsに指定します。