R×forcats::fct_reorder 別の変数を利用して因子水準を並び替える

R言語で、別の変数を利用して因子水準を並び替える方法について解説します。因子の操作には、tidyverseパッケージに含まれているforcatsパッケージを使用するのが便利です。ここでは、forcatsパッケージのfct_reorder()を使用した方法についてお伝えします。

fct_reorder()の概要

fct_reorder()は、 別の変数を利用して因子水準を並び替えるための関数です。fct_reorder() は、因子が位置にマッピングされている1次元表示に便利です。fct_reorder2() は、因子が位置に依存しない外観にマッピングされている2次元表示に便利です。last2()とfirst2()は、fct_reorder2()のヘルパーです。last2()はxでソートされたyの最後の値を検索し、first2() は最初の値を検索します。

fct_reorder()の使い方


fct_reorder(
  .f,
  .x,
  .fun = median,
  ...,
  .na_rm = NULL,
  .default = Inf,
  .desc = FALSE
)

fct_reorder2(
  .f,
  .x,
  .y,
  .fun = last2,
  ...,
  .na_rm = NULL,
  .default = -Inf,
  .desc = TRUE
)

last2(.x, .y)

first2(.x, .y)

fct_reorder()の引数

.f

因子(または文字ベクトル)を指定します。

.x

fの因子は、fct_reorder()の場合は.fun(.x)、とfct_reorder2()の場合はfun(.x, .y)の値が昇順になるように並べ替えられます。

.y

fの因子は、fct_reorder()の場合は.fun(.x)、とfct_reorder2()の場合はfun(.x, .y)の値が昇順になるように並べ替えられます。

.fun = median

nサマリー関数を指定します。
fct_reorderの場合は1つのベクトル、fct_reorder2の場合は2つのベクトルを受け取り、1つの値を返します。

.funに渡す引数を指定します。

.na_rm = NULL

欠損値を削除するかどうかを指定します。
NULL(デフォルト)の場合、欠損値は警告とともに削除されます。NAを保持するにはFALSEに設定し(.fun が既に NA を処理している場合)、警告なしで削除するにはTRUEに設定します。

.default = Inf

空のレベルの.funにはどのようなデフォルト値を使用するかを指定します。
これを使用して、出力内で空のレベルが表示される場所を制御します。

.desc = FALSE

降順で並び替えるかを指定します。
凡例の要素のデフォルトの順序と一致させるために、fct_reorderとfct_reorder2のデフォルトは異なることに注意してください。

準備

あらかじめ、tidyverseパッケージを読み込んでおきます。


library(tidyverse)

解説のために、次の因子を使用します。


df <- data.frame(x = runif(20, min = 1, max = 5),
                 f = fct(letters[floor(runif(20, min = 1, max = 5))]))
df

          x f
1  3.618896 d
2  2.412789 b
3  2.081041 b
4  4.970736 a
5  3.533973 d
6  1.852833 b
7  1.517489 c
8  2.912472 a
9  4.696298 a
10 3.395044 c
11 4.904683 c
12 3.927170 a
13 2.426908 a
14 2.725895 c
15 1.592846 d
16 1.052310 c
17 3.862264 c
18 1.412737 c
19 2.785137 d
20 3.560404 c

df$f

 [1] d b b a d b c a a c c a a c d c c c d c
Levels: d b a c

使用例

データフレームdfについて、f列の因子水準ごとにx列の平均値を算出し、その平均値の並び順をf列の因子水準に適用するには次のようにします。


fct_reorder(df$f, df$x, .fun = mean)

 [1] d b b a d b c a a c c a a c d c c c d c
Levels: b c d a