rbind_allにおけるfactorの扱いについて

rbind_allをfactorを含むデータフレームに使うと挙動が安定しないとのコメントをいただいたのでさらっと見てみました。(musimasamiさんありがとうございます)

ラベル名が異なる場合

警告付きでcharacterで返ってきます。
rbindの場合、レベルを追加してfactorで返ってきます。

library(dplyr)

iris3 <- iris2 <- iris
iris2$Species <- factor(gsub("setosa", "hoge", iris2$Species))
iris3$Species <- factor(iris3$Species, levels = c("versicolor", "virginica", 
    "setosa"))

str(iris$Species)
##  Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
str(iris2$Species)
##  Factor w/ 3 levels "hoge","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...
str(iris3$Species)
##  Factor w/ 3 levels "versicolor","virginica",..: 3 3 3 3 3 3 3 3 3 3 ...
## 使われているラベル名が異なる場合 rbind_allで結合した場合
iris12a <- rbind_all(list(iris, iris2))
## Warning: Unequal factor levels: coercing to character
str(iris12a$Species)
##  chr [1:300] "setosa" "setosa" "setosa" "setosa" "setosa" ...

# rbindで結合した場合
iris12b <- rbind(iris, iris2)
str(iris12b$Species)  # レベル数が増える
##  Factor w/ 4 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

factorにおいて使われているラベル名が同一の場合

レベルが同じであれば特に問題ありません。
レベルが異なる場合はそのままfactorで返ってきます。
最初のデータフレームのレベルを引き継いでいるようです。

## 使われているラベル名が同一の場合
iris13 <- rbind_all(list(iris, iris3))
iris31 <- rbind_all(list(iris3, iris))

str(iris31$Species)
##  Factor w/ 3 levels "versicolor","virginica",..: 3 3 3 3 3 3 3 3 3 3 ...
str(iris13$Species)
##  Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

最後に

仕様を把握するにはコードを読む必要があるのですがC++なのでやめました。