gtsummary 패키지 소개

데이터 셋의 변수를 하나의 테이블로 요약하여 효율적으로 논문에 들어갈 table1을 만들 수 있는 gtsummary 패키지에 대해 소개합니다.
R
rpackage
gtsummary
Author
Published

February 4, 2022

시작하기 전에

본 자료에서는 데이터 셋의 변수를 하나의 테이블로 요약하는 방법에 대해 알아볼 것이다. gtsummary 패키지를 이용하면 효율적으로 논문에 들어갈 table1을 만들 수 있다. gtsummary 패키지에 관한 기본 개념 및 함수들을 예제를 통해 다루어 보자.

요약 테이블 만들기

tbl_summary 함수를 이용하여 연속형 및 범주형 변수에 대한 기술 통계량을 계산하고 테이블 형태로 나타낼 수 있다.

Setup

## Setup

# install.packages("tidyverse")
# install.packages("data.table")
# install.packages("gtsummary")

library(tidyverse)
library(data.table)
library(gtsummary)

Road file

예제에 사용할 데이터를 fread함수를 통해 불러오자. 데이터는 09-15년 공단 건강검진 데이터에서 실습용으로 32 명을 뽑은 자료이며, 자세한 내용은 “data/2교시 테이블 세부 레이아웃 소개(최신자료).pdf” 를 참고하자.

## Load file

url <- "https://raw.githubusercontent.com/jinseob2kim/lecture-snuhlab/master/data/example_g1e.csv"
dt <- fread(url, header=T)
dt

tbl_summary

tbl_summary 함수를 사용하여 기본 테이블을 작성할 수 있다. 출력값으로 데이터 셋의 각 열에 대한 기술 통계량을 반환한다. 데이터 셋에 섞인 범주형 변수와 연속형 변수를 자동적으로 인식해 그에 맞는 값을 반환하며, 범주형 변수의 기본 출력값은 n(%)이고 연속형 변수의 기본 출력값은 median(IQR)이다. 결측값은 테이블에 Unknown으로 출력된다.

fread를 통해 불러온 데이터에서 몇 개의 변수를 추출해 요약 테이블을 만들어보자.

# select variables

dt2 <- dt %>% select("EXMD_BZ_YYYY", "Q_PHX_DX_STK", "Q_SMK_YN",
                     "HGHT", "WGHT" ,"TOT_CHOL", "TG")
dt2

tbl_summary 함수를 통해 간단한 요약 테이블을 만들어보자.

# create table

dt2 %>% tbl_summary()
Characteristic N = 1,6441
EXMD_BZ_YYYY
    2009 214 (13%)
    2010 236 (14%)
    2011 223 (14%)
    2012 234 (14%)
    2013 243 (15%)
    2014 254 (15%)
    2015 240 (15%)
Q_PHX_DX_STK 12 (1.1%)
    Unknown 573
Q_SMK_YN
    1 995 (61%)
    2 256 (16%)
    3 391 (24%)
    Unknown 2
HGHT 165 (158, 171)
WGHT 64 (56, 73)
TOT_CHOL 193 (170, 218)
TG 106 (72, 163)
1 n (%); Median (IQR)
  • 변수 유형이 자동으로 구분되어 연속형 변수는 median(IQR), 범주형 변수는 n(%)의 형태로 출력된 것을 볼 수 있다.

그룹별 통계

by

tbl_summary 함수에는 다양한 옵션이 존재한다. by 옵션을 이용하여 그룹별 통계량을 계산할 수 있다. by 옵션에 그룹별 통계를 수행할 변수를 지정하여 사용 가능하다. 다음 예시에서 연도 변수인 EXMD_BZ_YYYY를 기준으로 그룹별 통계량을 출력해보자.

