040-043 因子型の説明(S4)
因子型とは
- 男/女のようにいわゆる、カテゴリカル変数と呼ばれるものをRで現すときに使われる型です。
- as.factor(文字列型のベクトル)で作れます。
- レベル(数字)とそれに対応したラベル(文字)で表現されています
factor_table <- data.frame( seibetu = c("男","女","男","男","男","男"), ketueki = c("A","B","O","O","AB","A"), umare = c("大阪","京都","兵庫","兵庫","京都","大阪"), alcohol = c("週1日以内","週3-6日","週3-6日","毎日","のまない","週1-2日") )
- この時点では、すべてが文字列型のはずです。
summary(c("男","女","男","男","男","男")) summary(factor_table$seibetu) #??? default.stringsAsFactors()
- このstringsAsFactorsという設定が実はデフォルトでは、TRUEになっています。
- Helpをみると、
?data.frame
stringsAsFactors = default.stringsAsFactors()というオプションがあり、strings(文字列)As(を)Factors(因子に)というオプションがTRUEになっているため、data.frame関数は勝手に文字列を因子型に変換してしまいます。
この挙動が困るのは、例えば、間違って数値型に列を変換してしまったときに、
as.numeric(c("男","女","男","男","男","男"))
- 文字列型であれば数値型に変換できずエラーがでてしまうのですが、
as.numeric(factor_table$seibetu)
- なんと数字型に変換できてしまいます!
- これは因子型の「レベル」に対しての操作になるためこのような結果になります。
string_table <- data.frame( seibetu = c("男","女","男","男","男","男"), ketueki = c("A","B","O","O","AB","A"), umare = c("大阪","京都","兵庫","兵庫","京都","大阪"), alcohol = c("週1日以内","週3-6日","週3-6日","毎日","のまない","週1-2日"), stringsAsFactors = FALSE ) summary(string_table) summary(factor_table)
因子型のレベル
factor_table
- さて、生まれ変数が関西圏が並んでいますが、日本には都道府県が47あります。
factor_table$umare
- レベルが3つしかありません。なぜなら、Rには、入力されたデータからしか因子をつくることができないからです。
- とりあえず、関西圏のデータであるという前提があるとして、整えます。
x <- factor_table$umare levels(x) c(levels(x), "奈良", "滋賀", "和歌山") a <- factor(x, levels=c(levels(x), "奈良","滋賀", "和歌山")) a summary(a)
- このようにすると、因子型のベクトルに対して、必要なレベル設定をしてあげることができました。
- labelという設定もありますが、levelと考え方は同じです
#レベルベクトル: vecLev <- c(1,2,3,4,5,6) #ラベルベクトル: vecLab <-c("京都","大阪","兵庫","奈良","滋賀","和歌山") a <- factor(c(1,2,3,1,2,3,4,5,3,4,5,6,3), levels=vecLev, labels=vecLab) a as.numeric(a)