【R】ガチできれいなTableを作れるgtパッケージとは?


# はじめに

この記事はきれいなTableを作るためのパッケージgtについての解説記事になります。対象者としては、

- いままで**Rを使ったデータ解析**をしてきた人
- Rの(特に**tidyverse**)の**美しい描画システム**になれてしまった人
-  宗教上の理由で**Excelが使用できない人、嫌いな人**
を想定しています。

## 苦悩
Hadley信者の皆さんは今日も恐らく**tidyverse脳**になりながらデータ解析やきれいなグラフをバシバシ作っていることと思います。しかし、**見せる用の表づくり**となると結構難しいところがあります。
私も、「tidy dataから必要なグラフはできたし、検定も行った。でも表がなんか物足りない...」「結局、ボスに見せるときはExcelでセル結合して表を作らないといけないのかなぁ...」などと思っていました。**今までは**

##  gt、やばい
そんな折、**gt パッケージ** {gt} に出会いました。このパッケージは、data.tableやtibbleと言った表データを元に、gt オブジェクトなるものを介して見栄えの良い表を**html**や**Latax**で作る事ができるパッケージ群になっています。
gtとは"Grammar of tables"の略であり(~~ガチの略ではない~~)、"Grammar of Graphics"を標榜するggplotの表バージョンを目指しているそうです。
コンセプトとしては、**Easily generate information-rich, publication-quality tables from R (出版に耐えうる情報豊富なTableを簡単にRで作ろうや)**となっています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/af3f9867-4235-b2cc-25bc-1ad614b906ae.png)
from [公式ホームページ](https://github.com/rstudio/gt)

このパッケージ、はっきり言って**すごい**です。まずはこちらをご覧ください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/f6d5805d-6994-25e7-da3c-c8906ffaa0e0.png)

**美しい...**まるでTable版ggplot2ではないか...

さらに、下の図を見ていただけるとわかるのですが、このTableかなり細かいところまで弄ることができます!
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/86fdad06-486f-0fe9-1c24-063dc3d0e004.png)

関数一覧

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/3b0a5f62-530e-9a62-33cd-27b395768ef9.png)