dt2 %>% tbl_summary(by = EXMD_BZ_YYYY)
Characteristic 2009, N = 2141 2010, N = 2361 2011, N = 2231 2012, N = 2341 2013, N = 2431 2014, N = 2541 2015, N = 2401
Q_PHX_DX_STK 2 (1.5%) 2 (1.2%) 1 (0.7%) 2 (1.3%) 2 (1.2%) 2 (1.3%) 1 (0.6%)
    Unknown 82 74 85 78 75 95 84
Q_SMK_YN






    1 125 (59%) 132 (56%) 140 (63%) 146 (62%) 141 (58%) 157 (62%) 154 (64%)
    2 34 (16%) 42 (18%) 35 (16%) 36 (15%) 35 (14%) 38 (15%) 36 (15%)
    3 53 (25%) 62 (26%) 48 (22%) 52 (22%) 67 (28%) 59 (23%) 50 (21%)
    Unknown 2 0 0 0 0 0 0
HGHT 165 (159, 171) 165 (159, 171) 165 (157, 171) 165 (159, 172) 165 (159, 171) 164 (158, 172) 164 (158, 172)
WGHT 64 (55, 72) 64 (56, 73) 63 (56, 72) 64 (57, 74) 64 (57, 73) 63 (56, 72) 64 (57, 74)
TOT_CHOL 193 (170, 216) 193 (168, 220) 190 (168, 215) 196 (173, 224) 190 (168, 218) 193 (171, 216) 194 (171, 217)
TG 105 (71, 149) 107 (70, 159) 104 (75, 165) 108 (69, 164) 107 (76, 160) 108 (75, 163) 111 (71, 167)
1 n (%); Median (IQR)

tbl_strata

by 옵션을 통해 그룹별 통계량을 계산한 것처럼 tbl_strata 함수를 이용하면 여러 계층으로 그룹을 묶을 수 있다. tbl_strata(data, strata, .tbl_fun, …) 형식을 사용하며 strata에 그룹화할 칼럼, .tbl_fun 인자에는 출력할 tbl_summary formula를 지정한다.

tbl_strata(data = dt2,
           strata = EXMD_BZ_YYYY,
           .tbl_fun =
             ~ .x %>%
             tbl_summary(by = Q_SMK_YN) %>%
             add_p() %>%
             add_n(),
           .header = "**{strata}**, N={n}")
Characteristic 2009, N=214 2010, N=236 2011, N=223 2012, N=234 2013, N=243 2014, N=254 2015, N=240
N 1, N = 1251 2, N = 341 3, N = 531 p-value2 N 1, N = 1321 2, N = 421 3, N = 621 p-value2 N 1, N = 1401 2, N = 351 3, N = 481 p-value2 N 1, N = 1461 2, N = 361 3, N = 521 p-value2 N 1, N = 1411 2, N = 351 3, N = 671 p-value2 N 1, N = 1571 2, N = 381 3, N = 591 p-value2 N 1, N = 1541 2, N = 361 3, N = 501 p-value2
Q_PHX_DX_STK 130 1 (1.5%) 1 (3.6%) 0 (0%) 0.5 162 2 (2.3%) 0 (0%) 0 (0%) >0.9 138 1 (1.1%) 0 (0%) 0 (0%) >0.9 156 2 (2.1%) 0 (0%) 0 (0%) >0.9 168 2 (2.1%) 0 (0%) 0 (0%) >0.9 159 2 (2.2%) 0 (0%) 0 (0%) >0.9 156 1 (1.0%) 0 (0%) 0 (0%) >0.9
    Unknown
58 6 18

44 10 20

53 14 18

52 12 14

44 7 24

67 8 20

