R言語

R言語 自動でデータ整形してくれる関数【データ整形不要】

  1. HOME >
  2. R言語 >

R言語 自動でデータ整形してくれる関数【データ整形不要】

スポンサーリンク

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

今回はデータ解析に役立つ関数を作ってみました。

自分がアルバイトをする中で、データ整形(データクレンジング)に用いる時間が勤務時間の9割に及び、肝心な統計解析にミスがあったり、そもそも疲れて解析のチェックを行えなかったりしたので作りました。

R言語 データ整形練習やnumeric型やfactor型でも解説しましたが、統計解析を行う前提として、欠損値の処理やnumeric型のデータをカテゴリカルデータにしたり、factor型のlevelsの変更を行ったりなど、統計解析以上にやることがいっぱいあります。

今回紹介する関数は、上で述べたデータ整形をすべて自動で行い、統計解析に用いやすいデータセットに変換してくれるものとなっています。

また、この関数は次の記事のパッケージや、この記事の下でダウンロード可能なので、ぜひぜひダウンロードしてください。

R言語 自作パッケージ UsagiSan

こんにちは、usagi-sanです。 R言語の自作パッケージを紹介します。 統計解析のアルバイトをしている中、暇な時間を見つけて自分でパッケージを作ってみました。 Rのパッケージには、統計解析用のパッ ...

続きを見る

アップデート

2020/9/19に不具合を修正しました。定義されていない変数を除去しました。

2020/12/04 日付型の変数の判別アルゴリズムを変更しました。日付の区切り文字の引数を指定する必要がなくなりました。

2020/12/04 factor型のlevelをNAに置き換える際の形式を"NA"からN/Aに変更しました。

関数dataCleanserの説明

関数dataCleanserの概要を説明します。

関数dataCleanserには以下の4つ機能があります。

  1. character型の列ベクトルが、numeric型かfactor型かDate型かであるかを判別する
  2. その判別に基づき、列ベクトルを対応する型(numeric型かfactor型かDate型のいずれか)に変更する。
  3. オプションとしてnumeric型のデータをカテゴリカルデータに変更可能。numericと判定されなかったデータを数値に置き換えることが可能
  4. factor型のデータのlevelsの変更、levelsのプール、levelsの順序変更が可能。

分かりやすく、実行結果を用いて説明すると、1の「numeric型かfactor型かDate型かであるかを判別する」とは、次のようなデータセットの各列はどの型であるべきかを判定してくれます。

ポイント1

1~4列目の"Sepal.Length"、"Sepal.Width"、"Petal.Length"、"Petal.Width"には"欠損値"、"測定なし"という2種類のNAにあたる欠損値が入っているためcharacter型となっています。今回紹介する関数は1~4列目をnumeric型であると判定します。

ポイント2

5、6列目はfactor型である必要がありますが、read.tableなどでファイルを読み込む際に、stringsAsFactors=FALSEとしていると、factor型のデータはcharacter型として扱われます。この列をfactor型であると判定してくれます。

ポイント3

最後に7列目の日付データに関しても、R上ではcharacter型として扱われます。また日付データといっても"%Y/%m/%d"や""%Y年%m月%d日"といった色々な書式があります。これらの書式に関係なく、Date型であると判定してくれます。

ポイント4

次に2に関して、1で3種類に分けたデータをもとに、データセットを統計解析で扱いやすい形にデータ整形してくれます。すなわちcharacter型のデータをnumeric型、factor型、Date型の3種類のデータに変更してくれます。

ポイント5

