kur0cky

こんにちは

gt パッケージの紹介 ~Rで作表の決定版!?~ (2)

Rで綺麗な表を作成するgtパッケージ紹介の第2段です。

前回の記事では、gtパッケージの概要と作表の大まかな流れを紹介しました。 kur0cky.hatenablog.com

今回は、実際に表をカスタマイズするときに使う様々な関数を整理し、より細かな作業を紹介します。

gtパッケージの関数群の整理

公式のリファレンスに整理されていることではありますが、gtパッケージの関数はいくつかのグループに分けることができます。 本記事では特に、gtテーブルの各パーツ(ヘッダやレコードのグルーピングなど)を作成するfmt_**()関数を中心に紹介します。

  • gt(), gt_preview()
    • gt_tblオブジェクトの作成。gt_preview()では先頭と末尾を(デフォルトでは)5行ずつ表示するオブジェクトを作成します。
  • tab_***()
    • 前の記事で紹介したgtの表の各要素を追加するような関数群です。たとえば、ヘッダーやフッターの作成、行や列ごとのグルーピングを行うことができます。
  • fmt_***()
    • セルの値の見栄えをよくするような関数群です。たとえば、datetimeのフォーマットを一括で修正したり、欠損NA-で一括置換することができます。
  • cols_***()
    • カラム(変数)全体の変更を行うような関数群です。たとえば、カラムの順序を入れ替えたり名前の変更、2つのカラムの結合などを行うことができます。
  • 行変更関数:
    • 現在はテーブル内の任意の行グループの順序を変更することができるrow_group_order()や、集計行を追加するsummary_rows(), grand_summary_rows()があります。
  • ***_image()
    • gtパッケージでは表のセル中に画像を挿入することができます。なんとggplotオブジェクトもggplot_image()で入れることができます。
  • opt_***()
    • よく使われる表オプションを簡単に設定することができます。たとえば、 脚注で使うマークのセットを変更したり、行の縞模様を有効にしたり、表ヘッダのアラインメントを変更したりすることができます。
  • info_***
    • 有用な情報を含むgtテーブルを表示してくれる関数群です。gtがサポートする日付スタイルや時刻スタイル、カラーパレット、通貨、ロケールについての参照情報を得ることができます。ここを参照することで、たとえば表示させたいdatetimeのフォーマットなどにすぐアクセスすることができます。
  • ヘルパー関数:
    • 表内でマークダウン表記を使うためのmd()や数値をパーセンテージで扱うためのpct()など、便利な細々とした関数群です。

gtテーブルの各パーツの作成

まずはライブラリを読み込みます

library(tidyverse)
library(gt)

今回は誰もが知っているirisデータを使った、次の集計を表にしたいと思います。

df <- iris %>% 
  gather(var, value, -Species) %>% 
  group_by(Species, var) %>% 
  summarise(q1 = quantile(value, .25),
            median = median(value),
            q3 = quantile(value, .75),
            mean = mean(value),
            sd = sd(value)) %>% 
  ungroup()
df
# A tibble: 12 x 7
   Species    var             q1 median    q3  mean    sd
   <fct>      <chr>        <dbl>  <dbl> <dbl> <dbl> <dbl>
 1 setosa     Petal.Length  1.4    1.5   1.58 1.46  0.174
 2 setosa     Petal.Width   0.2    0.2   0.3  0.246 0.105
 3 setosa     Sepal.Length  4.8    5     5.2  5.01  0.352
 4 setosa     Sepal.Width   3.2    3.4   3.68 3.43  0.379
 5 versicolor Petal.Length  4      4.35  4.6  4.26  0.470
 6 versicolor Petal.Width   1.2    1.3   1.5  1.33  0.198
 7 versicolor Sepal.Length  5.6    5.9   6.3  5.94  0.516
 8 versicolor Sepal.Width   2.52   2.8   3    2.77  0.314
 9 virginica  Petal.Length  5.1    5.55  5.88 5.55  0.552
10 virginica  Petal.Width   1.8    2     2.3  2.03  0.275
11 virginica  Sepal.Length  6.22   6.5   6.9  6.59  0.636
12 virginica  Sepal.Width   2.8    3     3.18 2.97  0.322

