Một dự án phân tích R được tổ chức tốt có ba đặc điểm: dữ liệu gốc không bị sửa, mã chạy lại được từ đầu đến cuối, và mọi bảng, hình trong luận văn đều truy được về một tệp lệnh cụ thể. Để đạt điều đó, bạn cần một cấu trúc thư mục nhất quán, đường dẫn tương đối và bản ghi phiên bản các gói đã dùng.

Bài viết hướng dẫn cách sắp xếp thư mục theo vai trò, quy tắc xử lý dữ liệu đầu vào, cách ghi lại môi trường R và cách lưu kết quả để giảng viên có thể kiểm tra. Ví dụ minh họa dựa trên một đề tài khảo sát giả định, kèm các lỗi hay gặp để bạn tự rà soát trước khi gửi bản thảo.

Tóm tắt nhanh: mở mọi thứ qua một RStudio Project, tách dữ liệu gốc khỏi dữ liệu đã xử lý, đánh số script theo thứ tự chạy.

Khóa phiên bản gói bằng renv và xuất bảng, hình bằng lệnh thay vì sao chép thủ công từ cửa sổ Console.

Vì sao luận văn cần một dự án phân tích R rõ ràng?

Nhiều học viên bắt đầu với một tệp script duy nhất, đặt ngoài màn hình desktop và sửa dần trong nhiều tháng. Đến khi giảng viên hỏi vì sao cỡ mẫu ở chương 3 khác chương 4, rất khó lần lại bước nào đã loại quan sát. Tổ chức theo dự án giúp tách bạch dữ liệu, mã và kết quả, nên mỗi con số đều có nguồn gốc rõ ràng.

Trong RStudio, đơn vị làm việc nên là một RStudio Project, tức một thư mục có tệp đuôi .Rproj ở gốc. Khi mở tệp này, thư mục làm việc tự động trỏ về gốc dự án nên bạn không cần lệnh setwd() với đường dẫn tuyệt đối. Cách làm này cũng được khuyến nghị trong cuốn R for Data Science, ở phần bàn về quy trình làm việc.

Cấu trúc thư mục cho dự án phân tích R

Không có chuẩn bắt buộc, nhưng cấu trúc nên phản ánh dòng chảy của dữ liệu: đi vào, được xử lý, rồi trở thành bảng và hình. Bảng dưới đây là gợi ý đủ dùng cho một luận văn có một bộ dữ liệu khảo sát; bạn có thể đổi tên thư mục, miễn là giữ logic phân tách.

Thư mụcChứa gìQuy tắc
data/rawTệp gốc tải từ Google Forms hoặc Excel nhận từ đơn vịChỉ đọc, tuyệt đối không ghi đè
data/processedDữ liệu đã làm sạch, dạng .rds hoặc .csvChỉ được tạo ra bằng script
RCác script đánh số theo thứ tự chạyMỗi tệp đảm nhận một nhiệm vụ
output/tablesBảng kết quả để chèn vào WordCó thể xóa và tạo lại bất cứ lúc nào
output/figuresBiểu đồ định dạng .png hoặc .pdfCố định kích thước và độ phân giải
docsBảng mã hóa biến, nhật ký xử lý, ghi chú nguồnCập nhật mỗi khi đổi quyết định
reportsTệp Quarto hoặc R Markdown tổng hợpKhông chứa thông tin định danh

Đặt tên script theo thứ tự chạy

Đánh số ở đầu tên tệp giúp người khác biết nên chạy tệp nào trước. Ví dụ minh họa: 01-nhap-du-lieu.R, 02-lam-sach.R, 03-mo-ta.R, 04-hoi-quy.R và 99-ham-dung-chung.R cho các hàm tự viết. Tên tệp nên viết thường, không dấu, không khoảng trắng để tránh lỗi khi mở trên hệ điều hành khác.

Tệp chạy toàn bộ dự án

