factorのレベルをそろえたい

R言語の中でfactor(因子型)は数値として扱われており、外っつらが同じでも中が異なる場合があるので注意が必要だ。
例えば

>|r|
> rlove <- c("R", "L", "O", "V", "E")
> x <- factor(rlove)
> x
[1] R L O V E
Levels: E L O R V
> as.numeric(x)
[1] 4 2 3 5 1
> y <- factor(rlove, levels=LETTERS[-(1:4)])
> y
[1] R L O V E
Levels: E F G H I J K L M N O P Q R S T U V W X Y Z
> as.numeric(y)
[1] 14  8 11 18  1

な感じで、そとっつらはどちらも"RLOVE"と見えるが、中に入ってる数値は異なるのである。

このレベルを揃えたい時には、そろえたい側のlevelを引数として再度factorとしてやる。

x <- factor(x, levels=levels(y))

結果は

> x <- factor(x, levels=levels(y))
> as.numeric(x)
[1] 14  8 11 18  1

でちゃんと同じにそろった。

あるいはある文字だけ追加したい場合は

factor(c("hoge", make.names(x)))[-1]
> factor(c("hoge", make.names(x)))[-1]
[1] R L O V E
Levels: E hoge L O R V

なんて書いてもいい。

うっかりすると間違えるポイントである。