最終的には下のようなな表を作っていきます。

Edgar Anderson's Iris Data
the most famous dataset
percentile mean sd
q1 median q3
Petal.Length
setosa 1.400 1.50 1.575 1.462 0.1736640
versicolor 4.000 4.35 4.600 4.260 0.46991101
virginica 5.100 5.55 5.875 5.552 0.55189471
Petal.Width
setosa 0.200 0.20 0.300 0.246 0.1053856
versicolor 1.200 1.30 1.500 1.326 0.1977527
virginica 1.800 2.00 2.300 2.026 0.2746501
Sepal.Length
setosa 4.800 5.00 5.200 5.006 0.3524897
versicolor 5.600 5.90 6.300 5.936 0.51617111
virginica 6.225 6.50 6.900 6.588 0.63587961
Sepal.Width
setosa 3.200 3.40 3.675 3.428 0.3790644
versicolor 2.525 2.80 3.000 2.770 0.3137983
virginica 2.800 3.00 3.175 2.974 0.3224966
Source: Fisher, R. A. (1936) The use of multiple measurements in taxonomic problems. Annals of Eugenics, 7, Part II, 179–188.

1 標準偏差が0.4以上

gtテーブルの作成:

最も基本となる、そもそものテーブルオブジェクトの作成はgt()で行います。これだけでも十分綺麗な表が出力できています。

df %>% 
  gt()
Species var q1 median q3 mean sd
setosa Petal.Length 1.400 1.50 1.575 1.462 0.1736640
setosa Petal.Width 0.200 0.20 0.300 0.246 0.1053856
setosa Sepal.Length 4.800 5.00 5.200 5.006 0.3524897
setosa Sepal.Width 3.200 3.40 3.675 3.428 0.3790644
versicolor Petal.Length 4.000 4.35 4.600 4.260 0.4699110
versicolor Petal.Width 1.200 1.30 1.500 1.326 0.1977527
versicolor Sepal.Length 5.600 5.90 6.300 5.936 0.5161711
versicolor Sepal.Width 2.525 2.80 3.000 2.770 0.3137983
virginica Petal.Length 5.100 5.55 5.875 5.552 0.5518947
virginica Petal.Width 1.800 2.00 2.300 2.026 0.2746501
virginica Sepal.Length 6.225 6.50 6.900 6.588 0.6358796
virginica Sepal.Width 2.800 3.00 3.175 2.974 0.3224966

gt()では、行名を示すカラムのオプションrowname_col、グループを示すカラムのオプションgroupname_colなどを指定することができます。ここでは、どちらも指定してみましょう。

df %>% 
  gt(rowname_col = "Species", groupname_col = "var")
q1 median q3 mean sd
Petal.Length
setosa 1.400 1.50 1.575 1.462 0.1736640
versicolor 4.000 4.35 4.600 4.260 0.4699110
virginica 5.100 5.55 5.875 5.552 0.5518947
Petal.Width
setosa 0.200 0.20 0.300 0.246 0.1053856
versicolor 1.200 1.30 1.500 1.326 0.1977527
virginica 1.800 2.00 2.300 2.026 0.2746501
Sepal.Length
setosa 4.800 5.00 5.200 5.006 0.3524897
versicolor 5.600 5.90 6.300 5.936 0.5161711
virginica 6.225 6.50 6.900 6.588 0.6358796
Sepal.Width
setosa 3.200 3.40 3.675 3.428 0.3790644
versicolor 2.525 2.80 3.000 2.770 0.3137983
virginica 2.800 3.00 3.175 2.974 0.3224966

タイトルの設定

タイトルやサブタイトルはtab_header()で追加することができます

df %>% 
  gt() %>% 
  tab_header(title = "Edgar Anderson's Iris Data",
             subtitle = "the most famous dataset")
