digits: 숫자는는 소수점 몇째 자리까지 출력?
이번 포스팅에서는 테이블 만들기의 끝판왕인 gtsummary 를 활용하여 기초통계 테이블을 만드는 코드를 공유하도록 하겠습니다.

gtsummary 의 tbl_summary 은 다른 테이블 형식에 비해 자유도가 높습니다.
자유도가 높다는 것은 출력되는 형식을 원하는 형식으로 쉽게 바꿀 수 있다는 뜻입니다.
우선 gtsummary 패키지를 불러오도록 하겠습니다.
# install.packages('gtsummary') # 패키지 설치
library(gtsummary) # 패키지 불러오기 data(trial) # trial 데이터 불러오기
gtsummary 의 tbl_summary 기능을 소개하기 위해 trial 데이터셋을 사용하도록 하겠습니다. trial 데이터셋은 gtsummary 패키지 안에 내장되어 있습니다.

trial 데이터셋은 약물 A 또는 약물 B를 처방받은 200명의 환자들에 대한 데이터로 구성되어 있습니다.
변수에 대한 정보는 아래와 같습니다.
trt: 약물 종류 ( Drug A or Drug B)
age: 나이
marker: marker 레벨(ng/mL)
stage: T stage
grade: 등급
death: 사망 여부
ttdeath: 사망 또는 관찰 종료까지의 시간(단위: 월)
이제 gtsummary의 tbl_summary의 파라미터들을 살펴보겠습니다.
tbl_summary의 파라미터는 다음과 같습니다.
tbl_summary(data, # 사용할 데이터명
by, # 하위그룹 변수명
include, # table 만들기 위해 사용할 변수
statistic, # 변수형태별 결과값 출력 방식
type, # 변수유형 (e.g, 연속형 변수, 범주형 변수, 이분형 변수)
digits, # 변수타입별 소수점 자리수
label, # 변수별 테이블에 나타낼 이름 지정
missing # 결측치 표시 여부: T/F
)
각 파라미터별로 하나씩 살펴보며 테이블 만드는 방법에 대해 말씀드리겠습니다.
1. by: 하위그룹 선택하기
가장 먼저 by에는 하위 그룹으로 사용할 변수명을 넣습니다.
관심있는 변수를 넣어 집단별로 값이 어떻게 다르게 나타나는지 비교할 수 있습니다.
예시에서는 약물에 따른 환자의 정보를 비교하기 위해서 trt 변수를 넣어주겠습니다.
tbl_summary( data=trial, # 데이터 by=trt # 하위그룹 변수 )
table의 변수명을 그대로 넣어줍니다. 'age'처럼 문자열로 넣어주지 않습니다.
2. include: 테이블에 넣을 변수 선택하기
다음으로 include 에는 테이블에 넣고 싶은 변수들을 입력합니다.
만약 모든 변수들을 테이블로 만들 거라면 include 는 사용하지 않으셔도 됩니다.
tbl_summary( ... include=c(age, marker, stage, grade) # 테이블에 넣을 변수 선택 )
by 와 마찬가지로 table의 변수명을 그대로 넣어줍니다. 'age'처럼 문자열로 넣어주지 않습니다.
3. statistic: 어떤 형태로 변수를 출력할 것인가?
statistic 은 변수의 유형별로 어떻게 출력할지 정해주는 인자입니다.
statistic 인자는 아래와 같이 입력해주어야 합니다.
tbl_summary( ...
statistic=list(
all_continuous() ~ "{mean} ± {sd}" # 모든 연속형 변수 ~ 평균±표준편차
all_categorical() ~ "{p}" # 모든 범주형 변수 ~ 응답퍼센트
)
)
모든 연속형 변수는 "평균 ± 표준편차"로, 모든 범주형 변수는 "퍼센트"로만 출력하라는 뜻입니다.

이 때 주의해야 할 것이 있습니다.
출력 방식을 입력할 때는 꼭 { } 안에 입력해야 한다는 것입니다.
평균과 표준편차, 퍼센트 이외에 median(중앙값), var(분산), 최솟값 (min), 최댓값(max) 등도 입력할 수 있습니다.
4. digits: 출력할 소숫점 자리수
tbl_summary( # ...
digits = list(all_continuous ~ 1, all_categorical ~ 1) )
digits 에는 변수 유형별로 출력할 소수점 자리수를 정해줄 수 있습니다.
모든 연속형 변수들은 소수점 1자리까지, 모든 범주형 변수들도 소수점 1자리까지 출력합니다.
statistic 인자와 동일한 형태입니다.

5. label: 테이블에 출력될 변수 이름 지정해주기
테이블 결과를 출력한 뒤에는 엑셀이나 워드에서 변수명을 수정해줘야 하는 번거로움이 생기게 됩니다.
정말 고맙게도 tbl_summary 에서는 출력될 테이블의 변수명을 미리 수정할 수 있습니다.
tbl_summary( #..
label = list(
age ~ 'Patient Age',
grade ~ 'Current Grade')
)
label 인자에는 테이블에서 변수별로 출력할 이름을 지정해줍니다.
이 때 입력하는 순서는 1. 변수명, 2. 테이블에 출력할 문자열 입니다.

missing: 결측치를 표기할 것인가?
tbl_summary( #..
missing = "no" # ifany, always, no,
missing_text = "NA"
)
missing 은 테이블에 결측치 값의 표기여부를 선택해줍니다.
missing 인자에는 다음의 값들을 줄 수 있습니다.
- no: 결측치 출력 안함,
- ifany: 결측치 있는 경우만 출력
- always: 항상 출력
만약 missing 값이 no가 아닌 경우 아래처럼 unknown 항목이 결과에 출력됩니다.

데이터에 결측치가 있는 경우 missing_text 인자에 값을 주어 'Unknown' 대신 다른 값을 출력할 수 있습니다.
add_p( ), add_overall( ): p-value, 전체 데이터값 추가하기
baseline table에서 빠질 수 없는 것이 있는데요, 바로 그룹별로 통계적인 차이가 유의미한지 확인해주는 p-value와 전체 데이터에 대한 통계값입니다.
tbl_summary( ... ) %>%
add_p(pvalue_fun = ~ style_pvalue(.x, digits=3) # 소숫점 3자리
test = list(all_continuous() ~ 't.test', # 연속형: t.test
all_categorical() ~ 'chisq.test') # 범주형: chisq test
) %>%
add_overall() # 테이블에 전체 통계 열 (column) 추가
tbl_summary의 인자에 모두 값을 추가해준 뒤, add_p와 add_overall을 추가해주시면 됩니다.
add_p에는 p value의 소수점을 지정해주거나 p value 테스트를 위한 방법을 변경해줄 수 있습니다. test의 경우, 연속형은 기본값으로 wilcoxn rank sum test, categorical은 기본값으로 chi-square test입니다.
만약 by에서 지정해준 하위 그룹이 두 가지가 아니라 세 가지 이상인 경우에는 'anova'를 선택하면 됩니다.
add_overall은 테이블에 전체 데이터의 통계값을 추가해줍니다.
기타: 테이블의 헤더, 폰트 변경
지금까지 테이블에 p value와 overall 열까지 추가하였습니다. 그 결과는 다음과 같습니다.

테이블의 헤더 또한 사용자가 원하는대로 변경할 수 있습니다.
우선 테이블의 이름을 확인해봅시다.
tbl_summary로 출력되는 테이블의 이름은 show_header_names() 로 확인할 수 있습니다.
tbl_summary() %>%
add_p() %>%
add_overall() %>%
show_header_names() # 출력되는 테이블 열의 이름 확인
show_header_name()을 사용 시, 테이블은 출력되지 않고 아래의 결과가 콘솔에 출력됩니다.

show_header_names() 를 통해 테이블 명을 확인했으니, 원하는대로 이름을 바꿔보겠습니다.
tbl_summary() %>%
add_overall() %>% # show_header_names()
modify_header(label='**Variable**',
stat_0 = paste("**Overall**", "n=200", collapse = "\n"),
stat_1 = paste("**Drug A**", "n=98", collapse = "\n"),
stat_2 = paste("**Drug B**", "n=102", collapse="\n"),
p.value = "*P* value")
gtsummary는 기본적으로 마크다운의 문법을 따르고 있습니다. 그래서 **을 통해 볼드체로, *을 통해 글자를 기울게 만들 수 있습니다.

테이블의 헤더가 다음과 같이 변경되었습니다.
tbl_summary() %>%
add_overall() %>% # show_header_names()
modify_header(
label='**Variable**',
stat_0 = paste("**Overall**", "n=200", collapse = "\n"),
stat_1 = paste("**Drug A**", "n=98", collapse = "\n"),
stat_2 = paste("**Drug B**", "n=102", collapse="\n"),
p.value = "*P* value"
) %>%
as_gt() %>%
tab_options(table.font.name = 'Times New Roman')
다음으로 table의 폰트를 변경해보도록 하겠습니다.
tbl_summary()를 통해 만들어지는 테이블은 gtsummary type 입니다. 폰트를 변경해주기 위해선 as_gt()를 통해 gt 형식으로 변경을 해주어야 합니다.
그 이후 tab options에서 font.name을 지정해주면 됩니다.
gtsummary 의 tab_summary( ) 에 대해 궁금하신 점은 댓글로 남겨주세요.
감사합니다.
'R > Tables' 카테고리의 다른 글
[r] gtsummary 다중회귀분석 테이블 만들기 (0) | 2022.04.28 |
---|---|
[R] tableone 으로 기초통계테이블 만들기 (0) | 2022.04.25 |
[R table] gtsummary로 회귀분석 테이블 만들기 (0) | 2022.04.20 |
댓글