Rにおけるカテゴリカルデータを数値データに変換する
概要
数値であるにも関わらずカテゴリカルデータとして読まれ、連続データに変換したいけれど上手くいかない人たちのためのヒントだ。このポストはその原理を説明するためにほとんどのページを割いているので、結論だけが必要ならば、以下の実践例から読むことをお勧めする。
普通、データ型を変える時は「キャスト」という表現を使う。
原理
Rを使った統計分析をする時、テクニックよりもまずデータそのものを理解することが最も重要だ。
アイリスデータを読み込んだ後、データを確認し、その構造str uctureを確認した姿だ。このようにstr()
関数を使うと、データのカラムがそれぞれどのような形で、どんな例があるのかを簡潔に説明してくれる。
head()
のように見やすい形ではないけれど、変数が増えるほど一目でわかり、データ型も把握しやすいので、よく使われる。だからstr()
一つで万能に思えるかもしれないが、データが広大で複雑になればなるほど、特異な例は多くなり、一つ一つを確認する必要が出てくる。
だから必要になるのがis.X()
関数とclass()
関数だ。is.X()
は与えられた引数がX
かどうかをブーリアンで返し、引数が複数あれば全てがX
かを判断する。class()
は具体的にどのようなデータ型かを文字列で返してくれる。
一方で、as.X()
関数は、与えられた引数を可能な限りX
に変換してくれる。
同様に、数値で書かれたカテゴリカルデータもas.numeric()
で変換すれば終わりそうだが、それより前にカテゴリカルデータを理解する必要がある。
実践例
次の例を見てみよう:
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)