58 12 14
HGHT 212 160 (155, 166) 167 (164, 174) 170 (165, 175) <0.001 236 160 (156, 166) 168 (164, 173) 172 (165, 176) <0.001 223 159 (155, 166) 170 (166, 174) 172 (169, 177) <0.001 234 161 (156, 167) 169 (165, 172) 172 (166, 177) <0.001 243 160 (156, 165) 170 (166, 172) 171 (167, 174) <0.001 254 160 (155, 165) 169 (165, 174) 173 (168, 177) <0.001 240 161 (155, 166) 170 (165, 173) 173 (169, 177) <0.001
WGHT 212 59 (52, 67) 69 (61, 74) 71 (62, 77) <0.001 236 60 (54, 67) 71 (66, 77) 70 (62, 78) <0.001 223 60 (53, 67) 69 (64, 75) 72 (64, 79) <0.001 234 61 (54, 69) 70 (63, 77) 72 (64, 80) <0.001 243 59 (53, 69) 68 (63, 73) 69 (62, 75) <0.001 254 59 (53, 66) 69 (62, 77) 72 (65, 79) <0.001 240 61 (54, 69) 70 (63, 79) 74 (62, 84) <0.001
TOT_CHOL 212 192 (166, 215) 195 (177, 224) 198 (174, 217) 0.6 236 193 (166, 220) 200 (181, 219) 187 (168, 218) 0.5 223 186 (165, 212) 195 (172, 222) 198 (176, 228) 0.2 234 198 (173, 224) 200 (171, 238) 192 (175, 214) 0.8 243 187 (165, 214) 191 (177, 227) 196 (170, 220) 0.3 254 193 (170, 216) 194 (174, 220) 193 (175, 214) >0.9 240 189 (170, 216) 194 (171, 216) 204 (180, 222) 0.12
TG 212 87 (59, 125) 130 (79, 189) 139 (100, 173) <0.001 236 86 (64, 133) 113 (78, 177) 142 (101, 231) <0.001 223 93 (67, 129) 129 (78, 194) 148 (91, 200) <0.001 234 94 (65, 133) 131 (91, 188) 132 (94, 201) 0.001 243 96 (72, 140) 105 (75, 162) 127 (85, 217) 0.009 254 98 (73, 140) 119 (87, 165) 134 (83, 202) 0.005 240 98 (64, 145) 125 (97, 255) 151 (90, 248) <0.001
1 n (%); Median (IQR)
2 Fisher’s exact test; Kruskal-Wallis rank sum test

Modifying function arguments

tbl_summary 함수에는 다양한 옵션이 존재하며, 이러한 옵션 조정을 통해 원하는 테이블을 작성할 수 있다. 다음은 tbl_summary 함수의 주요 옵션에 대한 설명이다.

  • label : 테이블에 출력되는 변수명 지정
  • type : 변수 유형 지정 (ex. 연속형, 범주형)
  • statistic : 요약 통계량 지정
  • digits : 자릿수 지정
  • missing : 결측값이 있는 행을 표시할지 여부
  • missing_text : 결측행의 변수명 지정
  • sort : 빈도에 따라 범주형 변수의 level 정렬
  • percent : 열/행의 백분율 출력
  • include : 테이블에 포함할 변수 지정

다음은 옵션을 활용한 예시이다. 연도 변수 EXMD_BZ_YYYY의 그룹별 통계량을 출력하고, Q_SMK_YN 변수를 “smoking y/n”로 바꾸어보자. 이때 연속형 변수의 출력값을 {mean}({sd})으로, 범주형 변수의 출력값을 {n}/{N} ({p}%) 형태로 바꾸어보자. 결측값의 변수명은 “Missing”으로 수정한다.

dt2 %>%
  tbl_summary(
    by = EXMD_BZ_YYYY,
    statistic = list(all_continuous() ~ "{mean} ({sd})",
                     all_categorical() ~ "{n} / {N} ({p}%)"),
    label = Q_SMK_YN ~ "smoking y/n",
    missing_text = "Missing"
  )
