因子型(factor型)の水準操作が便利になるforcatsパッケージ
カテゴリ変数を扱う際に,因子型(factor型)の理解が必要になるが,最初は扱いに苦労する。しかし,それを解決するパッケージがあるらしい。
factor型をいじるためのパッケージ{forcats}の全関数の紹介と解説をまとめました https://t.co/q0XbodxLNZ tidyverseのひとつで,Rのfactor型でこれまでイライラしたことこがある方にはきっと伝わるはず。すごいです。
— kazutan v3.3.2 (@kazutan) 2017年1月13日
{forcats}パッケージでカテゴリカル変数(factor型データ)をいじってみる
これは便利!ということで,おなじみのラブライブ!サンシャイン!!のデータを使って試してみた。今回はトリオユニット名のデータを使用してみる。
dat_tu <- data.frame( name=c("高海千歌","桜内梨子","松浦果南","黒澤ダイヤ","渡辺曜","津島善子", "国木田花丸","小原鞠莉","黒澤ルビィ"), group=c("CYaRon!","Guilty Kiss","AZALEA","AZALEA","CYaRon!","Guilty Kiss", "AZALEA","Guilty Kiss","CYaRon!") #トリオユニット名 ) library(tidyverse) dat_tu <- tbl_df(dat_tu) dat_tu
# A tibble: 9 × 2 name group <fctr> <fctr> 1 高海千歌 CYaRon! 2 桜内梨子 Guilty Kiss 3 松浦果南 AZALEA 4 黒澤ダイヤ AZALEA 5 渡辺曜 CYaRon! 6 津島善子 Guilty Kiss 7 国木田花丸 AZALEA 8 小原鞠莉 Guilty Kiss 9 黒澤ルビィ CYaRon!
(2017/02/15修正)
tbl_df()
関数を使ってtibble形式にすると,data.frame
でそのまま読みこんだので文字データが自動的に<fctr>
,つまり因子型になっていた。変数nameも因子型になっているのは問題かもしれないが,このデータ数なのでとりあえずよしとする。因子型にしたくない場合は,引数にstringsAsFactors = FALSE
といれればよい。ちなみに,data_frame()
関数でtibble形式にすると,文字型<chr>
のままで読み込まれる。
dat_tu$group
[1] CYaRon! Guilty Kiss AZALEA AZALEA CYaRon! Guilty Kiss AZALEA Guilty Kiss [9] CYaRon! Levels: AZALEA CYaRon! Guilty Kiss
Levels: にあるとおり,水準の順番はアルファベット順になっている。つまり,1=AZALEA, 2=CYaRon!, 3=Guilty Kissという対応関係である。これはunclass()
で確認できる。
unclass(dat_tu$group)
[1] 2 3 1 1 2 3 1 3 2 attr(,"levels") [1] "AZALEA" "CYaRon!" "Guilty Kiss"
水準を指定して並び変える
それではforcats
を使用してみる。まずは,fct_relevel()
関数を使用して,ユニット名の水準をCDリリース順に並び変えてみる。この先もその順番を基本とする。
library(forcats) dat_tu$group <- fct_relevel(dat_tu$group, "CYaRon!") dat_tu$group
[1] CYaRon! Guilty Kiss AZALEA AZALEA CYaRon! Guilty Kiss AZALEA Guilty Kiss [9] CYaRon! Levels: CYaRon! AZALEA Guilty Kiss
いまの順番からだと,CYaRon!が一番最初に移動すれば解決するので,引数に指定するのはそれだけである。自分の指定したい順にするには,それぞれ水準名を追加していけばよい。たとえば,
fct_relevel(dat_tu$group, "Guilty Kiss", "AZALEA")
[1] CYaRon! Guilty Kiss AZALEA AZALEA CYaRon! Guilty Kiss AZALEA Guilty Kiss [9] CYaRon! Levels: Guilty Kiss AZALEA CYaRon!
水準の順番を逆にする
これにはfct_rev()
関数を使う。現在の並びはLevels: CYaRon! AZALEA Guilty Kiss
であるから,逆順にすると最初と最後が入れ替わるだけである。
fct_rev(dat_tu$group)
[1] CYaRon! Guilty Kiss AZALEA AZALEA CYaRon! Guilty Kiss AZALEA Guilty Kiss [9] CYaRon! Levels: Guilty Kiss AZALEA CYaRon!
日本語を試してみる
水準が多いと複雑になるので,1年生の名前だけで試してみる。まずは公式サイトプロフィール出現順にデータを入力してみる。
first <- factor(c("津島善子", "国木田花丸", "黒澤ルビィ")) first
[1] 津島善子 国木田花丸 黒澤ルビィ Levels: 国木田花丸 黒澤ルビィ 津島善子
水準の順番は,法則がよく分からないけど,とりあえず入力した順番と違うようだ。ここでforcats
の出番である。
fct_relevel(first, "津島善子")
[1] 津島善子 国木田花丸 黒澤ルビィ Levels: 津島善子 国木田花丸 黒澤ルビィ
とりあえず問題なく動いてくれた。次は逆順にしてみる。順番は最初に作ったfirst
の通りだから,花丸→ルビィ→善子の逆になるはず。
fct_rev(first)
[1] 津島善子 国木田花丸 黒澤ルビィ Levels: 津島善子 黒澤ルビィ 国木田花丸
こちらも問題ない。