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に指定します。

上を実行し、以下のようにbarを参照すると、Levelsの項目に大小関係「<」が含まれていることが分かります。

大小関係を持たせたことで、次のように比較演算子を用いて論理演算を行うことが可能となりました。

factorの操作に用いる関数

factorの操作で用いた関数を以下にまとめました。

関数levels

levels(x)の引数を以下にまとめました。

関数levelsの引数
xlevelsを参照したいfactor型のベクトル

関数nlevels

nlevels(x)の引数を以下にまとめました。

関数transformの引数
xlevelsの数を参照したいfactor型のベクトル

関数factor

factor(x, levels, labels = levels, exclude = NA, ordered = is.ordered(x), nmax = NA)の引数を以下にまとめました。

関数factorの引数
levelsxのlevelsを指定する
labelslevelsにラベル付けをする
excludelevelsから除外するlevels。初期値がNAであり、NAを除外したくないときはexclude = ""とする。
orderedlevelsの順序。初期値は辞書順。
nmaxlevels数の上限

関数ordered

ordered(x,...)の引数を以下にまとめました。

関数orderedの引数
x順序を指定するfactor型のベクトル
levelsR document上では、互換性の観点から引数として載っていないが、levelsの順番で順序を指定できる。

numeric型とfactor型の注意点

最後にnumeric型とfactor型を操作するときの注意点について、具体例を交えながら説明します。

今回用いたデータを例に、総人口を10000個のlevelsで分割したfactorを用意します。

barを参照すると、次のように10000個で分割されていることが分かります。

このfactorを数値と扱いたため、as.factorを行ってみます。

すると、次のように元のfactorのlevelsの値と異なることが分かります。

factorをnumericにすると各要素が水準のindexになってしまうことが原因です。

これを解決するには、下のようにas.numericを行う前にas.characterを用います。

このようにして、factorの要素をnumericとして扱ことが可能となります。

まとめ

numeric型やfactor型の操作やnumeric型、character型、factor型にそれぞれ変換する方法を学びました。

今回紹介した内容で、ほとんどのデータ整形に対応できると思います。

ぜひここで得た内容を役立ててください。

スポンサーリンク

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

usagi-san

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

-R言語
-,