準備
以下のように文字列型のベクトルを準備。
1 2 3 4 5 |
> s <- "sun" > m <- "mon" > t <- "tue" > (x <- c(s, m, t, m, s, m)) [1] "sun" "mon" "tue" "mon" "sun" "mon" |
因子型への変換
factor()
関数を使って因子型へ返還。このとき因子の順番はシステムで自動的に割り振られ、ソートするとその順番で並べ替えられる。
1 2 3 4 5 6 7 8 |
> (y <- factor(x)) [1] sun mon tue mon sun mon Levels: mon sun tue > str(y) Factor w/ 3 levels "mon","sun","tue": 2 1 3 1 2 1 > sort(y) [1] mon mon mon sun sun tue Levels: mon sun tue |
因子を指定した要素の抽出
要素の抽出は因子のラベルを指定して行う。
因子のオーダでの指定はできない。
1 2 3 4 5 6 |
> y[y == "sun"] [1] sun sun Levels: mon sun tue > y[y == 2] factor(0) Levels: mon sun tue |
因子の順序の指定
factor()
関数のlevels
指定で明示的に因子の順序を指定できる。
1 2 3 4 5 6 7 8 |
> (z <- factor(x, levels=c(s, m, t))) [1] sun mon tue mon sun mon Levels: sun mon tue > str(z) Factor w/ 3 levels "sun","mon","tue": 1 2 3 2 1 2 > sort(z) [1] sun sun mon mon mon tue Levels: sun mon tue |
因子の大小関係の指定
上記のベクトルyやzの各因子は順序関係を持っているが、それらは順序については特定できるが大小判定は行えない。
大小判定可能な値とするにはordered()
関数を通す必要がある。
1 2 3 4 5 6 7 8 9 10 11 12 |
> sort(z) [1] sun sun mon mon mon tue Levels: sun mon tue > z[z > "sun"] [1] <NA> <NA> <NA> <NA> <NA> <NA> Levels: sun mon tue 警告メッセージ: Ops.factor(z, "sun") で: ‘>’ not meaningful for factors > z <- ordered(z) > z[z > "sun"] [1] mon tue mon mon Levels: sun < mon < tue |
Factorベクトルの新規生成
一つ目の要素を定義する場合
通常紹介されている方法は、文字列型などのベクトルがあらかじめ準備されていて、それをFactor型に変換するというもの。
一つ目の要素を定義して、以降付け足していきたい場合は以下のようにする。
1 2 3 4 5 6 7 8 9 10 11 12 |
> (y <- factor(c("sun"), levels=c("sun", "mon", "tue"))) [1] sun Levels: sun mon tue > y[2] <- "mon" > y[3] <- "tue" > y[4] <- "mon" > y[5] <- "sun" > y[6] <- "mon" > > y [1] sun mon tue mon sun mon Levels: sun mon tue |
またlevels
を指定しないと、初期値以外はNAとなって警告が出る。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
> (y <- factor(c("sun"))) [1] sun Levels: sun > y[1] <- "sun" > y[2] <- "mon" 警告メッセージ: `[<-.factor`(`*tmp*`, 2, value = "mon") で: invalid factor level, NA generated > y[3] <- "tue" 警告メッセージ: `[<-.factor`(`*tmp*`, 3, value = "tue") で: invalid factor level, NA generated > y[4] <- "sun" > > y [1] sun <NA> <NA> sun Levels: sun |
またlevelsで指定した以外のラベルを指定するとNAとなり、最初の要素は無視され、その後追加しようとした要素はNAとして保存される。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
> (y <- factor(c("wed"), levels=c("sun", "mon", "tue"))) [1] <NA> Levels: sun mon tue > y[1] <- "sun" > y[2] <- "mon" > y[3] <- "tue" > y[4] <- "wed" 警告メッセージ: `[<-.factor`(`*tmp*`, 4, value = "wed") で: invalid factor level, NA generated > > y [1] sun mon tue <NA> Levels: sun mon tue |
要素数ゼロから定義する場合
最初からFactor型のベクトルを定義してゼロから要素を追加するには、以下のようにするとよい。
下記の例では、factor()
関数の第1引数に仮のベクトルをnumeric(0)
で与えているが、character(0)
でも同じ結果となり、単なるプレースホルダとなっているらしい。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
> (y <- factor(numeric(0), levels=c("sun", "mon", "tue"))) factor(0) Levels: sun mon tue > y[1] <- "sun" > y[2] <- "mon" > y[3] <- "tue" > y[4] <- "mon" > y[5] <- "sun" > y[6] <- "mon" > > y [1] sun mon tue mon sun mon Levels: sun mon tue |
データフレーム生成の場合の因子化について
データフレーム生成時に、文字列型ベクトルが自動的に因子型に変換される。これを抑止する方法についてはこちらを参照。