回帰分析をするときに必要になってから覚えるものだと思いますが、Rには因子型(factor)と順序型(ordered)が標準で用意されています。因子型は性別のような排他的な選択肢をあらわすための変数型で、順序型は優・良・可・不可のような成績などのグレードのように、排他的な選択肢に序列をつけたものです。文字列型ではなく因子型にしておくと回帰の説明変数に用いることができ、順序型にしておくとさらに並び替えや順序回帰の被説明変数に用いることができます。
1 因子型(factor)
文字列型のベクトルがあれば、因子型にするのはas.factor
を使うだけで簡単です。
以下のような文字列と数値だけのデータフレームを用意しました。
head(df01, 10)
c s
1 e -0.1613182
2 a 2.3952199
3 c -0.3948340
4 a 1.6902416
5 e 3.3308266
6 e 1.1825714
7 b 1.6758935
8 c -0.2154811
9 c -0.1146497
10 a 1.7977346
このデータフレームの文字の列を因子型にします。
class(df01$c)
[1] "character"
class({ df01$f <- as.factor(df01$c) })
[1] "factor"
簡単ですね。
文字列型と何が違うのかと言うと、因子型は要素の種類を保持しており、levels
でそれを取り出せます。
levels(df01$f)
[1] "a" "b" "c" "d" "e"
因子型の一部分を抜き出しても、levels
は代わりません。
levels(df01[1, ]$f)
[1] "a" "b" "c" "d" "e"
因子型にしなくても文字列型でも処理してくれる関数が多いので御利益は認識しづらいのですが、回帰分析の説明変数に使えます。
summary(lm(s ~ 0 + f, data = df01))
Call:
lm(formula = s ~ 0 + f, data = df01)
Residuals:
Min 1Q Median 3Q Max
-2.9240 -0.4759 0.1841 0.6327 2.0596
Coefficients:
Estimate Std. Error t value Pr(>|t|)
fa 2.1651 0.2909 7.442 2.26e-09 ***
fb 1.1495 0.3809 3.018 0.004182 **
fc -0.4000 0.3359 -1.191 0.239980
fd 1.2919 0.3039 4.252 0.000106 ***
fe 1.9828 0.3039 6.526 5.17e-08 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.008 on 45 degrees of freedom
Multiple R-squared: 0.7377, Adjusted R-squared: 0.7086
F-statistic: 25.31 on 5 and 45 DF, p-value: 4.717e-12
levels
をみるように作ってある関数は、一部を切り出してもlevels
の因子の種類ごとに集計してくれます。
# 全体を因子型ごとに平均値を集計
aggregate(s ~ f, df01, mean)
f s
1 a 2.1651495
2 b 1.1494811
3 c -0.4000185
4 d 1.2918595
5 e 1.9828303
# character型をつかって先頭から3行を集計(bとdは省略される)
aggregate(s ~ c, df01[1:3, ], mean, drop = FALSE)
c s
1 a 2.3952199
2 c -0.3948340
3 e -0.1613182
# factor型をつかって先頭から3行を集計(bとdはNAになる)
aggregate(s ~ f, df01[1:3, ], mean, drop = FALSE)
f s
1 a 2.3952199
2 b NA
3 c -0.3948340
4 d NA
5 e -0.1613182
2 順序型(ordered)
順序ロジスティック回帰をしないと意識しない気がしますが、順序型も用意されています。
<- ordered(df01$c, levels = c("e", "a", "b", "c", "d")) o
levels
引数で因子を指定していますが、この並びが順序になります。e
が他の文字より小さいと設定しました。
以下のように比較演算が可能です。
paste(sprintf("%s < %s = ", o[1], o[2]), o[1] < o[2])
[1] "e < a = TRUE"
paste(sprintf("%s > %s = ", o[1], o[2]), o[1] > o[2])
[1] "e > a = FALSE"
ソートもかけることができます。
sort(o)
[1] e e e e e e e e e e e a a a a a a a a a a a a b b b b b b b c c c c c c c c
[39] c d d d d d d d d d d d
Levels: e < a < b < c < d
e
が最初に来ていますね。
order(o), ] df01[
データフレームの並び替えにも使えます。
数値型にすると、levels
で指定したときの順番が戻ります。
as.integer(o)
[1] 1 2 4 2 1 1 3 4 4 2 4 2 2 5 1 2 5 2 2 3 1 3 2 4 3 1 5 4 4 1 2 5 2 4 4 1 5 3
[39] 3 5 5 1 5 5 3 5 1 5 2 1