Characteristic 2009, N = 2141 2010, N = 2361 2011, N = 2231 2012, N = 2341 2013, N = 2431 2014, N = 2541 2015, N = 2401
Q_PHX_DX_STK 2 / 132 (1.5%) 2 / 162 (1.2%) 1 / 138 (0.7%) 2 / 156 (1.3%) 2 / 168 (1.2%) 2 / 159 (1.3%) 1 / 156 (0.6%)
    Missing 82 74 85 78 75 95 84
smoking y/n






    1 125 / 212 (59%) 132 / 236 (56%) 140 / 223 (63%) 146 / 234 (62%) 141 / 243 (58%) 157 / 254 (62%) 154 / 240 (64%)
    2 34 / 212 (16%) 42 / 236 (18%) 35 / 223 (16%) 36 / 234 (15%) 35 / 243 (14%) 38 / 254 (15%) 36 / 240 (15%)
    3 53 / 212 (25%) 62 / 236 (26%) 48 / 223 (22%) 52 / 234 (22%) 67 / 243 (28%) 59 / 254 (23%) 50 / 240 (21%)
    Missing 2 0 0 0 0 0 0
HGHT 164 (9) 165 (9) 164 (10) 165 (9) 165 (9) 164 (9) 164 (9)
WGHT 64 (13) 65 (12) 65 (13) 66 (12) 65 (12) 64 (12) 66 (13)
TOT_CHOL 195 (37) 195 (39) 194 (38) 199 (35) 192 (36) 195 (36) 195 (36)
TG 129 (90) 136 (101) 138 (108) 129 (89) 132 (98) 138 (127) 141 (113)
1 n / N (%); Mean (SD)

functions to add information

gtsummary 패키지에는 add_() 함수를 이용하여 테이블에 통계 정보를 추가하는 기능이 있다. 다음은 add_() 함수들의 주요 설명이다.

  • add_p() : 그룹 간 값의 비교를 위한 p-value 추가
  • add_overall() : 전체 요약 통계량을 출력하는 열 추가
  • add_n() : 각 변수의 행 수와 결측행 개수 추가
  • add_difference() : 두 그룹 간의 차이, 신뢰구간 및 p-value 추가
  • add_stat_label() : 요약 통계량의 label 추가
  • add_stat() : 사용자 지정 함수 추가
  • add_q() : 다중 비교를 위한 q-value 추가

add_p()

add_p() 함수를 사용하여 tbl_summary에 의해 생성된 테이블에 p-value를 추가할 수 있다. 이때 test 인자에 “t.test”, “wilcox.test”, “chisq.test”, “fisher.test”, “aov”, … 와 같이 수행할 통계 test를 지정할 수 있다. add_p(col ~ “.test”) 형식을 사용하며 모든 변수 또는 일부 변수에 대해 적용할 수 있다.

  • default test
    • 연속형 변수 - 2그룹 wilcox.test, 3그룹 이상 kruskal.test
    • 범주형 변수 - 행의 수가 5 이상인 경우 chisq.test, 5 미만인 경우 fisher.test
  1. 연속형 변수 - t.test, wilcox.test
dt2 %>%
  tbl_summary(by = Q_PHX_DX_STK) %>%
  add_p(all_continuous() ~ "t.test")
Characteristic 0, N = 1,0591 1, N = 121 p-value2
EXMD_BZ_YYYY

>0.9
    2009 130 (12%) 2 (17%)
    2010 160 (15%) 2 (17%)
    2011 137 (13%) 1 (8.3%)
    2012 154 (15%) 2 (17%)
    2013 166 (16%) 2 (17%)
    2014 157 (15%) 2 (17%)
    2015 155 (15%) 1 (8.3%)
Q_SMK_YN

0.045
    1 608 (58%) 11 (92%)
    2 186 (18%) 1 (8.3%)
    3 263 (25%) 0 (0%)
    Unknown 2 0