Edgar Anderson's Iris Data
the most famous datset
Species var q1 median q3 mean sd
setosa Petal.Length 1.400 1.50 1.575 1.462 0.1736640
setosa Petal.Width 0.200 0.20 0.300 0.246 0.1053856
setosa Sepal.Length 4.800 5.00 5.200 5.006 0.3524897
setosa Sepal.Width 3.200 3.40 3.675 3.428 0.3790644
versicolor Petal.Length 4.000 4.35 4.600 4.260 0.4699110
versicolor Petal.Width 1.200 1.30 1.500 1.326 0.1977527
versicolor Sepal.Length 5.600 5.90 6.300 5.936 0.5161711
versicolor Sepal.Width 2.525 2.80 3.000 2.770 0.3137983
virginica Petal.Length 5.100 5.55 5.875 5.552 0.5518947
virginica Petal.Width 1.800 2.00 2.300 2.026 0.2746501
virginica Sepal.Length 6.225 6.50 6.900 6.588 0.6358796
virginica Sepal.Width 2.800 3.00 3.175 2.974 0.3224966

リファレンスの追加

gtではtab_source_note()によってフッターにリファレンスを追加することができます。irisデータのソースであるFisherの論文を引用してみましょう。 また、gtテーブルの各部分では、md()によって、マークダウン記法を用いることもできます。雑誌名を斜体で、巻号を太字で書きてみます。

df %>% 
  gt() %>%
  tab_source_note(source_note = md("Source: Fisher, R. A. (1936) The use of multiple measurements in taxonomic problems. *Annals of Eugenics*, **7**, Part II, 179–188."))
Species var q1 median q3 mean sd
setosa Petal.Length 1.400 1.50 1.575 1.462 0.1736640
setosa Petal.Width 0.200 0.20 0.300 0.246 0.1053856
setosa Sepal.Length 4.800 5.00 5.200 5.006 0.3524897
setosa Sepal.Width 3.200 3.40 3.675 3.428 0.3790644
versicolor Petal.Length 4.000 4.35 4.600 4.260 0.4699110
versicolor Petal.Width 1.200 1.30 1.500 1.326 0.1977527
versicolor Sepal.Length 5.600 5.90 6.300 5.936 0.5161711
versicolor Sepal.Width 2.525 2.80 3.000 2.770 0.3137983
virginica Petal.Length 5.100 5.55 5.875 5.552 0.5518947
virginica Petal.Width 1.800 2.00 2.300 2.026 0.2746501
virginica Sepal.Length 6.225 6.50 6.900 6.588 0.6358796
virginica Sepal.Width 2.800 3.00 3.175 2.974 0.3224966
Source: Fisher, R. A. (1936) The use of multiple measurements in taxonomic problems. Annals of Eugenics, 7, Part II, 179–188.

列のグルーピング

gtでは変数をグルーピングすることができ、そのグループをスパナと呼びます。ここでは、第一四分位、中央値、第三四分位をパーセンタイルとしてグルーピングします。 まとめる変数の指定columnsでは、dplyrと同じように、vars()を使うことができます。

df %>%
  gt() %>% 
  tab_spanner(label = "percentile",
              columns = vars(q1, median, q3))
Species var percentile mean sd
q1 median q3
setosa Petal.Length 1.400 1.50 1.575 1.462 0.1736640
setosa Petal.Width 0.200 0.20 0.300 0.246 0.1053856
setosa Sepal.Length 4.800 5.00 5.200 5.006 0.3524897
setosa Sepal.Width 3.200 3.40 3.675 3.428 0.3790644
versicolor Petal.Length 4.000 4.35 4.600 4.260 0.4699110
versicolor Petal.Width 1.200 1.30 1.500 1.326 0.1977527
versicolor Sepal.Length 5.600 5.90 6.300 5.936 0.5161711
versicolor Sepal.Width 2.525 2.80 3.000 2.770 0.3137983
virginica Petal.Length 5.100 5.55 5.875 5.552 0.5518947
virginica Petal.Width 1.800 2.00 2.300 2.026 0.2746501
virginica Sepal.Length 6.225 6.50 6.900 6.588 0.6358796
virginica Sepal.Width 2.800 3.00 3.175 2.974 0.3224966

行のグルーピング

行のグルーピングにはtab_row_group()を用います。グループにする行の指定rowsには、数値ベクトルを指定することができますが、以下のgt(rowname_col = "Species")のように行名が指定してある場合、dplyr::select()と同様にヘルパー関数を使うことができます。便利ですね。