Khi dự án có từ bốn script trở lên, hãy tạo thêm tệp run-all.R gọi lần lượt từng script bằng hàm source(). Chỉ cần chạy tệp này trong một phiên R mới là toàn bộ kết quả được tạo lại. Nếu muốn quản lý phụ thuộc chặt hơn, gói targets cho phép khai báo bước nào cần bước nào và chỉ chạy lại phần đã thay đổi.

Quản lý dữ liệu đầu vào

Nguyên tắc quan trọng nhất là dữ liệu gốc phải được giữ nguyên trạng. Mọi thao tác như đổi tên cột, loại phiếu không hợp lệ hay mã hóa lại thang đo đều nằm trong script, không thực hiện bằng tay trên Excel. Nhờ vậy, khi phát hiện sai sót, bạn sửa một dòng lệnh rồi chạy lại thay vì cố nhớ đã chỉnh ô nào.

Đọc dữ liệu bằng đường dẫn tương đối

Gói here tạo đường dẫn tính từ gốc dự án, bạn chỉ cần truyền tên thư mục con và tên tệp cho hàm here(). Kết hợp với readr::read_csv() hoặc readxl::read_excel(), mã sẽ chạy được trên máy giảng viên mà không phải sửa ký tự ổ đĩa hay tên người dùng. Hãy ghi ngày nhận dữ liệu và nguồn cung cấp vào tệp ghi chú trong thư mục docs.

Tài liệu đi kèm dữ liệu

Dữ liệu chỉ có ý nghĩa khi người đọc hiểu từng cột đại diện cho điều gì. Thư mục docs nên có tối thiểu các tài liệu sau:

  • Bảng mã hóa biến (codebook): tên biến, nội dung câu hỏi, thang đo và miền giá trị hợp lệ.
  • Nhật ký xử lý: ngày, quyết định, lý do, số quan sát trước và sau mỗi bước.
  • Thông tin nguồn: đơn vị cung cấp, điều kiện sử dụng, giấy phép nếu là dữ liệu thứ cấp.
  • Ghi chú đạo đức: cách ẩn danh và nơi cất giữ tệp còn thông tin định danh.

Phần ẩn danh và lưu trữ được phân tích kỹ trong bài đạo đức khi lưu trữ dữ liệu nghiên cứu. Các thao tác kiểm tra kiểu biến, xử lý giá trị thiếu và bản ghi trùng có trong hướng dẫn quy trình làm sạch dữ liệu với R.

Ghi lại môi trường và thư viện

Cùng một đoạn mã có thể cho kết quả khác nhau nếu phiên bản gói thay đổi, chẳng hạn khi một hàm đổi giá trị mặc định. Vì vậy, chương phương pháp nên ghi phiên bản R, còn dự án nên lưu danh sách gói kèm phiên bản. Trang The R Project cung cấp thông tin các bản phát hành và cách trích dẫn R trong tài liệu học thuật.

Dùng renv để khóa phiên bản gói

Gói renv tạo một thư viện riêng cho từng dự án, tránh xung đột khi máy bạn có nhiều đề tài dùng phiên bản gói khác nhau. Quy trình cơ bản gồm bốn bước:

  1. Gọi renv::init() một lần khi khởi tạo dự án để tạo thư viện riêng.
  2. Cài gói như bình thường, sau đó gọi renv::snapshot() để ghi danh sách vào tệp renv.lock.
  3. Khi chuyển sang máy khác, mở dự án và gọi renv::restore() để cài đúng các phiên bản đã ghi.
  4. Gọi lại renv::snapshot() mỗi khi thêm mới hoặc nâng cấp một gói.

Lưu thông tin phiên làm việc

Bên cạnh renv.lock, hãy ghi kết quả của sessionInfo() ra một tệp văn bản trong thư mục output sau mỗi lần chạy toàn bộ. Tệp này cho biết hệ điều hành, phiên bản R và các gói đang được nạp. Khi viết chương phương pháp, bạn lấy thông tin từ đây để ghi chính xác thay vì nhớ phiên bản một cách áng chừng.

