효율적으로 의학 연구 논문에 들어갈 table1을 만들 수 있는 tableone 패키지에 대해 소개합니다.
본 자료는 데이터셋의 변수를 하나의 테이블로 요약하는 방법에 대해 알아볼 것이다. tableone 패키지를 이용하면 효율적으로 논문에 들어갈 table1을 만들 수 있다.
tableone
은 의학 연구 논문에서 볼 수 있는 table1을 구성하는 데 사용되는 패키지로, 한 테이블 내에 혼합된 범주형 변수와 연속형 변수를 모두 요약할 수 있고 사용법이 매우 간단하다는 장점이 있다.
CreateTableOne() 함수를 사용하여 테이블을 만들 수 있다. 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)
CreateTableOne() 함수를 사용해 간단한 테이블을 만들어 보자.
# create table1
CreateTableOne(data=dt)
Overall | |
---|---|
n | 1644 |
EXMD_BZ_YYYY (mean (SD)) | 2012.08 (1.99) |
RN_INDI (mean (SD)) | 490782.25 (290056.68) |
HME_YYYYMM (mean (SD)) | 201216.18 (199.11) |
Q_PHX_DX_STK (mean (SD)) | 0.01 (0.11) |
Q_PHX_DX_HTDZ (mean (SD)) | 0.02 (0.15) |
Q_PHX_DX_HTN (mean (SD)) | 0.25 (0.43) |
Q_PHX_DX_DM (mean (SD)) | 0.07 (0.25) |
Q_PHX_DX_DLD (mean (SD)) | 0.04 (0.20) |
Q_PHX_DX_PTB (mean (SD)) | 0.03 (0.16) |
Q_HBV_AG (mean (SD)) | 2.24 (0.52) |
Q_SMK_YN (mean (SD)) | 1.63 (0.84) |
Q_DRK_FRQ_V09N (mean (SD)) | 1.03 (1.39) |
HGHT (mean (SD)) | 164.55 (9.19) |
WGHT (mean (SD)) | 65.10 (12.53) |
WSTC (mean (SD)) | 80.69 (9.55) |
BMI (mean (SD)) | 23.92 (3.38) |
VA_LT (mean (SD)) | 0.98 (0.56) |
VA_RT (mean (SD)) | 0.98 (0.56) |
BP_SYS (mean (SD)) | 122.26 (14.63) |
BP_DIA (mean (SD)) | 76.60 (10.06) |
URN_PROT (mean (SD)) | 1.08 (0.40) |
HGB (mean (SD)) | 14.11 (1.69) |
FBS (mean (SD)) | 97.23 (20.13) |
TOT_CHOL (mean (SD)) | 194.93 (36.57) |
TG (mean (SD)) | 134.90 (104.75) |
HDL (mean (SD)) | 55.90 (19.47) |
LDL (mean (SD)) | 118.69 (201.99) |
CRTN (mean (SD)) | 0.99 (1.02) |
SGOT (mean (SD)) | 25.60 (16.18) |
SGPT (mean (SD)) | 25.98 (27.18) |
GGT (mean (SD)) | 36.34 (36.43) |
GFR (mean (SD)) | 89.74 (21.71) |
CreateTableOne() 함수에는 다양한 옵션이 존재한다. 세부적인 옵션 설정을 통해 원하는 table1을 만들 수 있다. 주요 옵션은 다음과 같다.
CreateTableOne
NA
를 하나의 범주로 포함할지 여부옵션에 대한 자세한 설명은 예시를 통해 다루도록 하겠다.
factorVars 인자를 사용하여 범주형 변수를 지정할 수 있다. 이때 vars 인자를 통해 전체 데이터 셋 중 테이블에 들어갈 변수를 설정할 수 있고, 지정하지 않을 시 데이터 셋의 모든 변수가 포함된다.
# Variables
myVars <- c("HGHT", "WGHT", "BMI", "HDL", "LDL", "TG", "SGPT",
"Q_PHX_DX_STK", "Q_PHX_DX_HTDZ", "Q_HBV_AG", "Q_SMK_YN")
# Categorical variables
catVars <- c("Q_PHX_DX_STK", "Q_PHX_DX_HTDZ", "Q_HBV_AG", "Q_SMK_YN")
t1 <- CreateTableOne(vars = myVars, factorVars = catVars, data = dt)
t1
Overall | |
---|---|
n | 1644 |
HGHT (mean (SD)) | 164.55 (9.19) |
WGHT (mean (SD)) | 65.10 (12.53) |
BMI (mean (SD)) | 23.92 (3.38) |
HDL (mean (SD)) | 55.90 (19.47) |
LDL (mean (SD)) | 118.69 (201.99) |
TG (mean (SD)) | 134.90 (104.75) |
SGPT (mean (SD)) | 25.98 (27.18) |
Q_PHX_DX_STK = 1 (%) | 12 ( 1.1) |
Q_PHX_DX_HTDZ = 1 (%) | 26 ( 2.4) |
Q_HBV_AG (%) | |
1 | 77 ( 4.7) |
2 | 1102 (67.1) |
3 | 463 (28.2) |
Q_SMK_YN (%) | |
1 | 995 (60.6) |
2 | 256 (15.6) |
3 | 391 (23.8) |
범주형 변수로 설정한 컬럼의 요약값이 mean(sd)에서 n(percentage)로 바뀐 것을 볼 수 있다.
두 개의 범주가 있는 범주형 변수의 경우, 두 번째 범주의 요약값만 출력된다. 예를 들어 0과 1의 범주가 있을 때, 범주1의 개수와 백분율이 출력된다. 이는 옵션 설정을 통해 전체 범주의 요약값을 출력하도록 변경할 수 있다.
3개 이상의 범주가 있을 때에는 모든 범주의 값이 요약되며, 백분율은 누락된 값을 제외한 후 계산된다.
strata 인자를 설정하여 그룹별 연산을 할 수 있다. strata는 dplyr 패키지의 group_by() 함수와 유사하며, 그룹 연산을 할 변수를 지정하여 사용할 수 있다.
t2 <- CreateTableOne(data = dt,
vars = myVars,
strata = "Q_SMK_YN",
factorVars = catVars,
includeNA = F)
t2
1 | 2 | 3 | p | test | |
---|---|---|---|---|---|
n | 995 | 256 | 391 | ||
HGHT (mean (SD)) | 160.67 (8.34) | 168.83 (6.45) | 171.61 (7.09) | <0.001 | |
WGHT (mean (SD)) | 61.17 (11.08) | 70.09 (10.72) | 71.76 (13.07) | <0.001 | |
BMI (mean (SD)) | 23.63 (3.39) | 24.52 (2.93) | 24.27 (3.54) | <0.001 | |
HDL (mean (SD)) | 57.83 (14.08) | 53.91 (36.73) | 52.37 (13.54) | <0.001 | |
LDL (mean (SD)) | 112.26 (32.81) | 147.52 (505.27) | 116.34 (56.89) | 0.046 | |
TG (mean (SD)) | 114.05 (76.97) | 162.89 (126.51) | 169.24 (133.28) | <0.001 | |
SGPT (mean (SD)) | 23.33 (28.42) | 28.61 (20.62) | 31.00 (26.96) | <0.001 | |
Q_PHX_DX_STK = 1 (%) | 11 ( 1.8) | 1 ( 0.5) | 0 ( 0.0) | 0.051 | |
Q_PHX_DX_HTDZ = 1 (%) | 18 ( 2.9) | 5 ( 2.6) | 3 ( 1.1) | 0.287 | |
Q_HBV_AG (%) | 0.193 | ||||
1 | 40 ( 4.0) | 19 ( 7.5) | 17 ( 4.3) | ||
2 | 679 ( 68.3) | 164 ( 64.3) | 259 ( 66.2) | ||
3 | 275 ( 27.7) | 72 ( 28.2) | 115 ( 29.4) | ||
Q_SMK_YN (%) | <0.001 | ||||
1 | 995 (100.0) | 0 ( 0.0) | 0 ( 0.0) | ||
2 | 0 ( 0.0) | 256 (100.0) | 0 ( 0.0) | ||
3 | 0 ( 0.0) | 0 ( 0.0) | 391 (100.0) |
연속형 변수의 경우, 기본적으로 one-way ANOVA test가 적용되며 nonnormal일 경우 옵션 설정을 통해 Kruskal–Wallis one-way ANOVA test를 적용할 수 있다.
범주형 변수의 경우, 기본적으로 chisq-test가 적용되며 print 함수의 exact 옵션 설정을 통해 fisher-test를 적용할 수 있다.
CreateTableOne() 함수를 사용하여 테이블을 만든 후, print 명령어로 세부 옵션을 지정할 수 있다. 주요 옵션은 다음과 같다.
print
범주형 변수에서 모든 범주의 요약값을 확인하려면 ShowAllLevels 또는 cramVars 옵션을 사용한다. ShowAllLevels = T 를 설정하거나 cramVars 옵션에 원하는 변수명을 지정하여 사용할 수 있다.
print(t1, showAllLevels = T)
level | Overall | |
---|---|---|
n | 1644 | |
HGHT (mean (SD)) | 164.55 (9.19) | |
WGHT (mean (SD)) | 65.10 (12.53) | |
BMI (mean (SD)) | 23.92 (3.38) | |
HDL (mean (SD)) | 55.90 (19.47) | |
LDL (mean (SD)) | 118.69 (201.99) | |
TG (mean (SD)) | 134.90 (104.75) | |
SGPT (mean (SD)) | 25.98 (27.18) | |
Q_PHX_DX_STK (%) | 0 | 1059 (98.9) |
1 | 12 ( 1.1) | |
Q_PHX_DX_HTDZ (%) | 0 | 1052 (97.6) |
1 | 26 ( 2.4) | |
Q_HBV_AG (%) | 1 | 77 ( 4.7) |
2 | 1102 (67.1) | |
3 | 463 (28.2) | |
Q_SMK_YN (%) | 1 | 995 (60.6) |
2 | 256 (15.6) | |
3 | 391 (23.8) |
print(t1, cramVars="Q_PHX_DX_STK")
Overall | |
---|---|
n | 1644 |
HGHT (mean (SD)) | 164.55 (9.19) |
WGHT (mean (SD)) | 65.10 (12.53) |
BMI (mean (SD)) | 23.92 (3.38) |
HDL (mean (SD)) | 55.90 (19.47) |
LDL (mean (SD)) | 118.69 (201.99) |
TG (mean (SD)) | 134.90 (104.75) |
SGPT (mean (SD)) | 25.98 (27.18) |
Q_PHX_DX_STK = 0/1 (%) | 1059/12 (98.9/1.1) |
Q_PHX_DX_HTDZ = 1 (%) | 26 ( 2.4) |
Q_HBV_AG (%) | |
1 | 77 ( 4.7) |
2 | 1102 (67.1) |
3 | 463 (28.2) |
Q_SMK_YN (%) | |
1 | 995 (60.6) |
2 | 256 (15.6) |
3 | 391 (23.8) |
비모수통계를 사용하는 연속형 변수에는 nonnormal 옵션을 설정한다. nonnormal 설정 시 mean(sd)에서 median(IQR)로 요약값이 변경된다.
print(t1, nonnormal="LDL")
Overall | |
---|---|
n | 1644 |
HGHT (mean (SD)) | 164.55 (9.19) |
WGHT (mean (SD)) | 65.10 (12.53) |
BMI (mean (SD)) | 23.92 (3.38) |
HDL (mean (SD)) | 55.90 (19.47) |
LDL (median [IQR]) | 112.00 [90.00, 134.00] |
TG (mean (SD)) | 134.90 (104.75) |
SGPT (mean (SD)) | 25.98 (27.18) |
Q_PHX_DX_STK = 1 (%) | 12 ( 1.1) |
Q_PHX_DX_HTDZ = 1 (%) | 26 ( 2.4) |
Q_HBV_AG (%) | |
1 | 77 ( 4.7) |
2 | 1102 (67.1) |
3 | 463 (28.2) |
Q_SMK_YN (%) | |
1 | 995 (60.6) |
2 | 256 (15.6) |
3 | 391 (23.8) |
exact 옵션을 통해 fisher-test를 진행할 범주형 변수를 설정할 수 있다. 범주형 변수는 기본적으로 chisq-test가 적용되며, exact 옵션에 fisher-test를 적용할 변수를 지정하여 사용할 수 있다.
1 | 2 | 3 | p | test | |
---|---|---|---|---|---|
n | 995 | 256 | 391 | ||
HGHT (mean (SD)) | 160.67 (8.34) | 168.83 (6.45) | 171.61 (7.09) | <0.001 | |
WGHT (mean (SD)) | 61.17 (11.08) | 70.09 (10.72) | 71.76 (13.07) | <0.001 | |
BMI (mean (SD)) | 23.63 (3.39) | 24.52 (2.93) | 24.27 (3.54) | <0.001 | |
HDL (mean (SD)) | 57.83 (14.08) | 53.91 (36.73) | 52.37 (13.54) | <0.001 | |
LDL (mean (SD)) | 112.26 (32.81) | 147.52 (505.27) | 116.34 (56.89) | 0.046 | |
TG (mean (SD)) | 114.05 (76.97) | 162.89 (126.51) | 169.24 (133.28) | <0.001 | |
SGPT (mean (SD)) | 23.33 (28.42) | 28.61 (20.62) | 31.00 (26.96) | <0.001 | |
Q_PHX_DX_STK = 1 (%) | 11 ( 1.8) | 1 ( 0.5) | 0 ( 0.0) | 0.045 | exact |
Q_PHX_DX_HTDZ = 1 (%) | 18 ( 2.9) | 5 ( 2.6) | 3 ( 1.1) | 0.281 | exact |
Q_HBV_AG (%) | 0.193 | ||||
1 | 40 ( 4.0) | 19 ( 7.5) | 17 ( 4.3) | ||
2 | 679 ( 68.3) | 164 ( 64.3) | 259 ( 66.2) | ||
3 | 275 ( 27.7) | 72 ( 28.2) | 115 ( 29.4) | ||
Q_SMK_YN (%) | <0.001 | ||||
1 | 995 (100.0) | 0 ( 0.0) | 0 ( 0.0) | ||
2 | 0 ( 0.0) | 256 (100.0) | 0 ( 0.0) | ||
3 | 0 ( 0.0) | 0 ( 0.0) | 391 (100.0) |
smd 옵션을 통해 smd(standardized mean difference)를 table1에 포함할 수 있다. default는 FALSE이고, smd=TRUE 설정 시 각 변수의 smd 값이 출력된다.
print(t2, smd = TRUE)
1 | 2 | 3 | p | test | SMD | |
---|---|---|---|---|---|---|
n | 995 | 256 | 391 | |||
HGHT (mean (SD)) | 160.67 (8.34) | 168.83 (6.45) | 171.61 (7.09) | <0.001 | 0.972 | |
WGHT (mean (SD)) | 61.17 (11.08) | 70.09 (10.72) | 71.76 (13.07) | <0.001 | 0.611 | |
BMI (mean (SD)) | 23.63 (3.39) | 24.52 (2.93) | 24.27 (3.54) | <0.001 | 0.181 | |
HDL (mean (SD)) | 57.83 (14.08) | 53.91 (36.73) | 52.37 (13.54) | <0.001 | 0.197 | |
LDL (mean (SD)) | 112.26 (32.81) | 147.52 (505.27) | 116.34 (56.89) | 0.046 | 0.091 | |
TG (mean (SD)) | 114.05 (76.97) | 162.89 (126.51) | 169.24 (133.28) | <0.001 | 0.341 | |
SGPT (mean (SD)) | 23.33 (28.42) | 28.61 (20.62) | 31.00 (26.96) | <0.001 | 0.196 | |
Q_PHX_DX_STK = 1 (%) | 11 ( 1.8) | 1 ( 0.5) | 0 ( 0.0) | 0.051 | 0.137 | |
Q_PHX_DX_HTDZ = 1 (%) | 18 ( 2.9) | 5 ( 2.6) | 3 ( 1.1) | 0.287 | 0.084 | |
Q_HBV_AG (%) | 0.193 | 0.109 | ||||
1 | 40 ( 4.0) | 19 ( 7.5) | 17 ( 4.3) | |||
2 | 679 ( 68.3) | 164 ( 64.3) | 259 ( 66.2) | |||
3 | 275 ( 27.7) | 72 ( 28.2) | 115 ( 29.4) | |||
Q_SMK_YN (%) | <0.001 | NaN | ||||
1 | 995 (100.0) | 0 ( 0.0) | 0 ( 0.0) | |||
2 | 0 ( 0.0) | 256 (100.0) | 0 ( 0.0) | |||
3 | 0 ( 0.0) | 0 ( 0.0) | 391 (100.0) |
summary
함수를 쓰면 누락값을 포함한 table1의 자세한 정보를 알 수 있다. 연속형 변수의 값들이 먼저 출력되며 그 다음으로 범주형 변수의 요약값이 출력된다.
summary(t1)
### Summary of continuous variables ###
strata: Overall
n miss p.miss mean sd median p25 p75 min max skew kurt
HGHT 1644 0 0 165 9 165 158 171 134 188 -0.2 -0.3
WGHT 1644 0 0 65 13 64 56 73 31 118 0.7 1.0
BMI 1644 0 0 24 3 24 22 26 12 37 0.4 0.4
HDL 1644 0 0 56 19 54 46 64 23 593 13.1 352.2
LDL 1644 16 1 119 202 112 90 134 19 8100 38.0 1501.0
TG 1644 0 0 135 105 106 72 163 13 1210 3.4 20.2
SGPT 1644 0 0 26 27 20 15 30 3 779 15.0 374.4
=======================================================================================
### Summary of categorical variables ###
strata: Overall
var n miss p.miss level freq percent cum.percent
Q_PHX_DX_STK 1644 573 34.9 0 1059 98.9 98.9
1 12 1.1 100.0
Q_PHX_DX_HTDZ 1644 566 34.4 0 1052 97.6 97.6
1 26 2.4 100.0
Q_HBV_AG 1644 2 0.1 1 77 4.7 4.7
2 1102 67.1 71.8
3 463 28.2 100.0
Q_SMK_YN 1644 2 0.1 1 995 60.6 60.6
2 256 15.6 76.2
3 391 23.8 100.0
앞에서 만든 table1에서 연속형 변수와 범주형 변수를 구분하여 출력할 수 있다. “$”를 사용하여 연속형 변수는 ConTable, 범주형 변수는 CaTable을 설정하면 해당 변수를 따로 출력할 수 있다.
# Categorical variables
t2$CatTable
1 | 2 | 3 | p | test | |
---|---|---|---|---|---|
n | 995 | 256 | 391 | ||
Q_PHX_DX_STK = 1 (%) | 11 ( 1.8) | 1 ( 0.5) | 0 ( 0.0) | 0.051 | |
Q_PHX_DX_HTDZ = 1 (%) | 18 ( 2.9) | 5 ( 2.6) | 3 ( 1.1) | 0.287 | |
Q_HBV_AG (%) | 0.193 | ||||
1 | 40 ( 4.0) | 19 ( 7.5) | 17 ( 4.3) | ||
2 | 679 ( 68.3) | 164 ( 64.3) | 259 ( 66.2) | ||
3 | 275 ( 27.7) | 72 ( 28.2) | 115 ( 29.4) | ||
Q_SMK_YN (%) | <0.001 | ||||
1 | 995 (100.0) | 0 ( 0.0) | 0 ( 0.0) | ||
2 | 0 ( 0.0) | 256 (100.0) | 0 ( 0.0) | ||
3 | 0 ( 0.0) | 0 ( 0.0) | 391 (100.0) |
# Continuous variables
t2$ContTable
1 | 2 | 3 | p | test | |
---|---|---|---|---|---|
n | 995 | 256 | 391 | ||
HGHT (mean (SD)) | 160.67 (8.34) | 168.83 (6.45) | 171.61 (7.09) | <0.001 | |
WGHT (mean (SD)) | 61.17 (11.08) | 70.09 (10.72) | 71.76 (13.07) | <0.001 | |
BMI (mean (SD)) | 23.63 (3.39) | 24.52 (2.93) | 24.27 (3.54) | <0.001 | |
HDL (mean (SD)) | 57.83 (14.08) | 53.91 (36.73) | 52.37 (13.54) | <0.001 | |
LDL (mean (SD)) | 112.26 (32.81) | 147.52 (505.27) | 116.34 (56.89) | 0.046 | |
TG (mean (SD)) | 114.05 (76.97) | 162.89 (126.51) | 169.24 (133.28) | <0.001 | |
SGPT (mean (SD)) | 23.33 (28.42) | 28.61 (20.62) | 31.00 (26.96) | <0.001 |
write.csv
함수를 사용하여 table1을 csv파일로 저장할 수 있다. write.csv(x, file=“파일명”) 형식을 사용하여 csv파일로 저장한다.
이번 강의를 정리하자.
tableone 패키지의 CreateTableone
함수를 사용하여 요약 통계량 테이블을 작성할 수 있다.
CreateTableone
함수에는 다양한 옵션이 존재하며 strata 옵션을 통해 그룹별 통계량을 계산할 수 있다.
CreateTableOne
함수를 사용하여 테이블을 만든 후, print 명령어로 세부 옵션을 지정할 수 있다.
summary
함수를 쓰면 누락값을 포함한 table1의 자세한 정보를 알 수 있다.
write.csv
함수를 사용하여 tableone 패키지로 만든 table을 csv파일로 저장할 수 있다.
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. 7). Zarathu Blog: tableone 패키지 소개. Retrieved from https://blog.zarathu.com/posts/2022-02-07-tableone/
BibTeX citation
@misc{lee2022tableone, author = {Lee, Yujin}, title = {Zarathu Blog: tableone 패키지 소개}, url = {https://blog.zarathu.com/posts/2022-02-07-tableone/}, year = {2022} }