df %>% 
  gt(rowname_col = "Species") %>% 
  tab_row_group(group = "vからはじまる種類",
                rows = starts_with("v"),
                others = "その他")
var q1 median q3 mean sd
vからはじまる種類
versicolor Petal.Length 4.000 4.35 4.600 4.260 0.4699110
versicolor Petal.Width 1.200 1.30 1.500 1.326 0.1977527
versicolor Sepal.Length 5.600 5.90 6.300 5.936 0.5161711
versicolor Sepal.Width 2.525 2.80 3.000 2.770 0.3137983
virginica Petal.Length 5.100 5.55 5.875 5.552 0.5518947
virginica Petal.Width 1.800 2.00 2.300 2.026 0.2746501
virginica Sepal.Length 6.225 6.50 6.900 6.588 0.6358796
virginica Sepal.Width 2.800 3.00 3.175 2.974 0.3224966
その他
setosa Petal.Length 1.400 1.50 1.575 1.462 0.1736640
setosa Petal.Width 0.200 0.20 0.300 0.246 0.1053856
setosa Sepal.Length 4.800 5.00 5.200 5.006 0.3524897
setosa Sepal.Width 3.200 3.40 3.675 3.428 0.3790644

脚注の追加

tab_footnote()によって脚注を追加することができます。 どの部分に脚注をつけるかはlocationsオプションで指定しますが、ここではヘルパー関数cells_***()を使うことができます。 ここでは、標準偏差sdが0.4を超えるところに脚注をつけてみましょう。表の本体 body につけたいので、ヘルパー関数はcells_body()を使います。cells_body(columns = vars(sd), rows = sd > 0.4)としました。このように、条件で脚注をつける箇所を指定することができるため、たとえば「p値が有意となるものに印をつけたい」といった場合に非常に有用です。

df %>% 
  gt() %>% 
  tab_footnote(
    footnote = "標準偏差が0.4以上",
    locations = cells_body(
      columns = vars(sd),
      rows = sd > 0.4))
Species var q1 median q3 mean sd
setosa Petal.Length 1.400 1.50 1.575 1.462 0.1736640
setosa Petal.Width 0.200 0.20 0.300 0.246 0.1053856
setosa Sepal.Length 4.800 5.00 5.200 5.006 0.3524897
setosa Sepal.Width 3.200 3.40 3.675 3.428 0.3790644
versicolor Petal.Length 4.000 4.35 4.600 4.260 0.46991101
versicolor Petal.Width 1.200 1.30 1.500 1.326 0.1977527
versicolor Sepal.Length 5.600 5.90 6.300 5.936 0.51617111
versicolor Sepal.Width 2.525 2.80 3.000 2.770 0.3137983
virginica Petal.Length 5.100 5.55 5.875 5.552 0.55189471
virginica Petal.Width 1.800 2.00 2.300 2.026 0.2746501
virginica Sepal.Length 6.225 6.50 6.900 6.588 0.63587961
virginica Sepal.Width 2.800 3.00 3.175 2.974 0.3224966

1 標準偏差が0.4以上

組み合わせる

それでは、上記のtab_***()をブロックのように組み合わせて、冒頭の表を作ります。

df %>% 
  gt(groupname_col = "var", rowname_col = "Species") %>% 
  tab_header(title = "Edgar Anderson's Iris Data",
             subtitle = "the most famous dataset") %>% 
  tab_source_note(source_note = md("Source: Fisher, R. A. (1936) The use of multiple measurements in taxonomic problems. *Annals of Eugenics*, **7**, Part II, 179–188.")) %>%
  tab_spanner(label = "percentile",
              columns = vars(q1, median, q3)) %>% 
  tab_footnote(
    footnote = "標準偏差が0.4以上",
    locations = cells_body(
      columns = vars(sd),
      rows = sd > 0.4)) %>% 
  tab_footnote(
    footnote = "ヒオウギアヤメ。アヤメ科アヤメ属に分類される多年草",
    locations = cells_body(
      columns = vars(Species),
      rows = Species == "setosa"))

以上、gtパッケージの基本的な作表関数を紹介しました。