logo

Rでカテゴリデータの数字を数値データに変換する 📂R

Rでカテゴリデータの数字を数値データに変換する

概要

数字であるにもかかわらずカテゴリデータとして読み込まれてしまい、連続型データに変換したいのに思うようにいかない人のためのヒントである。この記事は紙面のほとんどをその原理を説明することに割いているので、結論だけ必要ならば下の実戦例から読むことをお勧めする。

参考までに、通常データ型を変換するときはCastという表現を使う。

原理

Rを用いて統計分析をするとき最も重要なのは、テクニック以前にデータそのものを理解することである。

20180327\_122310.png

アイリスデータを読み込んだ後、データを確認し、その構造str uctureを確認した様子である。このようにstr()関数を使うと、データの各カラムがそれぞれどのような形でその例が何なのかを簡潔に説明してくれる。head()のように見やすい形ではないが、変数が多くなるほど一目で把握でき、データ型も掴めるので使う機会が多い。それゆえstr()一つあれば万能のように思えるが、データが膨大で複雑になるほど特異な例は多くなり、一つ一つ確認する必要が生じる。

20180327\_124419.png

そこで必要になるのがis.X()関数群とclass()関数である。is.X()は与えられた引数がXであるか否かをブーリアンで返し、引数が複数ならばすべてXであるかを判定する。class()は具体的にどのようなデータ型なのかを文字列で返してくれる。

20180327\_124802.png

一方as.X()関数は、与えられた引数を可能な限りXに変換してくれる。同様に、数字で書かれたカテゴリデータもas.numeric()で変換すれば終わりそうに思えるが、その前にカテゴリデータを理解しなければならない。

実戦例

次の例を見てみよう:

20180327\_130132.png

x1は正しく変換されなかったが、x2は意図した通りに変換されたことに注目しよう。その原理は次の通りである。

見ての通り、カテゴリ化されたデータは数としては何の意味も持たず、分けられた階級の一つに属するだけである。それゆえas.numeric()で変換したとしても、カテゴリであるという点に基づいて自然数に一対一対応がなされることになる。考えてみれば$\left\{ a, 2, c , \cdots , z_{2} \right\}$のようなカテゴリにも対応するためには、このような方式が最も妥当である。

したがって与えられた数をそのまま維持するためには、まず文字列に変換してから数に変換する必要がある。数からなるカテゴリが文字列に変換されるときは特に自然数に対応せずそのまま受け取られるので情報の損失がなく、数からなる文字列が数に変換されるときは特に新しい数を作り出す必要がないので情報の損失がない。

関数とデータ型をよく理解していれば、データハンドリングにおいて有用な様々なトリックを使えるようになる。すぐに直接的に統計と関係ないからといって軽視してはならない貴重な武器なのである。

コード

以下は例題コードである。

example<-iris
head(example)
str(example)
 
is.numeric(example$Sepal.Length)
is.character(example$Sepal.Length)
class(example$Sepal.Length)
 
is.numeric(example$Species)
is.character(example$Species)
class(example$Species)
 
is.numeric(example)
is.character(example)
class(example)
 
one<-'1'
is.numeric(one)
is.character(one)
class(one)
 
one<-as.numeric(one)
class(one)
is.numeric(one)
is.character(one)
class(one)
 
x<-as.factor(c(1,2,3,128,67915)); x
x1<-as.numeric(x); x1
is.numeric(x1)
x2<-as.numeric(as.character(x)); x2
is.numeric(x2)