Kinh nghiệm từ Luận Văn 360: khi rà soát dự án do học viên gửi, lỗi chúng tôi gặp nhiều nhất là script chỉ chạy được trên máy tác giả, do dùng đường dẫn tuyệt đối hoặc gọi một đối tượng còn sót trong bộ nhớ.

Cách kiểm tra rất đơn giản: khởi động lại R, xóa sạch môi trường rồi chạy run-all.R. Script dừng ở đâu, đó là chỗ cần sửa trước khi gửi cho bất kỳ ai.

Nếu bạn muốn có người đọc lại cấu trúc thư mục và chạy thử mã trên một máy độc lập, dịch vụ hỗ trợ phân tích dữ liệu bằng R của Luận Văn 360 có thể góp ý theo từng hạng mục. Bạn nhận góp ý cụ thể để tự chỉnh sửa, còn mọi quyết định phân tích vẫn thuộc về bạn.

Lưu kết quả tái lập cho luận văn

Trong một dự án phân tích R, kết quả tái lập là kết quả được tạo ra bằng lệnh, không phải sao chép thủ công từ Console sang Word. Mỗi bảng trong chương kết quả nên tương ứng với một tệp trong output/tables, mỗi hình tương ứng với một tệp trong output/figures. Khi dữ liệu thay đổi, bạn chỉ cần chạy lại là toàn bộ bảng, hình được cập nhật theo.

Bảng, hình và đối tượng trung gian

Mỗi loại đầu ra có cách lưu phù hợp riêng:

  • Biểu đồ: lưu bằng ggsave() với chiều rộng, chiều cao và độ phân giải cố định, ví dụ 300 dpi cho bản in.
  • Bảng: xuất bằng readr::write_csv(), hoặc dùng gói flextable, gt để có định dạng gần với bảng Word.
  • Mô hình đã ước lượng: lưu bằng saveRDS() để đọc lại mà không phải chạy lại các bước tốn thời gian.
  • Bước có yếu tố ngẫu nhiên như bootstrap hay chia mẫu: đặt set.seed() ở đầu script và ghi số seed vào nhật ký.

Báo cáo động bằng Quarto

Nếu đã quen với Markdown, bạn có thể dùng Quarto hoặc R Markdown để viết chữ và chèn kết quả trong cùng một tệp. Con số trong câu văn được lấy trực tiếp từ đối tượng R, nhờ đó tránh lỗi gõ nhầm hệ số. Với luận văn trình bày bằng Word theo mẫu của trường, báo cáo động phù hợp làm phụ lục kỹ thuật hơn là bản chính.

Lỗi thường gặp khi tổ chức dự án

Ghi đè dữ liệu gốc

Lưu tệp đã làm sạch trùng tên với tệp gốc khiến bạn mất khả năng quay lại điểm xuất phát. Hãy đặt quyền chỉ đọc cho thư mục data/raw và luôn lưu dữ liệu đã xử lý ở thư mục riêng, kèm hậu tố thể hiện giai đoạn trong tên tệp.

Script quá dài và phụ thuộc bộ nhớ

Một tệp hàng nghìn dòng vừa nhập, vừa làm sạch, vừa chạy mô hình rất khó gỡ lỗi. Hãy tách theo nhiệm vụ, để mỗi script đọc đầu vào từ ổ đĩa và ghi đầu ra xuống ổ đĩa, thay vì dựa vào đối tượng tạo ra từ lần chạy trước.

Kết luận

Một dự án phân tích R hiệu quả không cần phức tạp: thư mục theo vai trò, dữ liệu gốc chỉ đọc, đường dẫn tương đối, tệp renv.lock cho thư viện và kết quả xuất ra bằng lệnh. Trước mỗi lần gửi bản thảo cho giảng viên, hãy khởi động lại R và chạy toàn bộ từ đầu để chắc chắn mọi con số khớp nhau.

Bước tiếp theo, bạn có thể đọc checklist chia sẻ mã phân tích R có thể tái lập để chuẩn bị nộp mã kèm luận văn. Khi cần một lượt rà soát độc lập trước hạn nộp, hãy tìm hiểu dịch vụ phân tích dữ liệu bằng R của Luận Văn 360.