http://d.hatena.ne.jp/a_bicky/20140713/1405211663
R の named vector から subset を得る際の最悪計算量は O(n^2)
の前半部分で,データフレームの factor 列の情報に基づき新たな列を算出するのに,names を使うと速いよと書いてあった。
> nrow(students)
[1] 3000000
> class(students$grade)
[1] "factor"
> levels(students$grade)
[1] "可" "不可" "優" "良"
> scores
優 良 可 不可
30 20 10 0
という状況で,students$grade が,優,良,可,不可 のとき,students$score が 30, 20, 10, 0 となるようにするということ。
> system.time(students$score <- scores[students$grade])
ユーザ システム 経過
0.087 0.002 0.089
今まで,私なら,以下のようにしていた。
> system.time(students$score2 <- c(10, 0 , 30, 20)[as.integer(students$grade)])
ユーザ システム 経過
0.039 0.001 0.039
c(10, 0 , 30, 20) の順序は levels(students$grade) の順序に依存しているので,並び方がおかしいのはこのやりかたのせいではない。
倍速になったとはいっても,300 万行においてなので,意味のある差ではない。
scores[students$grade] の方がわかりやすいであろう。