HGHT 166 (160, 172) 159 (155, 170) 0.064
WGHT 65 (58, 73) 64 (56, 67) 0.051
TOT_CHOL 194 (171, 218) 163 (146, 192) 0.035
TG 108 (73, 163) 128 (116, 149) 0.5
1 n (%); Median (IQR)
2 Fisher’s exact test; Welch Two Sample t-test
dt2 %>%
  tbl_summary(by = Q_PHX_DX_STK) %>%
  add_p(HGHT ~ "wilcox.test")
Characteristic 0, N = 1,0591 1, N = 121 p-value2
EXMD_BZ_YYYY

>0.9
    2009 130 (12%) 2 (17%)
    2010 160 (15%) 2 (17%)
    2011 137 (13%) 1 (8.3%)
    2012 154 (15%) 2 (17%)
    2013 166 (16%) 2 (17%)
    2014 157 (15%) 2 (17%)
    2015 155 (15%) 1 (8.3%)
Q_SMK_YN

0.045
    1 608 (58%) 11 (92%)
    2 186 (18%) 1 (8.3%)
    3 263 (25%) 0 (0%)
    Unknown 2 0
HGHT 166 (160, 172) 159 (155, 170) 0.048
WGHT 65 (58, 73) 64 (56, 67) 0.2
TOT_CHOL 194 (171, 218) 163 (146, 192) 0.022
TG 108 (73, 163) 128 (116, 149) 0.10
1 n (%); Median (IQR)
2 Fisher’s exact test; Wilcoxon rank sum test
  1. 범주형 변수 - chisq.test, fisher.test
dt2 %>%
  tbl_summary(by = Q_PHX_DX_STK) %>%
  add_p(all_categorical() ~ "chisq.test")
Characteristic 0, N = 1,0591 1, N = 121 p-value2
EXMD_BZ_YYYY

>0.9
    2009 130 (12%) 2 (17%)
    2010 160 (15%) 2 (17%)
    2011 137 (13%) 1 (8.3%)
    2012 154 (15%) 2 (17%)
    2013 166 (16%) 2 (17%)
    2014 157 (15%) 2 (17%)
    2015 155 (15%) 1 (8.3%)
Q_SMK_YN

0.051
    1 608 (58%) 11 (92%)
    2 186 (18%) 1 (8.3%)
    3 263 (25%) 0 (0%)
    Unknown 2 0
HGHT 166 (160, 172) 159 (155, 170) 0.048
WGHT 65 (58, 73) 64 (56, 67) 0.2
TOT_CHOL 194 (171, 218) 163 (146, 192) 0.022
TG 108 (73, 163) 128 (116, 149) 0.10
1 n (%); Median (IQR)
2 Pearson’s Chi-squared test; Wilcoxon rank sum test
dt2 %>%
  tbl_summary(by = Q_PHX_DX_STK) %>%
  add_p(Q_SMK_YN ~ "fisher.test")
Characteristic 0, N = 1,0591 1, N = 121 p-value2
EXMD_BZ_YYYY

>0.9
    2009 130 (12%) 2 (17%)
    2010 160 (15%) 2 (17%)
    2011 137 (13%) 1 (8.3%)
    2012 154 (15%) 2 (17%)
    2013 166 (16%) 2 (17%)
    2014 157 (15%) 2 (17%)
    2015 155 (15%) 1 (8.3%)
Q_SMK_YN

0.045
    1 608 (58%) 11 (92%)
    2 186 (18%) 1 (8.3%)
    3 263 (25%) 0 (0%)
    Unknown 2 0
HGHT 166 (160, 172) 159 (155, 170) 0.048
WGHT 65 (58, 73) 64 (56, 67) 0.2
TOT_CHOL 194 (171, 218) 163 (146, 192) 0.022
TG 108 (73, 163) 128 (116, 149) 0.10
1 n (%); Median (IQR)
2 Fisher’s exact test; Wilcoxon rank sum test

이외에 다양한 add_()함수를 이용하여 앞에서 만든 table에 여러 통계량을 추가해보자.

