備忘ログ

チラシの裏的備忘録&メモ

Rの{gtsummary}パッケージで作った表をWordやPowerPointのファイルに出力する方法のメモ

Rで表を作る{gtsummary}パッケージをつかっていい感じにきれいめな表を作ったら、「表をPowerPointでくれ」「表をWordでくれ」「表をExcelでくれ」といわたら……

f:id:indenkun:20210406212738p:plain

こんな感じのキレイめな表が{gtsummary}では比較的簡単に描ける。

でOffice系のファイル形式でくれと言われたら、

  1. 絶望する。
  2. Excelで手打ちする。
  3. 知らないふりして画像(.png)ファイルをOfficeファイルに貼り付けてみる。

なんてことはしなくても大丈夫で、そういう事ができるパッケージを使えば簡単にPowerPoint(.pptx)ファイルやWord(.docx)ファイルを作成できるのでその方法をメモしておく。

今回使う表

表は何でもいいがとりあえずチュートリアルにある表を使う(適当にtrial1というオブジェクトに入れておく)。本稿では{gtsummary}での表の作り方のHow toは触れず、あくまでOffice系ファイル形式に出力する方法に留める。

library(tidyverse)
## -- Attaching packages --------------------------------------- tidyverse 1.3.0 --

## √ ggplot2 3.3.3     √ purrr   0.3.4
## √ tibble  3.1.0     √ dplyr   1.0.5
## √ tidyr   1.1.3     √ stringr 1.4.0
## √ readr   1.4.0     √ forcats 0.5.1

## -- Conflicts ------------------------------------------ tidyverse_conflicts() --
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()
library(gtsummary)
## #Uighur
trial1 <- trial %>% 
  select(trt, age, grade, response) %>% 
  tbl_summary(by = trt,
              missing = "no") %>%
  add_n() %>% 
  add_p() %>% 
  modify_header(label = "**Variable**") %>% 
  bold_labels()
trial1
## Warning: The `.dots` argument of `group_by()` is deprecated as of dplyr 1.0.0.
Variable N Drug A, N = 981 Drug B, N = 1021 p-value2
Age 189 46 (37, 59) 48 (39, 56) 0.7
Grade 200 0.9
I 35 (36%) 33 (32%)
II 32 (33%) 36 (35%)
III 31 (32%) 33 (32%)
Tumor Response 193 28 (29%) 33 (34%) 0.5

1 Median (IQR); n (%)

2 Wilcoxon rank sum test; Pearson's Chi-squared test

比較的簡単にきれいな表ができる({gtsummary}がサポートしているのはMarkdown形式で本出力はそれになっているので本来のきれいめな感じが損なわれている気がする。)が、{gtsummary}パッケージ単体ではOfficeファイル形式の出力がサポートされていない。

ちなみに、R上で見た表の感じ(RStudioのViewerで見た感じ)は画像としては冒頭に貼ってあるものになる(ここに画像を貼ったらうまく認識してくれなかったので冒頭に貼った)。こちらのほうが美しい。こっちの状態をなんとかOffice形式のファイルにしたい。

{flextable}パッケージをつかって出力する

{gtsummary}パッケージで作った表を、{flextable}パッケージをつかってOfficeファイル({flextable}がサポートしているのは.docxと.pptx1

インストールしていなかったら,install.packages("flextable")でCRANからインストールできる。

例えば、.pptxファイル形式でoutputというファイル名で出力したかったら次のようにする。

library(flextable)
## 
## Attaching package: 'flextable'

## The following object is masked from 'package:gtsummary':
## 
##     as_flextable

## The following object is masked from 'package:purrr':
## 
##     compose
trial1 %>% 
  as_flex_table() %>% 
  save_as_pptx(path = "output.pptx")

これで、ワーキングディレクトリにoutput.pptxというファイルができ中に{gtsummary}でつくった表が中身を編集できる状態のもの(画像ファイルじゃないという意味)で出力される。

こんなのが出力されてる。

f:id:indenkun:20210406165021p:plain

.docxファイルがいいなら次のようにすると、output.docxファイルが作られる。

library(flextable) 

trial1 %>% 
  as_flex_table() %>% 
  save_as_docx(path = "output.docx")

こんな感じの出力結果が得られる。

f:id:indenkun:20210406164903p:plain

簡単である。ミソは、{flextable}で扱えるように途中でas_flex_table()をかませてクラスを変更していること。直接{gtsummary}で作った表をそのまま渡しても{flextable}ではうまく扱えない。

残念ながら.xlsxファイルには直接出力できないので欲しかったらコピペするといいかもしれない。

蛇足

{gtsummary}で作った表の出力方法について日本語でググったときには{gt}パッケージをつかってpngファイルの出力の方法は簡単に出てきたが、それ以外の形式への出力の方法を見つけることができなかった。

英語でググるとすぐに出てくる公式ドキュメントgtsummary + R Markdown • gtsummaryにあたって{flextable}つかうといいよ、{gtsummary}ではas_flex_table()って関数を用意しているからクラス変更して使ってね、って丁寧に書いてある。これは、{gtsummary}パッケージに同梱されているドキュメントにも入っている。やはりドキュメント(ウェブ上でも、パッケージのドキュメントでもどちらでも)読むの大事。公式ドキュメント大事なのはわかっているのだがとりあえずググってしまう。


  1. 最終的に{flextable}パッケージでoffice系のファイル形式に出力するときに使っている{officer}パッケージが.xlsx形式のファイルをサポートしていないので、Excelファイル(.xlsx)はサポートされていないが、ここまで来たらコピペすると出せるところまで行けるので手打ちより遥かにまし。