「gtsummary」を使って論文に載せる表を作成してみた
今回は,Rのパッケージである「gtsummary」を使って表を作成する方法を紹介します.流れとしては,エクセルのデータをRStudioに取り込んで,数行のコードで論文や学会発表でつかえる表を作成します.
論文に記載する表を作るって結構めんどくさいんですよね.ExcelやSPSSなどをつかって平均値や標準偏差を計算して,wordやpowerpointで作成する表にいちいち数字を入力していくという作業...自分も博士課程の学生の時にやっていました.この単純な作業を,プログラミングで解決できることが判明しました.これで,作業が効率化して余暇時間が生まれますね.お酒が好きな人なら飲みに行ったり,家庭を持っている人なら家族サービスをしたりできます.自分なら筋トレします!無駄な作業をいかに効率よくこなしていくかを考えるのは非常に大切だと思います.
早速,表を作っていきましょう.今回は,乱数によって発生させた疑似データを使っていきます.研究デザインとしては,運動もしくは(座位)安静の状態のあとに認知課題を行い,その成績を表にしてまとめるということをイメージしています.↓に研究デザインのイメージを図にしました.なんでこんな研究デザインをイメージしたかというと,自分の研究分野が運動と脳機能だったので,自分の頭のなかで研究デザインを具体的にイメージしやすくするためです.
疑似データを↓に示します.
疑似データの解説
age・・・年齢
sex・・・性別(male→男性,female→女性)
weight・・・体重
score・・・認知課題の成績
intervention ・・・条件(0→運動条件, 1→安静条件)
このサンプルデータは↓からダウンロードできます.
それでは,Rstudioを立ち上げて,コードを書いていきます.
まずは,カレントディレクトリの設定setwd("ここに作業するファイルの場所を記載")
setwd("ここに作業するファイルの場所を記載")
次にライブラリーのインポートをします.
library(gtsummary)
library(tidyverse)
パッケージをインストールしていない人は以下のコードでインストールができます.
install.packages("gtsummary")
install.packages("tidyverse")
csvファイルを読み込みます.
data <- read.csv("data.csv")
それでは,表を作成するコードを書いていきます.
reset_gtsummary_theme()
table1 <-data %>%
mutate(intervention = factor(intervention, labels = c("Exercise", "Control"))) %>%
tbl_summary(by = intervention,
statistic = list(age ~ "{mean}({sd})",
weight ~ "{mean}({sd})",
score ~ "{mean}({sd})"),
digits = list(c(age,weight,score) ~ c(1,1)),
label = list(age ~ "Age(yr)",
sex ~ "Sex",
weight ~ "Weight(kg)",
score ~ "Accuracy(%)")) %>%
add_p(list(age ~ "t.test",
weight ~ "t.test",
score ~ "t.test")) %>%
modify_spanning_header(starts_with("stat_") ~ "**Treatment**")%>%
modify_header(label="**Characteristics**")%>%
add_overall() %>%
bold_labels()
table1
このコードを書くと↓の表が得られます.
凄いですね.数行のコードで,論文に記載できる表が一発で作れます.「Exercise」が「運動条件」,「Control」が「安静条件」を示しています.このひな形を作っておけば,違うデータにも応用できます.これでいちいち数字を打ち込むという無駄な時間が削減できますね.
詳しいコードの解説は↓のwebサイトに記載してあります.今回の表を作成するのにも,かなり参考にさせていただきます.
今回使用したコードについて簡単な解説をしていきます.まずは設定のリセットを書いてます.
reset_gtsummary_theme()%>%
interventionを「Exercise」と「Control」の欄を作成してます.
mutate(intervention = factor(intervention, labels = c("Exercise", "Control"))) %>%
statisticでage,weight,scoreを平均値と標準偏差で記載するようにしてます.性別に関してはデフォルトで割合を示してくれるようです.labelでageをAge(yr)に, sexをSexに,weightをWeight(kg)に,scoreをAccuracy(%)に変換してます.
tbl_summary(by = intervention,
statistic = list(age ~ "{mean}({sd})",
weight ~ "{mean}({sd})",
score ~ "{mean}({sd})"),
digits = list(c(age,weight,score) ~ c(1,1)),
label = list(age ~ "Age(yr)",
sex ~ "Sex",
weight ~ "Weight(kg)",
score ~ "Accuracy(%)")) %>%
次にage,weight,scoreでt検定を行い,その結果を記載します.
add_p(list(age ~ "t.test",
weight ~ "t.test",
score ~ "t.test")) %>%
ここからは,グラフの体裁を少し修正しています.modify_spanning_headerで「ExerciseとControl」の上にTreatmentという語を入れてます.
modify_spanning_header(starts_with("stat_") ~ "**Treatment**")%>%
modify_headerでCharacteristicsという語を挿入してます.
modify_header(label="**Characteristics**")%>%
全体の集計を入れる場合には,add_overall()を記載します.
add_overall() %>%
ちなみに,add_overall() をいれないと,↓の表が出来上がります.
「Exercise」と「Control」のみの集計になりました.
最後にラベルを太文字に変えます.
bold_labels()
最後にtable1を呼び出して,グラフを描写します.この作成したグラフから手作業でもっと細かい箇所を修正したいときには,追加のパッケージを加えて,wordやpowerpointに出力できるので,そちらで修正できます.詳しくは↓のサイトをみてください.
自分が大学院生の時に「gtsummary」のことを知っておきたかったですね.そうすれば,表にいちいち数字をいれる手間が省け,筋トレする時間などが捻出できました.
gtsummaryは今回紹介した機能に加えて様々なオプションがあります.ぜひ参考資料に示したサイトに飛んでいただき,いろいろな機能を試していただきたいです.
参考資料
・【1-11-2】医療統計で必要なtable1、集計からofficeに貼り付けるまでをgtsummaryパッケージで一気に行う
http://www.restorative-pt.tokyo/archives/gtsummary_table1.html
・【R】データ要約ガチ勢のためのgtsummaryで表を書こう
https://qiita.com/yanami/items/117851de49024f5980d0
・Presentation-Ready Summary Tables with gtsummary
https://education.rstudio.com/blog/2020/07/gtsummary/
・Tutorial: tbl_summary
http://www.danieldsjoberg.com/gtsummary/articles/tbl_summary.html
今回は久々にプログラミング系の記事を書いてみました.最近,プログラミングの勉強を再開したので,学んだ内容を自分なりに伝えていこうと考えています.
ここまで読んでくださいありがとうございました.何かコードに間違い等があればご指摘していただけると非常にありがたいです.
最後に,今回使用したコードのまとめを貼っておきます.
setwd("ここに作業するファイルの場所を記載")
library(gtsummary)
library(tidyverse)
data <- read.csv("data.csv")
reset_gtsummary_theme()
table1 <-data %>%
mutate(intervention = factor(intervention, labels = c("Exercise", "Control"))) %>%
tbl_summary(by = intervention,
statistic = list(age ~ "{mean}({sd})",
weight ~ "{mean}({sd})",
score ~ "{mean}({sd})"),
digits = list(c(age,weight,score) ~ c(1,1)),
label = list(age ~ "Age(yr)",
sex ~ "Sex",
weight ~ "Weight(kg)",
score ~ "Accuracy(%)")) %>%
add_p(list(age ~ "t.test",
weight ~ "t.test",
score ~ "t.test")) %>%
modify_spanning_header(starts_with("stat_") ~ "**Treatment**")%>%
modify_header(label="**Characteristics**")%>%
add_overall() %>%
bold_labels()
table1