見出し画像

fct_reorder() を使った並び替え

以前、ボックスプロットを並び替える方法を紹介しました。そのときは、あらかじめ、並べたいラベルの文字列を factor() 型で定義しておくというものでした。

もう一つの方法として、tidyverse の fct_reorder() という関数を使う方法を紹介します。プロットするデータの中に、並び順に指定したいスコアが含まれている場合は、 fct_reoder() を使うと便利です。

プロット用に整形したデータは前回と同様です。

> plot_data <- input_data %>%
+   gather(starts_with("Sample"), key = "Sample", value = "Read_count")

>
> plot_data
# A tibble: 500 × 2
   Sample  Read_count
   <chr>        <dbl>
 1 Sample1      11.1
 2 Sample1       9.80
 3 Sample1       9.22
 4 Sample1      10.2
 5 Sample1      10.8
 6 Sample1       9.54
 7 Sample1      10.4
 8 Sample1      11.0
 9 Sample1      10.7
10 Sample1      10.4
# … with 490 more rows
# ℹ Use `print(n = ...)` to see more rows

加えて、各サンプルの中央値 (=median) を算出します。サンプルごとにグループ化 (group_by) すると簡単に計算できます。

median_data <- plot_data %>%
  group_by(Sample) %>%
  summarize("Median" = median(Read_count))

計算結果は、下記のようなテーブルです。

> median_data
# A tibble: 5 × 2
  Sample  Median
  <chr>    <dbl>
1 Sample1   9.83
2 Sample2  10.0
3 Sample3  10.2
4 Sample4   9.80
5 Sample5  10.2

プロットデータに inner_join() を使って結合させます。そして、ここで、fct_reorder() を使って、 Sample をファクターに変更します。

plot_data_with_median <- plot_data %>%
  inner_join(median_data) %>%
  mutate("Sample" = fct_reorder(Sample, Median))

これで、Sample の値が factor 型になり、そのレベルは Median の順になりました。あとは、通常通り、プロットするだけです。

g <- ggplot(plot_data_with_median,
            aes(x = Sample, y = Read_count, fill = Sample))
g + geom_boxplot() + scale_fill_brewer(palette = "Spectral")

下記のように Median の低い順に並んだボックスプロットが表示されます。(逆に、降順にしたい場合は、 fct_reorder(Sample, Median, .desc = TRUE) とします。)

並び替えたボックスプロット


この記事が気に入ったらサポートをしてみませんか?