expand.gridとas.data.frame.characterにおけるfactorへの変換挙動の違い
こんな話がある。
http://uribo.hatenablog.com/entry/2015/11/22/173837
まあ実装が違うんだろうということで、関数の中身をみてみると、expand.gridの中ではfactor関数でunique関数をかけてlevelsを指定しているのに対し、as.data.frameではlevelsを指定していない。
指定していないということはfactorのデフォルトの挙動になるということで、デフォルトではuniqueしてsort.listした上でそれをfactorのlevelsに指定している。
つまり違いはuniqueした後にsort.listをかけているかどうかということであり、結果として上記記事のような挙動になる。
# expand.gridではlevelsを指定している x <- factor(x, levels = unique(x)) # as.data.frame.characterではlevelsを指定していない x <- factor(x) # 指定していない場合以下のようなコードでlevelsが指定される if (missing(levels)) { y <- unique(x, nmax = nmax) ind <- sort.list(y) y <- as.character(y) levels <- unique(y[ind]) }