rでの因子型(factor)の基本的な取り扱い方の備忘録です。
以下の内容について紹介しています。
- factor型のベクトルを作る
- 順序つき因子の作成
- factorの順序の修正(ordered)/順序の追加
- 他の型の関数をfactor型に変換する(as.factor)
factor型のベクトルを作る
以下のように、factorでくくるとfactor型のベクトルを作れます。
> tmp <- factor(c("a","b","a","c","c","b","a"))
> tmp
[1] a b a c c b a
Levels: a b c
factor型は上記のように作成した時のlevelsで表記される値しか格納できません。
なので上記にはないdを追加しようとするとエラーになります。
> tmp[8] <- "d"
警告メッセージ:
`[<-.factor`(`*tmp*`, 8, value = "d") で:
invalid factor level, NA generated
#levelsで設定されている値は問題なく追加可能
> tmp[8] <- "a"
> tmp
[1] a b a c c b a a
Levels: a b c
上記の回避方法として、ベクトル作成時にlevelsの要素を指定することで値にはないものもlevelsに設定できます。
> tmp <- factor(c("a","b","a","c","c","b","a"), levels=c("a","b","c","d"))
> tmp[8] <- "d"
> tmp
[1] a b a c c b a d
Levels: a b c d
順序つき因子の作成
orderedをTRUE(デフォルトはFALSE)とすることで、要素に順序をつけることができます。
> tmp <- factor(c("a","b","a","c","c","b","a"), levels=c("a","b","c","d"), ordered = TRUE)
> tmp
[1] a b a c c b a
Levels: a < b < c < d
こうすると、ある値以上/以下の値を抽出できます。
例えば以下ではb未満(a)を抽出しています。
> tmp[tmp<"b"]
[1] a a a
Levels: a < b < c < d
factorの順序の修正(ordered)/順序の追加
順序を間違えて設定してしまった場合や順序の設定をし忘れた場合は、ordered関数で修正できます。
> tmp
[1] a b a c c b a
Levels: a < b < c < d
> tmp <- ordered(tmp, levels=c("d","c","b","a")) #levelsで順序を再指定
> tmp
[1] a b a c c b a
Levels: d < c < b < a #修正されている
他の型の関数をfactor型に変換する(as.factor)
as.factor関数を使用することで、文字列などの通常のベクトルをfactor型に変換できます。
> tmp <- c("a","b","a","c","c","b","a"); tmp
[1] "a" "b" "a" "c" "c" "b" "a"
> tmp2 <- as.factor(tmp); tmp2
[1] a b a c c b a
Levels: a b c
以上になります。
factor型のベクトルを文字列のベクトルにする
こちらは上記とは逆にas.character関数を使用します。
> tmp
[1] a b a c c b a
Levels: d < c < b < a
>as.character(tmp)
[1] "a" "b" "a" "c" "c" "b" "a"
数値型の場合はas.numeric関数で数値型に変換することができます。
> tmp_num <- factor(c(1,2,3,4,3,2,3));tmp_num
[1] 1 2 3 4 3 2 3
Levels: 1 2 3 4
> as.numeric(tmp_num)
[1] 1 2 3 4 3 2 3