Tuyến Trần, MD
Lập trình & Phân tích

gtsummary tạo Table 1 chuẩn đăng báo trong 10 phút

gtsummary Table 1 trong R giúp bác sĩ build bảng mô tả mẫu nghiên cứu đạt chuẩn journal trong 10 phút, không cần format tay.

gtsummary Table 1 là thứ mình ước biết sớm hơn 2 năm. Trước đó mình làm bảng mô tả mẫu theo cách thủ công trong Word: tính mean, SD từng biến, chạy t-test rồi điền tay từng ô. Mất gần 2 tiếng cho một bảng, và khi dữ liệu thay đổi thì làm lại từ đầu. Với gtsummary, toàn bộ mất khoảng 10 phút lần đầu, và cập nhật tự động khi thêm bệnh nhân sau.

Bài này dành cho bạn đã biết cơ bản về dplyr. Nếu cần ôn lại các thao tác lọc và biến đổi dữ liệu, xem tidyverse cho bác sĩ: 5 hàm cơ bản trước. Còn nếu cần hiểu quy trình tổng thể từ CSV đến xuất bảng, xem quy trình R cho bài báo lâm sàng.

gtsummary làm được gì

gtsummary là gói R chuyên tạo bảng thống kê đạt chuẩn publication. Hàm chính là tbl_summary(), nhận dataframe đầu vào và tự động:

  • Phân loại biến liên tục và biến phân nhóm
  • Tính mean (SD) hoặc trung vị (IQR) tuỳ phân phối
  • Thêm giá trị p khi so sánh theo nhóm
  • Xuất Word, HTML hoặc PDF với một dòng lệnh

Reviewer hay yêu cầu trình bày theo dạng "mean (SD) cho biến phân phối chuẩn và median (IQR) cho biến phân phối lệch." gtsummary làm điều này mặc định, không cần xác định thủ công.

Bảng cơ bản trong 3 dòng

library(gtsummary)

df %>%
  select(tuoi_ngay, gioi, loai, bien_chung, theo_doi_thang) %>%
  tbl_summary()

Bảng ra với tên biến, số lượng và tỷ lệ cho biến phân nhóm, trung vị (IQR) cho biến liên tục, và số giá trị thiếu. Đủ để xem cấu trúc dữ liệu trong 10 giây.

Thêm so sánh theo nhóm và giá trị p

Table 1 thực tế thường so sánh đặc điểm theo nhóm điều trị hoặc nhóm kết quả. Với gtsummary, chỉ cần thêm byadd_p():

df %>%
  select(tuoi_ngay, gioi, loai, bien_chung, theo_doi_thang, nhom_dieu_tri) %>%
  tbl_summary(
    by = nhom_dieu_tri,
    statistic = list(
      all_continuous()  ~ "{mean} ({sd})",
      all_categorical() ~ "{n} ({p}%)"
    ),
    missing = "no"
  ) %>%
  add_p() %>%
  add_overall() %>%
  bold_labels()

add_p() tự chọn phép kiểm phù hợp: t-test cho biến liên tục phân phối chuẩn, Mann-Whitney cho phân phối lệch, chi-squared hoặc Fisher cho biến phân nhóm. Mình không cần nhớ chọn tay từng trường hợp.

Trong một bài meta-analysis đang trong quá trình phản biện của mình, bảng so sánh đặc điểm cơ bản giữa 2 phương pháp phẫu thuật ra với đoạn code gần như y chang ở trên, chỉ đổi tên cột nhóm.

Áp theme journal

gtsummary có theme sẵn cho các tạp chí lớn. Đặt theme ở đầu script, trước khi tạo bất kỳ bảng nào:

theme_gtsummary_journal("jama")

Sau lệnh này, mọi bảng trong phiên R đó đều theo định dạng JAMA: từ vị trí giá trị p đến số chữ số thập phân. Các theme khác có sẵn: "lancet", "nejm", "asa". Khi nộp bài, bảng ra khớp với hướng dẫn tác giả ngay từ đầu, không phải chỉnh lại từng ô sau.

Xử lý giá trị thiếu

Mặc định gtsummary hiển thị số giá trị thiếu (hàng "Unknown"). Bạn có thể điều chỉnh:

tbl_summary(
  missing = "always",       # luôn hiển thị hàng thiếu
  missing_text = "Thiếu số liệu"
)

# ẩn hoàn toàn nếu không muốn hiện
tbl_summary(missing = "no")

Reviewer thường hỏi về missing data. Giữ missing = "always" trong bản nộp đầu, trả lời được câu hỏi reviewer ngay trong bảng mà không cần chú thích thêm.

Xuất Word trong 1 dòng

library(flextable)

bang_1 <- df %>%
  tbl_summary(by = nhom_dieu_tri) %>%
  add_p() %>%
  add_overall() %>%
  as_flex_table()

save_as_docx(bang_1, path = "table1_submission.docx")

File Word ra với định dạng bảng có sẵn. Mình paste thẳng vào manuscript mà không cần format thêm. Đây là lý do mình bỏ hẳn cách làm bảng thủ công.

Mấy điều nên nhớ khi dùng

Cài theme journal ngay đầu script, trước khi viết bất kỳ bảng nào. Điều chỉnh sau phải chạy lại toàn bộ.

Dùng select() trước tbl_summary() để chỉ đưa vào bảng những biến thực sự cần. Biến thừa làm bảng rối và reviewer sẽ hỏi từng cái.

Gắn add_n() nếu muốn hiển thị số quan sát cho từng cột, hữu ích khi có missing data.

Nếu bạn muốn học gtsummary cùng toàn bộ quy trình R từ import đến regression và visualization cho paper lâm sàng, khóa R cho nghiên cứu y khoa đi theo đúng thứ tự này.