tableone 패키지 소개

R RPACKAGE

효율적으로 의학 연구 논문에 들어갈 table1을 만들 수 있는 tableone 패키지에 대해 소개합니다.

Yujin Lee https://github.com/lyj7518
02-07-2022

시작하기 전에

본 자료는 데이터셋의 변수를 하나의 테이블로 요약하는 방법에 대해 알아볼 것이다. tableone 패키지를 이용하면 효율적으로 논문에 들어갈 table1을 만들 수 있다.

What is tableone?

tableone은 의학 연구 논문에서 볼 수 있는 table1을 구성하는 데 사용되는 패키지로, 한 테이블 내에 혼합된 범주형 변수와 연속형 변수를 모두 요약할 수 있고 사용법이 매우 간단하다는 장점이 있다.

Creating a tableone

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

## Setup

# install.packages("data.table")
# install.packages("curl")
# install.packages("tableone")

library(data.table)
library(curl)
library(tableone)
# 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)

Argument customize

CreateTableOne() 함수에는 다양한 옵션이 존재한다. 세부적인 옵션 설정을 통해 원하는 table1을 만들 수 있다. 주요 옵션은 다음과 같다.

옵션에 대한 자세한 설명은 예시를 통해 다루도록 하겠다.

Categorical variable conversion

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)

Multiple group summary

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)

Print tableone

CreateTableOne() 함수를 사용하여 테이블을 만든 후, print 명령어로 세부 옵션을 지정할 수 있다. 주요 옵션은 다음과 같다.

Showing all levels

범주형 변수에서 모든 범주의 요약값을 확인하려면 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 variables

비모수통계를 사용하는 연속형 변수에는 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

exact 옵션을 통해 fisher-test를 진행할 범주형 변수를 설정할 수 있다. 범주형 변수는 기본적으로 chisq-test가 적용되며, exact 옵션에 fisher-test를 적용할 변수를 지정하여 사용할 수 있다.

print(t2, exact=c("Q_PHX_DX_STK", "Q_PHX_DX_HTDZ"))
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 옵션을 통해 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)

Detailed information : summary()

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
                                                              

Show categorical or continuous variable only

앞에서 만든 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

Export tableone

write.csv 함수를 사용하여 table1을 csv파일로 저장할 수 있다. write.csv(x, file=“파일명”) 형식을 사용하여 csv파일로 저장한다.

# export table1
table1 <- print(t2)
write.csv(table1, file = "table1.csv")

마치며

이번 강의를 정리하자.

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

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

  3. CreateTableOne 함수를 사용하여 테이블을 만든 후, print 명령어로 세부 옵션을 지정할 수 있다.

  4. summary 함수를 쓰면 누락값을 포함한 table1의 자세한 정보를 알 수 있다.

  5. write.csv 함수를 사용하여 tableone 패키지로 만든 table을 csv파일로 저장할 수 있다.

Corrections

If you see mistakes or want to suggest changes, please create an issue on the source repository.

Reuse

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 ...".

Citation

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}
}