R言語による医療データ分析

R言語によるデータ分析のオンラインコースを中心に、さまざまなデータ分析について記載してあります。

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)

まとめ一覧