質的変数を表現するためのデータ構造として,因子という特殊なデータ構造があります.質的変数には名義尺度と順序尺度がありますが,Rではそれぞれ順序なし因子(unordered factor)と順序付き因子(ordered factor)となります.順序なし因子および順序付き因子のいずれもRの内部では整数で構成されるベクトルになっており,この整数に質的変数のラベルを対応づけています.実際にRで分析を行うときに,因子がデータ構造であることを意識しなくてはならない場面は少なく,文字列や論理値と同様のデータ型として取り扱っても大きな問題はありません.
なお,Rの4.0.0より前のバージョンでは,インポートしたデータに文字列が含まれると自動的に因子に変換されましたが,現行のRでは文字列が強制的に因子に変換されることはありません.R 4.0.0がリリースされたのは2020年4月24日ですので,それ以前の書籍やWeb記事等を参考にする場合は注意してください.
因子を作成する関数はfactor関数です.因子を作成するためには,まずベクトルを作成し,これを因子に変換します.ベースとなるベクトルは文字列と数値のいずれでも良いですが,実際のデータ分析では文字列ベクトルの方が扱いやすいと思います.例えば,下記のようにcha1というベースとなる文字列ベクトルを作成します.このcha1は"abc","def","ghi"という3種類の文字列からなる5つの要素を持っています.これらの文字列をlevels引数に記述することで,文字列ベクトルが因子へと変換されます.
cha1 <- c("abc", "def", "abc", "ghi", "ghi")
f1 <- factor(cha1, levels = c("abc", "def", "ghi"))
f1
[1] abc def abc ghi ghi
Levels: abc def ghi
f1に代入されている値は文字列ではなく因子であるため,出力された値にはダブルクォーテーションが付かず,Levelsという項目が付記されています.Levelsは因子における各水準の名称を指しています.factor関数ではlabels引数を用いることで,各水準の名称を自由に変更できます.例えば,"abc","def","ghi"という水準の名称を"X","Y","Z"に変更するのであれば以下のようになります.
f2 <- factor(cha1, levels = c("abc", "def", "ghi"), labels = c("X", "Y", "Z"))
f2
[1] X Y X Z Z
Levels: X Y Z
f1とf2はいずれも順序なし因子です.順序付き因子を作成するならば,ordered引数を追記します.ordered引数はデフォルトの値がFALSEとなっており,これをTRUEとすることで当該のベクトルは順序付き因子になります.また,各水準の順序はlevels引数に記述されている順に小さな値となります.
f3 <- factor(cha1, levels = c("abc", "def", "ghi"), ordered = TRUE)
f3
[1] abc def abc ghi ghi
Levels: abc < def < ghi
f4 <- factor(cha1, levels = c("abc", "def", "ghi"), labels = c("X", "Y", "Z"), ordered = TRUE)
f4
[1] X Y X Z Z
Levels: X < Y < Z
上記の方法は文字列ベクトルから順序付き因子の作成方法です.上掲のf1やf2のような順序なし因子がすでに作成されている場合は,factor関数の第1引数をf1やf2としてordered引数を追記するだけで順序付き因子が作成されます.
f3 <- factor(f1, ordered = TRUE)
f3
[1] abc def abc ghi ghi
Levels: abc < def < ghi
f4 <- factor(f2, ordered = TRUE)
f4
[1] X Y X Z Z
Levels: X < Y < Z
ベクトルを因子に変換する関数はas.factor関数です.as.factor関数は文字列ベクトルをそのまま順序なし因子に変換するときに用います.そのため,因子の水準の名称を変更するときにはlevels関数を,順序付き因子を作成するときにはordered関数を利用しなくてはなりません.
cha1 <- c("a", "b", "a", "c", "c")
f5 <- as.factor(cha1)
f5
[1] a b a c c
Levels: a b c
levels(f5) <- c("X", "Y", "Z")
f5
[1] X Y X Z Z
Levels: X Y Z
f6 <- ordered(f5, levels = c("X", "Y", "Z"))
f6
[1] X Y X Z Z
Levels: X < Y < Z
上記のようにlevels関数はnames関数と似たような機能を有する関数です.names関数がベクトルの各要素のラベルの確認に使用できたように,levels関数も水準の名称の確認にも使用できます.また,因子を再び文字列に戻すのであれば,as.character関数を使用します.