x <-c("dog", "cat", "pig", "horse")factor(x)## [1] dog cat pig horse## Levels: cat dog horse piggl(2, 8, labels=c("A", "B")) # AとBを8回ずつ繰り返す因子## [1] A A A A A A A A B B B B B B B B## Levels: A B# 4つのラベルを1回ずつ16個まで繰り返す因子gl(4, 1, 16, labels=c("cat", "dog", "pig", "rat")) ## [1] cat dog pig rat cat dog pig rat cat dog pig rat cat dog pig rat## Levels: cat dog pig rat
因子と文字列を表示したときの違いは、
表示したときにダブルクオーテーションがあるかどうか(あれば文字列、なければ因子)
表示したときにLevelsが表示されるか(表示されなければ文字列、表示されれば因子)
の2点です。文字列なのか因子なのかわからないときには、コンソールに表示してみるとよいでしょう。
因子と文字列の違い
x <-rep(x, c(5, 4, 3, 2))x # これは文字列のベクター(ダブルクオーテーション付き)## [1] "dog" "dog" "dog" "dog" "dog" "cat" "cat" "cat" "cat" ## [10] "pig" "pig" "pig" "horse" "horse"fx <-factor(x)fx # こちらは因子のベクター(Levelsを表示)## [1] dog dog dog dog dog cat cat cat cat pig pig pig ## [13] horse horse## Levels: cat dog horse pig
デフォルトのRの関数群でも因子の順序などを編集することはできますが、因子の演算を行う専門のライブラリであるforcats(Wickham 2023)を用いると、より簡潔に、統一感のある因子の演算を行うことができます。forcatsもtidyverse(Wickham et al. 2019)に含まれるライブラリの一つです。
fx3 <-factor(rep(c("rat", "mouse", "sheep"), c(3, 4, 5)))c(fx, fx3)## [1] dog dog dog dog dog cat cat cat cat pig pig pig ## [13] horse horse rat rat rat mouse mouse mouse mouse sheep sheep sheep## [25] sheep sheep## Levels: cat dog horse pig mouse rat sheepfct_c(fx, fx3) # レベルが追加される(c関数でつないでもほぼ同じ)## [1] dog dog dog dog dog cat cat cat cat pig pig pig ## [13] horse horse rat rat rat mouse mouse mouse mouse sheep sheep sheep## [25] sheep sheep## Levels: cat dog horse pig mouse rat sheepfct_unify(list(fx, fx3)) # 因子のリストにそれぞれレベルを追加する## [[1]]## [1] dog dog dog dog dog cat cat cat cat pig pig pig ## [13] horse horse## Levels: cat dog horse pig mouse rat sheep## ## [[2]]## [1] rat rat rat mouse mouse mouse mouse sheep sheep sheep sheep sheep## Levels: cat dog horse pig mouse rat sheep
fct_relevel(fx, c("dog", "cat", "pig", "horse")) # factor(fx, levels=c("dog", "cat", "pig", "horse"))と同じ## [1] dog dog dog dog dog cat cat cat cat pig pig pig ## [13] horse horse## Levels: dog cat pig horsefct_infreq(fx) # 要素が多いものから順番に並べ替える## [1] dog dog dog dog dog cat cat cat cat pig pig pig ## [13] horse horse## Levels: dog cat pig horsefct_inorder(fx) # 要素が前にあるものをレベルの前に変更する## [1] dog dog dog dog dog cat cat cat cat pig pig pig ## [13] horse horse## Levels: dog cat pig horsefct_rev(fx) # レベルを逆順にする## [1] dog dog dog dog dog cat cat cat cat pig pig pig ## [13] horse horse## Levels: pig horse dog catfct_shift(fx) # レベルを1つずらす## [1] dog dog dog dog dog cat cat cat cat pig pig pig ## [13] horse horse## Levels: dog horse pig catfct_shuffle(fx) # レベルをランダムに並べ替える## [1] dog dog dog dog dog cat cat cat cat pig pig pig ## [13] horse horse## Levels: cat dog pig horse
Wickham, Hadley, Mara Averick, Jennifer Bryan, Winston Chang, Lucy D’Agostino McGowan, Romain François, Garrett Grolemund, et al. 2019. “Welcome to the tidyverse.”Journal of Open Source Software 4 (43): 1686. https://doi.org/10.21105/joss.01686.