factorを利用することでベクトルやデータフレームで質的変数を取り扱うことができる。
ファクター化するフィールドに対してfactor()関数を適用すると、ファクター化されたベクトルが取得できる。
値として”L”, “M”, “H”の文字列から成り立つベクトルを作る。
> x <- rep(c("L", "M", "H"), 9)
> x
[1] "L" "M" "H" "L" "M" "H" "L" "M" "H" "L" "M" "H" "L" "M" "H" "L" "M" "H"
[19] "L" "M" "H" "L" "M" "H" "L" "M" "H"
このベクトルに対してfactor()を適用する。
> x.fc <- factor(x)
ファクタ化された値の一覧はlevels()で取得できる。
> levels(x.fc) [1] "H" "L" "M"
ファクタではないフィールドにlevels()を適用しても要約は戻ってこない。
> levels(x) NULL
ファクタ化された値はtable()関数を使って頻度を簡単に取得できる。
> table(x) x H L M 9 9 9
データフレームではファクタでサブセットを取得することができる。
> xdf <- data.frame(x, x.fc) [1] "x" "x.fc" > xdf[xdf$x=="L",] x x.fc 1 L L 4 L L 7 L L 10 L L 13 L L 16 L L 19 L L 22 L L 25 L L > xdf[xdf$x.fc=="L",] x x.fc 1 L L 4 L L 7 L L 10 L L 13 L L 16 L L 19 L L 22 L L 25 L L
factorは順番を持たない。上記の場合”L”, “M”, “H”の間に順序はないために値としての違いを示すだけとなる。このような例としては血液型や色の種類別がある。これらはすべて異なったものを指し示すだけであり、それぞれの値について大小や優劣を比較することはできない。
Rでは順番を持つfactor型がある。通知表の”優”, “並”, “劣”は順番を持つ一例である。まずデータフレームを作成する。
> y <- data.frame(rep(c("L1", "L2", "L3"),10), seq(1,30,1))
> names(y) <- c("level", "seq")
> y
level seq
1 L1 1
2 L2 2
3 L3 3
4 L1 4
|
cutを使ってseqをカテゴリに分ける。1~30の値なので、3毎に分けたカテゴリを設定する。
> y$seq_cut <- cut(y$seq, breaks=seq(1, 30, 3), right=FALSE, ordered_result=TRUE) > y level seq seq_cut 1 L1 1 [1,4) 2 L2 2 [1,4) 3 L3 3 [1,4) 4 L1 4 [4,7) 5 L2 5 [4,7) 6 L3 6 [4,7) |
seq_cutの型をみてあげるとOrd.factorになっていることがわかる。
> str(y) 'data.frame': 30 obs. of 3 variables: $ level : Factor w/ 3 levels "L1","L2","L3": 1 2 3 1 2 3 1 2 3 1 ... $ seq : num 1 2 3 4 5 6 7 8 9 10 ... $ seq_cut: Ord.factor w/ 3 levels "(0,10]"<"(10,20]"<..: 1 1 1 1 1 1 1 1 1 1 ...
levels()でファクターの一覧を見てみる。
> levels(y$seq_cut) [1] "(0,10]" "(10,20]" "(20,30]"
度数分布も作成できる。
> table(y$seq_cut) (0,10] (10,20] (20,30] 10 10 10
サブセットを作るときにはダブルクォーテーションで囲んであげる。
> y[y$seq_cut=="(0,10]",] level seq seq_cut 1 L1 1 (0,10] 2 L2 2 (0,10] 3 L3 3 (0,10] 4 L1 4 (0,10] 5 L2 5 (0,10] |