tidyverseパッケージ群のひとつで,カテゴリカル変数(Factor型データ)をいじるのに特化したものとしてforcatsパッケージがあります。開発の経緯や詳細はパッケージの公式サイト,および「R for Data Science」のFactorsの章をご覧ください:

今回は,公式サイトの関数リファレンスを参考に,自分向けのメモがてらテストします。

インストール

CRANに登録済み。また,tidyverseパッケージ群なのでtidyverseをインストールすることでも可能。

# {tidyverse}をインストールすれば自動的にインストールされます:
install.packages("tidyverse")

# もちろん,単独でもOK:
install.packages("forcats")

# 開発版が欲しい時はGitHubから:
# install.packages("devtools")
devtools::install_github("tidyverse")

# もちろん{githubinstall}でもOK
# hadrey版とtidyverse版がありますが,たぶんtidyverse版の方がいいかと:
# install.packages("githubinstall")
githubinstall::githubinstall("forcats")

パッケージの読み込み

tidyverseパッケージ群ですが,library(tidyverse)だけでは読み込みません。でもおそらくはそれらを利用することでしょうから,あわせて読み込んでおくといいかと。

library(tidyverse)
library(forcats)

関数一覧のチェック

exportされている関数をチェック。

ls("package:forcats")
#>  [1] "%>%"             "as_factor"       "fct_anon"       
#>  [4] "fct_c"           "fct_collapse"    "fct_count"      
#>  [7] "fct_drop"        "fct_expand"      "fct_explicit_na"
#> [10] "fct_infreq"      "fct_inorder"     "fct_lump"       
#> [13] "fct_recode"      "fct_relabel"     "fct_relevel"    
#> [16] "fct_reorder"     "fct_reorder2"    "fct_rev"        
#> [19] "fct_shift"       "fct_shuffle"     "fct_unify"      
#> [22] "fct_unique"      "gss_cat"         "lvls_expand"    
#> [25] "lvls_reorder"    "lvls_revalue"    "lvls_union"

関数のリファレンスは,公式サイトのこちらに一覧と説明があります。

使用するデータ

簡単なものについては,その場でさくっと作ります。

大きめのデータでやりたいときは,forcatsパッケージに内包されているgss_catデータを使ってます。データの内容については?gss_catで表示されるヘルプを確認してください。

gss_cat
#> # A tibble: 21,483 × 9
#>     year       marital   age   race        rincome            partyid
#>    <int>        <fctr> <int> <fctr>         <fctr>             <fctr>
#> 1   2000 Never married    26  White  $8000 to 9999       Ind,near rep
#> 2   2000      Divorced    48  White  $8000 to 9999 Not str republican
#> 3   2000       Widowed    67  White Not applicable        Independent
#> 4   2000 Never married    39  White Not applicable       Ind,near rep
#> 5   2000      Divorced    25  White Not applicable   Not str democrat
#> 6   2000       Married    25  White $20000 - 24999    Strong democrat
#> 7   2000 Never married    36  White $25000 or more Not str republican
#> 8   2000      Divorced    44  White  $7000 to 7999       Ind,near dem
#> 9   2000       Married    44  White $25000 or more   Not str democrat
#> 10  2000       Married    47  White $25000 or more  Strong republican
#> # ... with 21,473 more rows, and 3 more variables: relig <fctr>,
#> #   denom <fctr>, tvhours <int>
names(gss_cat)
#> [1] "year"    "marital" "age"     "race"    "rincome" "partyid" "relig"  
#> [8] "denom"   "tvhours"

factorのorderを変更

factorに設定してあるlevelsはそのままで,順序(order)を変更します。モデリングや表,可視化において効果を発揮します。

登場順でfactorのlevelsを再整理(fct_inorder)

いわゆる“出てきた順”でlevelsのorderを設定するには,fct_inorder()関数を使用します

使い方

fct_inorder(f)

引数

f

factor型のデータ。levelsを並べ替えたいデータを指定してください。

説明と具体例

そのまんまで,引数に指定したfactor型データのレベルを,要素が出てきた順にします。

f <- factor(c("b", "b", "a", "c", "c", "c"))
f
#> [1] b b a c c c
#> Levels: a b c
fct_inorder(f)
#> [1] b b a c c c
#> Levels: b a c

登場頻度順でfactorのlevelsを再整理(fct_infreq)

データ内で出てきた“頻度が多い順”でlevelsのorderを設定するには,fct_infreq()関数を使用します。

使い方

fct_infreq(f)

引数

f
factor型のデータ。levelsを並べ替えたいデータを指定してください。

説明と具体例

そのまんまで,引数に指定したfactor型データのレベルを,要素が出てきた順にします。

f <- factor(c("b", "b", "a", "c", "c", "c"))
f
#> [1] b b a c c c
#> Levels: a b c
fct_infreq(f)
#> [1] b b a c c c
#> Levels: c b a

手作業でfactorのlevelsを再整理(fct_relevel)

levelsの順番を,手作業で並べ替えます。

使い方

fct_relevel(f, ...)

引数

f
factor型のデータ。levelsを並べ替えたいベクトルを指定してください。
文字列ベクトルを指定。指定した値を,levelsの左側(先頭)へ持って行き,それ以外は後ろへシフトします。

説明と具体例

要するにbase::relevel()のラッパーで,...の部分で指定した値を前に持ってくるようになります。なお,全ての要素を準備してわざわざ指定しなくても,指定しなかった要素は自動的に後ろへそのままシフトします。

f <- factor(c("a", "b", "c"))
fct_relevel(f)
#> [1] a b c
#> Levels: a b c
fct_relevel(f, "c")
#> [1] a b c
#> Levels: c a b
fct_relevel(f, "b", "a")
#> [1] a b c
#> Levels: b a c

また,存在しないlevelsの値を指定すると警告が出て,その要素は無視されます。

fct_relevel(f, "d")
#> Warning: Unknown levels in `f`: d
#> [1] a b c
#> Levels: a b c
fct_relevel(f, "b", "d")
#> Warning: Unknown levels in `f`: d
#> [1] a b c
#> Levels: b a c
fct_relevel(f, "d", "b")
#> Warning: Unknown levels in `f`: d
#> [1] a b c
#> Levels: b a c

他の1変数に従ってソートするようlevelsを再整列(fct_reorder)

他の変数を使って,levelsをソートします。例えば「各カテゴリでのxの中央値を使い,その降順になるようにlevelsをソートしたい」という時に使います。

使い方

fct_reorder(f, x, fun = median, ..., .desc = FALSE)

引数

f
factor型のベクトル。
x
並べ替えの基準に利用する変数。この変数を下のfunで指定する集計用関数にあてた結果をソートに利用します。
fun
集計用関数を指定。デフォルトではmedian。なお返り値が単一ベクトルになるものでなければいけません。
funに送る他の引数をここで指定します。よくあるのはna.rm = TRUEなどです。
.desc
論理値を指定。降順/昇順を指定します。デフォルトはFALSE昇順

説明と具体例

1次元データでのグラフを描くときや,集計表を作成するときに効果を発揮するでしょう。例えば,以下のようなパターンを想定します:

boxplot(Sepal.Width ~ Species, data = iris)