【R】データ要約ガチ勢のためのgtsummaryで表を書こう

### 追記(2022/12/16)
gtsummaryのチートシートが公開されています！壁に貼りましょう！（~~**もうこの記事いらねぇな！**~~）
https://twitter.com/statistishdan/status/1572948856421380097?s=20&t=NF7P-cDUZuzJ_inLMiE0ow

### 追記 (2020/09/17)
実践編：[【R】nestしてggplotしてgtsummaryしよう](https://qiita.com/yanami/items/01d319543bcc4547055b)の記事を書きました！良ければこちらもご覧下さい！

また、youtubeでも開発者による[解説動画](https://youtu.be/fjAMsGISyXw)が出ているので布教します！


# それは突然やってきた
ある日、Twitterを見てみると...
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/5ede8277-95cb-88ab-b935-09db1dbedc55.png)
私「ん？なんか見たことあるFigだな...」
![tbl_summary_demo1.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/e132954f-db8f-76f5-48b3-8645c0164afa.gif)
（引用文献 (http://www.danieldsjoberg.com/gtsummary/index.html) ）
私「**！！gtパッケージやんけ！しかもp-valueとか出しとるやんけ！**」
私「**gtsummary**...そんなモノが出ていたのか...」
心の声「前に[gtパッケージの記事](https://qiita.com/yanami/items/8684640b20c86594fbec)書いたんだから、これもまとめるべきでは？」
私「はい...」

ということで記事書きます。

# はじめに

この記事はきれいなTableを作るためのパッケージgtsummaryについての解説記事になります。対象者としては、
- **p値とかn数とかをテーブルでまとめたい**研究者全般
- いままで**Rを使ったデータ解析**をしてきた人
- Rの(特に**tidyverse**)の**美しい描画システム**になれてしまった人
-  宗教上の理由で**Excelが使用できない人、嫌いな人**
のいずれかに該当する人を想定しています。

**2021/01/18 追記**
この記事はgtsummaryの入門という位置づけであり、gtsummary自体かなり色々なことができます。
2021/01/18現在、多くの日本語解説記事ができておりますので、より深く学びたい方はそちらを参考にされると良いと思います。

- [【1-11-2】医療統計で必要なtable1、集計からofficeに貼り付けるまでをgtsummaryパッケージで一気に行う](https://mittidata.com/archives/gtsummary_table1.html)
- [「gtsummary」を使って論文に載せる表を作成してみた](https://note.com/exerciseandbrain/n/n755df620d42a)
- [【R】gtsummaryで回帰分析の表を結合する（tbl_stack編）](https://jojoshin.hatenablog.com/entry/2021/07/19/tbl_stack)
- [【R】gtsummaryで回帰分析の表を結合する（tbl_merge編）](https://jojoshin.hatenablog.com/entry/2021/07/19/tbl_merge)

もちろん、 [gtsummary公式](https://www.danieldsjoberg.com/gtsummary/)も英語でありながら非常にわかりやすいドキュメントになっていますので、ぜひご覧ください！

# gtパッケージと何が違うか
[公式](http://www.danieldsjoberg.com/gtsummary/index.html)によると...
>The {gtsummary} package provides an elegant and flexible way to create publication-ready analytical and summary tables using the R programming language.
 The {gtsummary} package summarizes data sets, regression models, and more, using sensible defaults with highly customizable capabilities.

テキトー訳
>gtsummaryパッケージは、Rを介して出版可能な分析表や要約表を作成するためのエレガントで柔軟な方法を提供します。
これはデータの要約、回帰モデルなどなどを超自由自在にカスタマイズできます。

確かにgtパッケージも**Easily generate information-rich, publication-quality tables from R (出版に耐えうる情報豊富なTableを簡単にRで作ろぜー)**というコンセプトであるので、
その流れをくんだパッケージと言えるでしょう！
ただし、このgtsummaryは**回帰モデルの要約**までカバーしている点が素晴らしいです！

# インストール
CRANにあがっているパッケージなので、いつもどおり```install.packages("gtsummary")```とR console上で打てばokです。

# 使い方
## tbl_summary()
まぁパパっと書いてみましょう。適当なデータフレームを作り、```tbl_summary() ```を適用することで、データを要約してくれます。


```{iris.R}
library(gtsummary)
library(tidyverse)

iris %>% tbl_summary()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/4b41637a-bf46-0e5b-8b7d-e93c4ac78980.png) 

```by = ```で引数に取ることでグループ化も自由にできます

```{iris_group.R}
library(gtsummary)
library(tidyverse)

iris %>% tbl_summary(by = Species)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/a3a75531-8a45-ed5d-d25a-83a215b08d69.png)

見ての通り、それぞれのサンプルサイズ、 medianおよび四分位範囲(IQR)をまとめてくれます。
これはbase関数である```summary()```をうまい具合に表にしていると考えてくれればいいと思います。

もしここで、**「いやいやデータって平均±SDが基本でしょ」**と思ってる方！ご安心下さい。

```{iris_group.R}
library(gtsummary)
library(tidyverse)

iris %>% tbl_summary(
  by = Species,
  statistic = list(all_continuous() ~ "{mean} ({sd})"
  )
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/cf78bcb0-70ae-4094-c869-3c26e5e6d11e.png)
見事！ 今回は```all_continuous()```で連続量を指定しましたが、
```all_categorical() ```でカテゴリカル変数を指定することができます。
例えば、```statistic = list(all_categorical() ~ "{n} / {N} ({p}%)"))```のように指定することで、
全体に対する特定のカテゴリ変数の割合なんかを表に組み込むことができます。

**2022/01/18追記**
最新版（バージョン1.3.4.9008以降）では上記のコードを書くことなく、デフォルトでmean(SD)の形にしてくれる関数があります。

```{mean_SD.R}
theme_gtsummary_mean_sd()

#元に戻す場合は...
reset_gtsummary_theme()
```
これをコード最初にさえ書いておけばOK!
さらに一つポイントなのは、このTableをなんと様々な形式に出力することができます！
対応している形式はkable, gt, flextable, tibbleなどがあり、as_\*\*()によって簡単に変換することが可能です。
**flextableはword, powerpointとの互換性が高いので、wordで論文執筆中の皆さんには非常に有用です。**
いちいちExcelで集計することなしに、論文らしいフォーマットの表が生成されます。

```{save.R}
library(gtsummary)
library(tidyverse)
library(flextable)

theme_gtsummary_mean_sd()

iris %>% 
  tbl_summary(by = Species) %>% 
  as_flex_table() %>% 
  flextable::save_as_docx(path = "/test.docx") # wordファイルで保存される!
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/7c8a5f1c-eae9-da26-3299-c8cbaf9f29e9.png)

## add_p(), add_n()

ここからがgtsummaryの本領です！面倒なtable作りから開放されること請負です！
いま、種間でのSepal.Lengthに有意差があるかを調べているとしましょう。その場合...

```{iris_p.R}
library(gtsummary)
library(tidyverse)

iris %>% tbl_summary(by = Species) %>% add_p(include = Sepal.Length)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/5b79f709-d395-3c25-c61d-edc1bd7ec7ee.png)
**ハイ終わり！** 検定をし（今回はKruskal-Wallis）、有意差があるかどうかを自動的に教えてくれます！今回は```include = Sepal.Length```という引数を取りましたが、
デフォルトではすべての行について検定を行ってくれます。また、```bold_p()```を適用することでこのp値を**太字**にできます！（すげーなおい）
```add_n()```は各サンプルのサンプルサイズを新たに列に加えてくれます。

```{iris_n.R}
library(gtsummary)
library(tidyverse)


iris %>% tbl_summary(by = Species) %>% add_p(include = Sepal.Length) %>%
  bold_p() %>% add_n()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/4c160520-910d-d7ab-d007-032fc8cc2f76.png)
ここまで来るともうpublication-readyという感じですね！

## tbl_regression()
これで終わらないのがgtsummary、最後に```tbl_regression()```について説明します！
これは回帰式の要約値を表示してくれる関数です！

```{cars.R}
library(gtsummary)
library(tidyverse)

cars %>% lm(dist ~ speed, data = .) %>% 
  tbl_regression(intercept = TRUE)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269013/d3f7c357-b3d5-45c7-de17-4d856d4be65e.png)

これによって切片および傾きの推定値、95%信頼区間、p値を自動的に作製してくれます！これは線形回帰にとどまらず様々な回帰式に対応しています。
当然これらも```tbl_summary()```と同様、tibbleやgtオブジェクト、flextableとして扱うことが可能です。


# 最後に

今回解説したgtsummaryは統計をメインにする研究者にとって、あるいはデータサイエンティストにとって強力なツールとなるのではないでしょうか。
また、きれいな表を作りたい... **けどExcelは嫌だ...** という（私のように）わがままな人にとってもありがたいパッケージであると思います！
今回は概略についての解説でしたが、今後時間があれば実践的な話もしたいと思います。
**Enjoy!**