いずにゃんの研究日記

専門性を広げるための練習場

因子型(factor型)の水準操作が便利になるforcatsパッケージ

カテゴリ変数を扱う際に,因子型(factor型)の理解が必要になるが,最初は扱いに苦労する。しかし,それを解決するパッケージがあるらしい。

{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: 津島善子 黒澤ルビィ 国木田花丸

こちらも問題ない。