dt2 %>% 
  tbl_summary(by = EXMD_BZ_YYYY) %>%
  add_p() %>%
  add_overall() %>% 
  add_n() %>% 
  add_q()
Characteristic N Overall, N = 1,6441 2009, N = 2141 2010, N = 2361 2011, N = 2231 2012, N = 2341 2013, N = 2431 2014, N = 2541 2015, N = 2401 p-value2 q-value3
Q_PHX_DX_STK 1,071 12 (1.1%) 2 (1.5%) 2 (1.2%) 1 (0.7%) 2 (1.3%) 2 (1.2%) 2 (1.3%) 1 (0.6%) >0.9 >0.9
    Unknown
573 82 74 85 78 75 95 84

Q_SMK_YN 1,642







0.9 >0.9
    1
995 (61%) 125 (59%) 132 (56%) 140 (63%) 146 (62%) 141 (58%) 157 (62%) 154 (64%)

    2
256 (16%) 34 (16%) 42 (18%) 35 (16%) 36 (15%) 35 (14%) 38 (15%) 36 (15%)

    3
391 (24%) 53 (25%) 62 (26%) 48 (22%) 52 (22%) 67 (28%) 59 (23%) 50 (21%)

    Unknown
2 2 0 0 0 0 0 0

HGHT 1,644 165 (158, 171) 165 (159, 171) 165 (159, 171) 165 (157, 171) 165 (159, 172) 165 (159, 171) 164 (158, 172) 164 (158, 172) >0.9 >0.9
WGHT 1,644 64 (56, 73) 64 (55, 72) 64 (56, 73) 63 (56, 72) 64 (57, 74) 64 (57, 73) 63 (56, 72) 64 (57, 74) 0.8 >0.9
TOT_CHOL 1,644 193 (170, 218) 193 (170, 216) 193 (168, 220) 190 (168, 215) 196 (173, 224) 190 (168, 218) 193 (171, 216) 194 (171, 217) 0.7 >0.9
TG 1,644 106 (72, 163) 105 (71, 149) 107 (70, 159) 104 (75, 165) 108 (69, 164) 107 (76, 160) 108 (75, 163) 111 (71, 167) >0.9 >0.9
1 n (%); Median (IQR)
2 Fisher’s exact test; Pearson’s Chi-squared test; Kruskal-Wallis rank sum test
3 False discovery rate correction for multiple testing
  • 각 변수의 p-value 및 q-value와 전체 요약 통계량, 행의 수가 출력된 것을 확인할 수 있다.

이번에는 두 그룹 간의 차이를 비교해보자.

dt2 %>%
  tbl_summary(by = Q_PHX_DX_STK) %>%
  add_difference()
Characteristic 0, N = 1,0591 1, N = 121 p-value2 Difference2 95% CI2,3
EXMD_BZ_YYYY




    2009 130 (12%) 2 (17%)


    2010 160 (15%) 2 (17%)


    2011 137 (13%) 1 (8.3%)


    2012 154 (15%) 2 (17%)


    2013 166 (16%) 2 (17%)


    2014 157 (15%) 2 (17%)


    2015 155 (15%) 1 (8.3%)


Q_SMK_YN




    1 608 (58%) 11 (92%)


    2 186 (18%) 1 (8.3%)


    3 263 (25%) 0 (0%)


    Unknown 2 0


HGHT 166 (160, 172) 159 (155, 170) 0.064 6.5 -0.44, 14
WGHT 65 (58, 73) 64 (56, 67) 0.051 5.4 -0.04, 11
TOT_CHOL 194 (171, 218) 163 (146, 192) 0.035 23 1.9, 43
TG 108 (73, 163) 128 (116, 149) 0.5 -12 -50, 26
1 n (%); Median (IQR)
2 Welch Two Sample t-test
3 CI = Confidence Interval
  • Q_PHX_DX_STK 변수의 두 그룹 간의 차이와 신뢰구간, p-value가 추가된 것을 볼 수 있다.

