kur0cky

こんにちは

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

Rで綺麗な表を作るパッケージgtの存在を知りました。神ライブラリの予感がしたので少し調べたり触ったりしてたことをまとめます。
いままではknitr::kable()DT::datatable()を使っていたのですが、本格的に乗り換えを検討しています。

gtパッケージとは

  • Rで綺麗な表を作るライブラリ。
  • DTパッケージとは異なり、インタラクティブな操作はできな。
  • 作図におけるggplot2的ポジションを狙っていると思われる。
  • tidyverseのスタイルガイドに準拠しており、パイプ演算子%>%を用いて、細かい表の調整をブロックのように組み合わせることができる。

gtパッケージで作れる表の形

gtパッケージを使うとどのような表をつくることができるか、公式サイトから図を拝借させていただきました。

gtで作れる表の形

図より、表が以下の要素から構成されていることがわかります。table body以外は必ずしも付ける必要はなく、場合に応じて付け足していくことになります。

  • table body : 表の本体。値が入る部分
  • table header : ヘッダー。タイトルとサブタイトル
  • table footer : フッター。注釈やリファレンスなど
  • column labels : 列名。複数列に対してラベルをつけることもできる
  • stub : 行名。インデックス
  • stub head : 行名の上にくる部分

基本的な流れ

  1. 表にするデータフレームの用意
    • data.frame, tibble, data.tableのいずれでも良い。
  2. gt()によるgt_tblオブジェクト作成
  3. 細々した調整
  4. 出力。保存など。
    • なんとhtml形式だけでなく、latex形式でも作れる!!

gtテーブルオブジェクトの作成:gt()

データフレームを用意し、gt()に渡すことで行います。

# CRANに登録されているのでインストールは install.packages("gt")
library(tidyverse)
library(gt)

df <- iris %>% 
  group_by(Species) %>% 
  summarise(count = n(),
            mean_SepalLength = mean(Sepal.Length),
            sd_SepalLength = sd(Sepal.Length))

tbl_1 <- gt(df)
print(tbl_1)

すると、以下のような表が作成されます。この時点でも十分綺麗ですね。

Species count mean_SepalLength sd_SepalLength
setosa 50 5.006 0.3524897
versicolor 50 5.936 0.5161711
virginica 50 6.588 0.6358796

どんどんリッチにすることができます。たとえばtab_header() を使ってタイトルを付け加えてみます。まるでggplotのように、表のオプションをパイプでつなげていくことができます。

tbl_2 <- tbl_1 %>% 
  tab_header(title = "Edgar Anderson's Iris Data",
             subtitle = "The species are Iris setosa, versicolor, and virginica")
tbl_2
Edgar Anderson's Iris Data
The species are Iris setosa, versicolor, and virginica
Species count mean_SepalLength sd_SepalLength
setosa 50 5.006 0.3524897
versicolor 50 5.936 0.5161711
virginica 50 6.588 0.6358796

様々なgtの関数や使い方はまた次の記事で紹介しようと思います。

表の出力

ggplotと同様、Rmd中やConsole上であればgt_tblオブジェクトをそのままprint()することで表示することができますが、表のhtmlファイルを別で保存するには、gtsave()関数を使います。次のコードでは上で作った表をiris_summary.htmlという名前で保存しています。

gtsave(tbl_2, "iris_summary.html")

なんと、gtsave()の中のファイル名で、拡張子を.texとすると、LaTeX形式で保存することもできます。これで、面倒だったmulticolumnやmultirowなどに悩まされることもなくなるでしょう!!すごい!!