3のオプションについて、numeric型のデータをカテゴリカルデータに変更することができます。cut関数と同じ機能を持ちます。また、c("2", 3", "<5")のデータについて、numeric型として判定されないデータ"<5"を5に置き換える機能もあります。

ポイント1

最後に4について、factor型のデータのlevelsの変更、levelsのプール、levelsの順序の変更といったR言語データ整形numeric型やfactorで解説したfactor型の操作に関する機能をすべて搭載しています。

関数dataCleanser

データ整形用の関数dataCleanserは以下となります。

"データセット.csv"というcsvファイルをデータ整形したい場合、下の表の引数dataNameをdataName = "データセット"のようにcharacter型を代入することで、データ整形を行うことができます。

append = TRUEとすると、オプション機能のlevelsのプールを適用した列は、プール前とプール後が残るように元のデータセットにアペンドする機能を付与します。

また、NumOrFacleastNumOfDateはnumeric型、factor型、Date型を判定する際に用います。例えばNumOfFacについてlevelsのがデータセットの行数のどのくらいの割合を占めているかでnumeric型かfactor型であるかを判定しています。

作業ディレクトリ中に"dataCleanserForm_データセット_.xlsx"というエクセルファイルが存在しない場合、データ整形の入力フォーム用のエクセルファイルが作成されます。このエクセルファイルを書き換えることで、上で紹介したオプション機能を扱うことができます。

エクセルファイルがデフォルトの状態で実行すると、オプションなしの通常のデータ整形が行われます。これらのオプションやエクセルファイルの記述法については、次の関数dataCleanserの使用例を参照してください。

ココに注意

dataCleanserは、他にも10個の関数を用いており、上のコードをコピペしても使用することができないため、必ずダウンロードしてください。zipファイルを開くとわかりますが、dataCleansing.Rの中には上の関数の他にも、Date型を判定する関数や、factor型の操作に関する関数が一通り入っています。

dataCleanser(dataName, dateFormat = list("/","-", c("年","月","日")), append = FALSE, NumOrFac = 10, leastNumOfDate = 10, fileEncoding = "CP932")の引数の説明を以下にまとめました。

関数dataCleanserの引数
dataNameデータ整形するcsvファイルの名前。
appendlevelsをプールした列などをappendするかどうか。
NumOrFacnumeric 型かfactor型か判断する際のfactor型のlevelsの数。初期値は10であり、行数の1/10以上のlevelsがあれば、numeric型であると判断される。
leastNumOfDateDate型と判断する際の行数と日付を表す文字列の比。初期値は10であり、行数の1/10以上の日付を表す文字列があれば、Date型と判断される。
fileEncodingファイルエンコーディング。初期値は"CP932"

関数の使用例

データセットirisfactor型の列"Sepal.Length<mean or ≧mean"とDate型の列"time"を加えた次のデータセットを例に解説していきます。

データ整形の流れ

上の関数の概要で紹介したように、今回用いるデータセットは次となります。

このデータに対して、データ整形用の関数dataCleanserを用います。

以下のように、引数にデータセットが保存されているファイル名(csvファイル名)を代入します。

実行すると、作業ディレクトリに"dataCleansingForm_iris改_.xlsx"というファイルが作成されています。

"dataCleansingForm_iris改_.xlsx"には以下の画像のように、iris改.csvのデータがnumeric型、factor型、Date型3種類のエクセルシートに分けられていることが分かります。

データ整形numeric

データ整形factor

データ整形Date

"iris改.csv"の各列が正しく整頓されていることを確認したら、改めてdataCleanserを実行します。

"dataCleansingForm_iris改_.xlsx"が作業ディレクトリにある状態でもう一度実行すると、dataCleanserはそのクレンジングフォームをもとにデータ整形を行ってくれます。

上の結果のように、numeric型のデータに関して、"欠損値"、"測定なし"はNAに置き換わります。

また、Date型の列"time"に関して、"1913年3月4日"のようなデータは扱いやすい"1913-03-04"という形に変換されています。

オプション機能

オプション機能である。データの列名の変更、numeric型のカテゴリカルデータ化や欠損値の置き換え、factor型のlevelsの変更やプールやlevelsの順序の変更の方法をみていきます。

列名の変更

データの列名の変更は、次の画像のようにnumeric型、factor型の場合は、ColNameの横にある"Change the colName"に変更後の列名を書きます。

データ整形列名の変更

"Sepal.Length"という列名を"セパルの長さ"に変更します。

書き終えたら、エクセルファイルを保存し閉じたら、dataCleanserを実行すると、列名が変わっていることが確認できます。

また、Date型のデータも同様に、"ColName"と"Change the colName"の列があるのでColNameの横に変更後の列名を書くことで変更することができます。

欠損値の置き換え

欠損値の置き換えをみていきます。上の"dataCleansingFrom_iris改_.xlsx"を例に説明していきます。

numeric 型のデータ"Sepal.Length"には、"欠損値"と"測定なし"が"Missing Values"であると判定されています。dataCleanserにより、これら2つのデータがNAであると判定されています。

これらのデータをNAにしたくないとき、例えば"欠損値"と"測定なし"0に変更したい場合があると思います。

"欠損値"と"測定なし"を0に変更したいときは、次の画像のように、"dataCleansingFrom_iris改_.xlsx"の4列目の"Replace the column B with the spesific numbers"を置き換え後の値を代入します。

データ整形numeric欠損値置き換え

代入したら、保存してエクセルファイルを閉じます。

dataCleanserを実行してみましょう。実行すると、次のようにSepal.Lengthにあった欠損値がすべて0に置き換わっています。

ココに注意

置き換え後の値が数値以外の場合は通常通りNAになります。

numericをカテゴリカルデータに変更

numeric型をカテゴリカルデータに変更したい場合を考えます。

1列目の"Sepal.Length"(-∞, 5)[5, ∞)という区間に分けてみます。

"dataCleansingForm_iris改_.xlsx"6行目8行目にそれぞれ、cut関数のbreakslabelsの引数に対応するように書いていきます。

上の区間に分けたい場合、次のように","区切りでbreaksを代入します(" "は入れないでください)。

データ整形numeric_カテゴリカルデータに変更

エクセルファイルを保存し、閉じます。dataCleanserを再び実行すると次のように、"Sepal.Length"を参照するとカテゴリカルデータに変更されていることが確認できます。

factorのlevelsの変更

次にfactorのlevelsの変更方法を説明します。

"dataCleansingForm_iris改_.xlsx"のシート"factor"には、levelsの列があり"Species"のlevelsが整理されていることが分かります。

Speciesののlevels"setosa"、"versicolor"、"virginica""セトナ"、"バーシクル"、"バージニカ"に変更してみます。

次のように、シート"factor""Replace the column B with"に置き換え後の値を代入してください。

データ整形factor_levelsの変更

エクセルファイルを保存し閉じたら、dataCleanserを実行してください。

次のように、列"Species"のlevelsが英語から日本語に変更されていることが確認できます。

ココに注意

変更したいlevelsと変更後の値はエクセルファイル上で対応する(横に並ぶ)ようにしてください。

また、あるlevelsをNAにしたいときは、次の画像のようにNAにしたいlevelの横にN/Aを入れます。

levelをNAに

factorのlevelsのプール

facorのlevesのプール方法について説明します。

levelsをプールするには、"dataCleansingForm_iris改_.xlsx"の6行目の"Pool the column B"の列に、プールしたいlevelsの番号を"+"を用いて書きます。

levelsの番号は2列に"No.1"、"No.2"、"No.3"のように、各levelsに対応する番号が並んであります。

例として、セトナバージクルをプールしてみましょう。次の画像のように、4列目に"1+2"を代入します。

データ整形factor_プール

エクセルファイルを保存し閉じたら、dataCleanserを実行します。

実行すると次のように、"Species"のlevelsのセトナとバーシクルがプールされていることが分かります。

また、次の画像のように同じ名前のlevelsに変更した場合にプールする方法を解説します。

データ整形factor_replace後のlevelsプール

ポイント

replaceを指定しているとき、プールする際に、関数dataCleanserは5列目のreplaceに書かれている新しいlevelsを基にプールを行います。

上の画像を例に、"セトナ"と"バーなんとか"の2つのlevelsをプールを行いたい場合、7行目のプールに"1+2""1+3"を書きます。

ココに注意

上の画像では、"1+3"と書いていますが、どちらでも構いません。repladeを指定した場合、元のlevelsの番号を基にプールするのではなく、新しいlevelsを基にしていることに注意してください。

factorのlevelsの順序の変更

最後に、factorのlevelsの順序の変更方法について説明します。

levelsの順序を変更するには、"dataCleansingForm_iris改_.xlsx"の9行目の"The order of levels"に変更後の順序を入れます。

次のように9行目に順序を代入します。levelsの数だけ順序の数字を代入することが可能です。

また、levelsが多い場合、すべての順序を指定しなくても、最初や2番目のlevelのみ指定するといったことも可能です。

かなり柔軟なlevelsの順序の変更が可能です。

次のように、levelsの順序を逆にするために、"2"、"1"と縦に代入します

データ整形factor_levels順序変更

エクセルファイルを保存し閉じたら、dataCleanserを実行します。

次のようにlevelsの順序が変更されていることが確認できます。

また、replaceとpool後のlevelsの順序の変更方法について解説していきます。

プールの時と同様に、順序変更は、新しいlevelsを基に行います。

次の画像のように、replaceとpoolを行っている場合を考えます。

データ整形factor_replaceとpool後のlevelの順序変更

ココに注意

この場合、新しいlevelsは、"セトナ"と"バーなんとか"をプールした"セトナ+バーなんとか"のみとなるため、上の画像のように順序は"1"以外選択できません。変更後のlevelsの数に注意しながら使用してください。

関数のダウンロード

以下のダウンロードリンクより、関数dataCleanserをダウンロードできます。

解析時間の短縮に役立てたら、幸いです。

まだまだ、バグは多いと思いますが、逐次修正し改良していきます

後に、githubからでもインストールできるように、パッケージを開発しようと思います。

ぜひ使ってみてください。

スポンサーリンク

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

usagi-san

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

-R言語
-, , ,