functions to format table

gtsummary 패키지에는 테이블의 형식을 지정하는 함수 또한 존재한다. 다음과 같은 함수들을 사용하여 테이블의 디자인 및 형식을 설정할 수 있다.

  • modify_header() : 테이블 header 형식 지정
  • modify_footnote() : 테이블 각주 형식 지정
  • modify_spanning_header() : 테이블 spanning header 형식 지정
  • modify_caption() : 테이블 캡션 형식 지정
  • bold_labels() : 변수명 볼드체
  • bold_levels() : 범주 볼드체
  • italicize_labels() : 변수명 기울임
  • italicize_levels() : 범주 기울임
  • bold_p() : p-value 볼드체

위의 함수들을 사용하여 테이블의 디자인을 설정해보자.

dt2 %>% 
  tbl_summary(by = EXMD_BZ_YYYY) %>%
  add_p() %>%
  add_n() %>% 
  modify_header(label ~ "**Variables**") %>% 
  modify_spanning_header(all_stat_cols() ~ "**Year**") %>% 
  modify_footnote(all_stat_cols() ~ "Median(IQR) or Frequency(%)") %>% 
  modify_caption("Table 1") %>% 
  bold_labels()
Table 1
Variables N Year p-value2
2009, N = 2141 2010, N = 2361 2011, N = 2231 2012, N = 2341 2013, N = 2431 2014, N = 2541 2015, N = 2401
Q_PHX_DX_STK 1,071 2 (1.5%) 2 (1.2%) 1 (0.7%) 2 (1.3%) 2 (1.2%) 2 (1.3%) 1 (0.6%) >0.9
    Unknown
82 74 85 78 75 95 84
Q_SMK_YN 1,642






0.9
    1
125 (59%) 132 (56%) 140 (63%) 146 (62%) 141 (58%) 157 (62%) 154 (64%)
    2
34 (16%) 42 (18%) 35 (16%) 36 (15%) 35 (14%) 38 (15%) 36 (15%)
    3
53 (25%) 62 (26%) 48 (22%) 52 (22%) 67 (28%) 59 (23%) 50 (21%)
    Unknown
2 0 0 0 0 0 0
HGHT 1,644 165 (159, 171) 165 (159, 171) 165 (157, 171) 165 (159, 172) 165 (159, 171) 164 (158, 172) 164 (158, 172) >0.9
WGHT 1,644 64 (55, 72) 64 (56, 73) 63 (56, 72) 64 (57, 74) 64 (57, 73) 63 (56, 72) 64 (57, 74) 0.8
TOT_CHOL 1,644 193 (170, 216) 193 (168, 220) 190 (168, 215) 196 (173, 224) 190 (168, 218) 193 (171, 216) 194 (171, 217) 0.7
TG 1,644 105 (71, 149) 107 (70, 159) 104 (75, 165) 108 (69, 164) 107 (76, 160) 108 (75, 163) 111 (71, 167) >0.9
1 Median(IQR) or Frequency(%)
2 Fisher’s exact test; Pearson’s Chi-squared test; Kruskal-Wallis rank sum test

Multi-line Continuous Summaries

연속형 변수의 통계량은 여러 줄로 요약될 수 있다. 여러 줄에 걸쳐 연속형 변수의 요약값을 출력할 때에는 변수 type을 continuous2로 지정해 주어야 한다.

MyTbl <- dt2 %>%
  tbl_summary(
    by = EXMD_BZ_YYYY,
    type = all_continuous() ~ "continuous2",
    statistic = all_continuous() ~ c("{N_nonmiss}",
                                     "{median} ({p25}, {p75})",
                                     "{min}, {max}"),
    missing = "no"
  ) %>% 
  add_p()

