Tuyen Tran, MD
Lập trình & Phân tích

Bắt đầu R từ con số 0 cho bác sĩ: không cần biết code

Mình sợ R suốt 3 năm trước khi nhận ra mình chỉ cần 5 hàm cơ bản, không phải full programmer. Đây là 3 thao tác đầu tiên đủ chạy descriptive cho paper.

Học R cho bác sĩ thường bị chặn bởi một niềm tin sai: phải biết "code" trước. Mình đã sợ R 3 năm vì niềm tin đó. Khi cuối cùng phải mở RStudio để chạy phân tích cho cohort ARM ở Nhi Đồng 2, mình nhận ra R không phải ngôn ngữ lập trình theo nghĩa đầy đủ. Với bác sĩ lâm sàng, R là một máy tính có ô nhớ. Bạn đánh tên bộ data, R trả kết quả.

Bài này show 3 thao tác đầu tiên đủ để chạy descriptive analysis cho 1 paper retrospective. Không cần học loop, không cần học function, không cần hiểu data structure abstract. Mở RStudio, paste, sửa tên cột, chạy.

Thao tác 1: Đọc data từ Excel hoặc CSV

Một dòng:

data <- read.csv("arm_cohort.csv")

Hoặc nếu file Excel:

library(readxl)
data <- read_excel("arm_cohort.xlsx")

data là tên ô nhớ R lưu bộ data của bạn. Sau dòng này, bạn gõ data rồi Enter, R show toàn bộ. Gõ head(data) chỉ show 6 dòng đầu để check format.

Kinh nghiệm thực: file Excel của bác sĩ VN thường có header tiếng Việt có dấu hoặc cột merge. R không thích cả hai. Trước khi load, mở Excel, đổi header sang không dấu (e.g., "Tuoi", "Gioi", "Outcome"), unmerge tất cả cell, save lại. 5 phút prep này tiết kiệm 1 tiếng debug.

Thao tác 2: Descriptive 1 lệnh

Mục tiêu: Bảng 1 cho paper. Tuổi trung bình, giới tính, tỷ lệ outcome.

Cách đơn giản nhất với người mới:

summary(data)

Kết quả: mean, median, min, max cho cột số; count cho cột chữ. Đủ để viết "median age 4.5 years (IQR 2-7)" trong Methods.

Nếu bạn muốn Bảng 1 publication-ready chia theo nhóm (ví dụ: chia theo outcome có/không), package gtsummary làm trong 3 dòng:

library(gtsummary)
data %>% tbl_summary(by = outcome)

Output đẹp ngay. Mình dùng đúng đoạn này cho Bảng 1 paper chẩn đoán bằng siêu âm của mình (đã đăng JPS 2026). Không phải tự gõ lại từng số.

Thao tác 3: Plot phân bố

library(ggplot2)
ggplot(data, aes(x = age)) + geom_histogram()

Một plot phân bố tuổi. Sửa age thành tên cột khác, bạn được plot khác. Để plot box theo nhóm:

ggplot(data, aes(x = outcome, y = age)) + geom_boxplot()

Đây là 80% figure descriptive bạn cần cho Methods và supplementary. Reviewer Q1 thường yêu cầu figure rõ ràng, nhãn đầy đủ. ggplot làm được tất cả với 5-10 dòng.

Workflow thực: paste, sửa, chạy

Khi mới bắt đầu, mình KHÔNG gõ R từ đầu. Mình mở 3 thứ song song:

  1. RStudio (chỗ chạy code)
  2. File Excel data
  3. Tab Google search "ggplot histogram by group r" hoặc tương tự

Tìm code mẫu, paste vào RStudio, sửa tên cột thành tên cột của mình, chạy. Sửa tới khi không lỗi. Đó là cách bác sĩ học R hợp lý nhất, không phải đọc Tidyverse textbook 400 trang.

Sau 2-3 tuần lặp đi lặp lại, bạn thuộc 5-7 hàm phổ biến: read.csv, summary, tbl_summary, ggplot + geom_histogram/boxplot, t.test, chisq.test, lm. Đó là toàn bộ R cần thiết cho 80% paper lâm sàng.

Khi nào không nên học R

Nếu bạn đang publish 1-2 paper retrospective một năm và SPSS đủ, đừng chuyển. Mình đã viết một bài riêng giải thích khi nào SPSS đủ và khi nào nên đổi sang R. Đọc trước khi quyết định bỏ 30-40 giờ tự học.

Bước tiếp theo nếu đã quyết học

Mở RStudio (free, download từ posit.co). Tải data của bạn về, đổi header tiếng Việt sang không dấu. Paste 3 đoạn code trên. Sửa tên cột. Chạy. Đó là Day 1.

Day 2-7 lặp lại với data thật của bạn, không tutorial dataset như mtcars hay iris. R chỉ stick lại nếu bạn dùng cho project thật.


Lộ trình R 8 tuần dành cho bác sĩ chưa biết code (30 phút mỗi ngày): khoá R-stats trên tuyentranmd.com đi từ install RStudio đến chạy logistic regression cho paper. Mỗi bài có data lâm sàng VN thật, không phải iris dataset.