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++なのでやめました。