데이터 셋의 변수를 하나의 테이블로 요약하여 효율적으로 논문에 들어갈 table1을 만들 수 있는 gtsummary 패키지에 대해 소개합니다.
본 자료에서는 데이터 셋의 변수를 하나의 테이블로 요약하는 방법에 대해 알아볼 것이다. gtsummary 패키지를 이용하면 효율적으로 논문에 들어갈 table1을 만들 수 있다. gtsummary 패키지에 관한 기본 개념 및 함수들을 예제를 통해 다루어 보자.
tbl_summary 함수를 이용하여 연속형 및 범주형 변수에 대한 기술 통계량을 계산하고 테이블 형태로 나타낼 수 있다.
예제에 사용할 데이터를 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 함수를 사용하여 기본 테이블을 작성할 수 있다. 출력값으로 데이터 셋의 각 열에 대한 기술 통계량을 반환한다. 데이터 셋에 섞인 범주형 변수와 연속형 변수를 자동적으로 인식해 그에 맞는 값을 반환하며, 범주형 변수의 기본 출력값은 n(%)이고 연속형 변수의 기본 출력값은 median(IQR)이다. 결측값은 테이블에 Unknown으로 출력된다.
fread
를 통해 불러온 데이터에서 몇 개의 변수를 추출해 요약 테이블을 만들어보자.
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)
|
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) | 164 (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, 72) | 63 (56, 72) | 64 (57, 74) |
TOT_CHOL | 192 (170, 216) | 193 (168, 220) | 190 (168, 214) | 196 (173, 224) | 190 (168, 218) | 193 (171, 216) | 194 (171, 217) |
TG | 105 (71, 148) | 107 (70, 158) | 104 (74, 164) | 108 (69, 164) | 107 (76, 160) | 108 (75, 162) | 111 (71, 167) |
1
n (%); Median (IQR)
|
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) | 166 (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 (164, 173) | 173 (169, 177) | <0.001 |
WGHT | 212 | 59 (52, 67) | 68 (61, 74) | 71 (62, 77) | <0.001 | 236 | 60 (54, 67) | 70 (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, 76) | 72 (64, 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) | 186 (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 (176, 227) | 196 (170, 220) | 0.3 | 254 | 193 (170, 216) | 194 (174, 220) | 193 (174, 214) | >0.9 | 240 | 189 (170, 216) | 194 (170, 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, 176) | 142 (101, 230) | <0.001 | 223 | 93 (67, 129) | 129 (78, 194) | 148 (91, 200) | <0.001 | 234 | 94 (65, 133) | 130 (91, 188) | 132 (94, 200) | 0.001 | 243 | 96 (72, 140) | 105 (75, 162) | 127 (84, 217) | 0.009 | 254 | 98 (73, 140) | 118 (87, 165) | 134 (82, 202) | 0.005 | 240 | 98 (64, 145) | 125 (97, 255) | 150 (90, 248) | <0.001 |
1
n (%); Median (IQR)
2
Fisher's exact test; Kruskal-Wallis rank sum test
|
tbl_summary
함수에는 다양한 옵션이 존재하며, 이러한 옵션 조정을 통해 원하는 테이블을 작성할 수 있다. 다음은 tbl_summary
함수의 주요 옵션에 대한 설명이다.
다음은 옵션을 활용한 예시이다. 연도 변수 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)
|
gtsummary 패키지에는 add_() 함수를 이용하여 테이블에 통계 정보를 추가하는 기능이 있다. 다음은 add_() 함수들의 주요 설명이다.
add_p() 함수를 사용하여 tbl_summary
에 의해 생성된 테이블에 p-value를 추가할 수 있다. 이때 test 인자에 “t.test”, “wilcox.test”, “chisq.test”, “fisher.test”, “aov”, … 와 같이 수행할 통계 test를 지정할 수 있다. add_p(col ~ “.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, 66) | 0.051 |
TOT_CHOL | 194 (171, 218) | 163 (146, 192) | 0.035 |
TG | 108 (73, 163) | 128 (116, 148) | 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, 66) | 0.2 |
TOT_CHOL | 194 (171, 218) | 163 (146, 192) | 0.022 |
TG | 108 (73, 163) | 128 (116, 148) | 0.10 |
1
n (%); Median (IQR)
2
Fisher's exact test; Wilcoxon rank sum 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, 66) | 0.2 |
TOT_CHOL | 194 (171, 218) | 163 (146, 192) | 0.022 |
TG | 108 (73, 163) | 128 (116, 148) | 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, 66) | 0.2 |
TOT_CHOL | 194 (171, 218) | 163 (146, 192) | 0.022 |
TG | 108 (73, 163) | 128 (116, 148) | 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) | 164 (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, 72) | 63 (56, 72) | 64 (57, 74) | 0.8 | >0.9 |
TOT_CHOL | 1,644 | 193 (170, 218) | 192 (170, 216) | 193 (168, 220) | 190 (168, 214) | 196 (173, 224) | 190 (168, 218) | 193 (171, 216) | 194 (171, 217) | 0.7 | >0.9 |
TG | 1,644 | 106 (72, 163) | 105 (71, 148) | 107 (70, 158) | 104 (74, 164) | 108 (69, 164) | 107 (76, 160) | 108 (75, 162) | 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
|
이번에는 두 그룹 간의 차이를 비교해보자.
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, 66) | 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, 148) | 0.5 | -12 | -50, 26 |
1
n (%); Median (IQR)
2
Welch Two Sample t-test
3
CI = Confidence Interval
|
gtsummary 패키지에는 테이블의 형식을 지정하는 함수 또한 존재한다. 다음과 같은 함수들을 사용하여 테이블의 디자인 및 형식을 설정할 수 있다.
위의 함수들을 사용하여 테이블의 디자인을 설정해보자.
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()
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) | 164 (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, 72) | 63 (56, 72) | 64 (57, 74) | 0.8 |
TOT_CHOL | 1,644 | 192 (170, 216) | 193 (168, 220) | 190 (168, 214) | 196 (173, 224) | 190 (168, 218) | 193 (171, 216) | 194 (171, 217) | 0.7 |
TG | 1,644 | 105 (71, 148) | 107 (70, 158) | 104 (74, 164) | 108 (69, 164) | 107 (76, 160) | 108 (75, 162) | 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
|
연속형 변수의 통계량은 여러 줄로 요약될 수 있다. 여러 줄에 걸쳐 연속형 변수의 요약값을 출력할 때에는 변수 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) | 164 (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, 72) | 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) | 192 (170, 216) | 193 (168, 220) | 190 (168, 214) | 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, 148) | 107 (70, 158) | 104 (74, 164) | 108 (69, 164) | 107 (76, 160) | 108 (75, 162) | 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
|
gtsummary
패키지를 이용해 만든 table을 flextable 객체로 바꾼 후 워드 파일로 저장할 수 있다.
MyTbl %>%
as_flex_table() %>%
flextable::save_as_docx(MyTbl, path = "/cloud/project/table.docx")
이번 강의를 정리하자.
gtsummary 패키지의 tbl_summary
함수를 사용하여 요약 통계량 테이블을 작성할 수 있다.
tbl_summary
함수에는 다양한 옵션이 존재하며 by 옵션을 통해 그룹별 통계량을 계산할 수 있다.
tbl_strata
함수를 사용하여 여러 계층별 통계량을 계산할 수 있다.
add_p()
함수를 사용하여 수행할 test를 지정하고 p-value를 추가할 수 있다. 이외에도 다양한 함수를 통해 테이블에 통계량을 추가하고 디자인을 설정할 수 있다.
gtsummary 패키지로 만든 table을 워드 파일로 저장할 수 있다.
If you see mistakes or want to suggest changes, please create an issue on the source repository.
Text and figures are licensed under Creative Commons Attribution CC BY 4.0. Source code is available at https://github.com/zarathucorp/blog, unless otherwise noted. The figures that have been reused from other sources don't fall under this license and can be recognized by a note in their caption: "Figure from ...".
For attribution, please cite this work as
Lee (2022, Feb. 4). Zarathu Blog: gtsummary 패키지 소개. Retrieved from https://blog.zarathu.com/posts/2022-02-07-gtsummary/
BibTeX citation
@misc{lee2022gtsummary, author = {Lee, Yujin}, title = {Zarathu Blog: gtsummary 패키지 소개}, url = {https://blog.zarathu.com/posts/2022-02-07-gtsummary/}, year = {2022} }