MyTbl
Characteristic 2009, N = 2141 2010, N = 2361 2011, N = 2231 2012, N = 2341 2013, N = 2431 2014, N = 2541 2015, N = 2401 p-value2
Q_PHX_DX_STK 2 (1.5%) 2 (1.2%) 1 (0.7%) 2 (1.3%) 2 (1.2%) 2 (1.3%) 1 (0.6%) >0.9
Q_SMK_YN






0.9
    1 125 (59%) 132 (56%) 140 (63%) 146 (62%) 141 (58%) 157 (62%) 154 (64%)
    2 34 (16%) 42 (18%) 35 (16%) 36 (15%) 35 (14%) 38 (15%) 36 (15%)
    3 53 (25%) 62 (26%) 48 (22%) 52 (22%) 67 (28%) 59 (23%) 50 (21%)
HGHT






>0.9
    N 214 236 223 234 243 254 240
    Median (IQR) 165 (159, 171) 165 (159, 171) 165 (157, 171) 165 (159, 172) 165 (159, 171) 164 (158, 172) 164 (158, 172)
    Range 139, 186 139, 186 134, 188 140, 188 139, 186 136, 185 138, 185
WGHT






0.8
    N 214 236 223 234 243 254 240
    Median (IQR) 64 (55, 72) 64 (56, 73) 63 (56, 72) 64 (57, 74) 64 (57, 73) 63 (56, 72) 64 (57, 74)
    Range 35, 110 31, 114 39, 114 39, 111 37, 117 31, 111 36, 118
TOT_CHOL






0.7
    N 214 236 223 234 243 254 240
    Median (IQR) 193 (170, 216) 193 (168, 220) 190 (168, 215) 196 (173, 224) 190 (168, 218) 193 (171, 216) 194 (171, 217)
    Range 112, 300 68, 324 74, 321 120, 300 83, 303 119, 341 101, 363
TG






>0.9
    N 214 236 223 234 243 254 240
    Median (IQR) 105 (71, 149) 107 (70, 159) 104 (75, 165) 108 (69, 164) 107 (76, 160) 108 (75, 163) 111 (71, 167)
    Range 26, 654 25, 685 26, 723 24, 572 13, 1,017 24, 1,210 34, 878
1 n (%)
2 Fisher’s exact test; Pearson’s Chi-squared test; Kruskal-Wallis rank sum test
  • 연속형 변수의 요약 통계량이 3줄로 늘어난 것을 확인할 수 있다.

Save individual tables

gtsummary 패키지를 이용해 만든 table을 flextable 객체로 바꾼 후 워드 파일로 저장할 수 있다.

MyTbl %>% 
  as_flex_table() %>% 
  flextable::save_as_docx(MyTbl, path = "/cloud/project/table.docx")

마치며

이번 강의를 정리하자.

  1. gtsummary 패키지의 tbl_summary 함수를 사용하여 요약 통계량 테이블을 작성할 수 있다.

  2. tbl_summary 함수에는 다양한 옵션이 존재하며 by 옵션을 통해 그룹별 통계량을 계산할 수 있다.

  3. tbl_strata 함수를 사용하여 여러 계층별 통계량을 계산할 수 있다.

  4. add_p() 함수를 사용하여 수행할 test를 지정하고 p-value를 추가할 수 있다. 이외에도 다양한 함수를 통해 테이블에 통계량을 추가하고 디자인을 설정할 수 있다.

  5. gtsummary 패키지로 만든 table을 워드 파일로 저장할 수 있다.

Citation

BibTeX citation:
@online{lee2022,
  author = {Lee, Yujin},
  title = {Gtsummary {패키지} {소개}},
  date = {2022-02-04},
  url = {https://blog.zarathu.com/jp/posts/2022-02-07-gtsummary},
  langid = {en}
}
For attribution, please cite this work as:
Lee, Yujin. 2022. “Gtsummary 패키지 소개.” February 4, 2022. https://blog.zarathu.com/jp/posts/2022-02-07-gtsummary.