from [公式ホームページ](https://github.com/rstudio/gt)
今まで、データの前処理をtidyverseのパッケージ群で行った後、Tableを人間に見やすいよう整えるためにExcelでまとめたりしていました。
しかし、**このパッケージのおかげで前処理 → グラフ出力 → 生データを見やすいようにTable整形**という一連の流れをすべてR上で行えるようになりました。
まだまだ発展途上のパッケージですが、布教も兼ねて解説記事を作製しました！

##  解説動画もあるよ
[ここ](https://resources.rstudio.com/rstudio-conf-2019/introducing-the-gt-package)の動画で解説がされていますのでぜひご覧ください。凄さがわかると思います。

# インストール方法

このパッケージはGitHubからinstallする必要があります。
```source("https://install-github.me/rstudio/gt")```

**2020/04/09 追記**
gt packageがv0.2にアップデートされ、CRANからのインストールが可能となりました！
```install.packages("gt")```と打ち込むことで自動的にinstallされます

テストデータとして、動画でも使われているexibbleが入っていますのでこれを使って実際に美しいTableを作って見ましょう。


# 実際の使い方

## 0. まずはデフォルトで
```{exibble.R}
library(tidyverse)
library(gt)

exibble
# A tibble: 8 x 9
          num char       fctr  date       time  datetime         currency row   group
        <dbl> <chr>      <fct> <chr>      <chr> <chr>               <dbl> <chr> <chr>
1       0.111 apricot    one   2015-01-15 13:35 2018-01-01 02:22    50.0  row_1 grp_a
2       2.22  banana     two   2015-02-15 14:40 2018-02-02 14:33    18.0  row_2 grp_a
3      33.3   coconut    three 2015-03-15 15:45 2018-03-03 03:44     1.39 row_3 grp_a
4     444.    durian     four  2015-04-15 16:50 2018-04-04 15:55 65100    row_4 grp_a
5    5550     NA         five  2015-05-15 17:55 2018-05-05 04:00  1326.   row_5 grp_b
6      NA     fig        six   2015-06-15 NA    2018-06-06 16:11    13.3  row_6 grp_b
7  777000     grapefruit seven NA         19:10 2018-07-07 05:22    NA    row_7 grp_b
8 8880000     honeydew   eight 2015-08-15 20:20 NA                   0.44 row_8 grp_b
```

これにgt()を適用させるとtableが作製されています。

```{table.R}
library(tidyverse)
library(gt)

exibble %>% gt()
```
![Rplot02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/e709d0a3-8ea9-7795-f6c3-0613a93347c4.png)

もうなんか既にイイカンジになってますが、さらにきれいにしていきましょう。

## 1. グループ分け
```{group.R}
library(tidyverse)
library(gt)

tab_group <- exibble %>% 
  gt(
  rowname_col = "row",
  groupname_col = "group"
  ) 

tab_group
```

![Rplot04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/f9a72f17-5c9c-befb-3a49-cd3e60559c53.png)


``group列``に合わせてTableを2分割しました。ついでに各行をrowで分けています。

## 2. 数字の変更

``num列``の数字が少し読みにくいので、わかりやすい指数表記に変更しましょう。```fmt_scientific()```を使います

```{fmt_scientific.R}

tab_scientific <- tab_group %>% 
  fmt_scientific(
    columns = vars(num),
    decimals = 2
  ) 

tab_scientific 
```
![Rplot05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/0956493e-e95b-00f3-d346-e233832255f4.png)

## 3. 日付の変更

日付のフォーマットは``fmt_date()``で変更できます。``date_style = ``で様々なフォーマットに変えられます。

```{date.R}

tab_date <- tab_scientific %>% 
  fmt_date(
    columns = vars(date),
    date_style = 13)

tab_date
```
![Rplot01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/ddf6ae30-f61a-5f5b-fb48-679d6a5cce89.png)

ただ、日本語に対してはまだまだ微妙という印象です。(年は対応しているが日に対応していない、年月日の順番となるフォーマットが存在しない、など)

## 4. 通貨記号の追加

数値列に通貨記号を追加したい場合は``fmt_currency()``を使います。``currency =``で通貨コードを指定します。
例えば円マークなら...

```{currency.R}

tab_currency <- tab_date %>% 
  fmt_currency(
    columns = vars(currency),
    currency =  "JPY"
  )

tab_currency
```

![Rplot07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/2cc5fdaf-df1b-8e06-b706-a46b7f809373.png)

coconut 1円、durian6万円という意味のわからない状況になってますが、(動画では英ポンド``date_style = "GBP"``で指定していました。)
小数点以下が四捨五入され、3桁ごとにカンマが打たれています。

## 5. 注釈の追加

表への注釈もできます。``tab_footnote = ``でcell単位あるいはcolumn, row単位で注釈をつけることができます。注釈をつける条件も指定できるのでかなり便利。

```{footnote.R}

tab_footnote <- tab_currency %>% 
  tab_footnote(
    footnote = "激安!",
    locations = cells_data(
      columns = vars(currency),
      rows = currency < 100 # 価格が100未満のものにのみ注釈
      
    )
  ) %>% 
  tab_footnote(
    footnote = "高い...!",
    locations = cells_data(
      columns = vars(currency),
      rows = currency > 10000 # 価格が10000より大きいのものにのみ注釈
      
    )
  ) %>% 
  tab_footnote(
    footnote = "果物の価格について",
    locations = cells_column_labels( # カラムにラベルとしてつける
      columns = vars(currency)
    )
  )
  

tab_footnote

```

![Rplot09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/24dc073e-ebc0-0310-8ea5-50e94a678a20.png)


## 6. NAの変更
このデータではNA(欠損値が)含まれています。これを別の文字に置き換えたい場合、``fmt_missing()``が有効です。例えば、`` missing_text = "-"``とすることで、NAをハイフンに置換できます。

```{NA.R}
tab_NA <- tab_footnote %>% 
  fmt_missing(columns = everything(),
              missing_text = "-")

tab_NA
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/68faaefb-7a7e-138e-cc4a-0afef610fa4d.png)


``columns = everything()``を指定することで全カラムについてのNAをハイフンに変えています。

## 7. タイトルの作製

かなりいい感じになってきたのでタイトルを付けましょう。タイトルは``tab_header()``で加えることができます。しかも、``md()``関数を用いてでmarkdown形式で書くことにより_斜体_や**太字**にも対応しています!

```{Title.R}

tab_Title <- tab_NA %>% 
  tab_header(
    title = "Table",
    subtitle = md("きれいな*Table*は**gt パッケージ**で決まり！")
  )

tab_Title

```
![Rplot11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/d6618076-7ddc-2515-5b66-8557666b2808.png)

## 8. pdfで保存
完成したら``gtsave()``で保存! png, htmlおよびpdf(Latexが必要)での出力が可能です。

```{saving.R}
gtsave(tab_Title, "完成品.pdf")
```

# さいごに

いかがでしょう？かなり見た目の良いTableを出力できたのではないでしょうか。本パッケージは洗練されるべき余地を残していますが、現行でも十分扱いきれるパッケージだと思います。皆さんもgt packageで楽しいTable整形lifeを送りませんか？

# 参考文献
https://github.com/rstudio/gt
https://www.rdocumentation.org/packages/gt/versions/0.1.0
https://resources.rstudio.com/rstudio-conf-2019/introducing-the-gt-package