Khi học R, hầu hết mọi người tập trung vào các hàm, mô hình và trực quan hóa. Tuy nhiên, nhiều vấn đề thực tế bắt đầu sớm hơn rất nhiều — ở giai đoạn nhập dữ liệu — và kết thúc muộn hơn — ở việc xuất kết quả.
Nếu dữ liệu bị đọc sai, không phương pháp thống kê nào có thể cứu vãn được phân tích.
Trong bài viết này, chúng ta tập trung vào logic của việc nhập và xuất dữ liệu trong R, sử dụng tệp CSV và Excel. Thay vì học vẹt các hàm, chúng ta sẽ xây dựng một mô hình tư duy về cách R tương tác với tệp tin.
Tại sao nhập xuất dữ liệu lại quan trọng
Phân tích dữ liệu là một quy trình làm việc:
1Nguồn dữ liệu → Nhập → Phân tích → Kết quả → Xuất → Chia sẻLỗi thường xảy ra ngay tại giai đoạn nhập:
- Sai ký tự phân tách (delimiter).
- Sai dấu thập phân.
- Sai đường dẫn tệp.
- Ép kiểu dữ liệu thầm lặng.
Hậu quả? Một mô hình chạy hoàn hảo — nhưng trên dữ liệu sai.
CSV so với Excel: Không phải sự cạnh tranh
Trước khi chạm vào R, chúng ta nên làm rõ sự khác biệt giữa hai định dạng tệp.
Tệp CSV
- Là tệp văn bản thuần túy.
- Nhẹ, nhanh.
- Được hỗ trợ phổ biến.
- Chỉ chứa một bảng dữ liệu trên một tệp.
- Không có định dạng, chỉ có dữ liệu.
Ví dụ:
1total_bill,tip,sex
216.99,1.01,FemaleTệp Excel
- Định dạng nhị phân (.xlsx).
- Có thể chứa nhiều trang tính (sheet).
- Lưu trữ cấu trúc và trình bày cùng một chỗ.
- Phổ biến cho báo cáo và chia sẻ.

Tư duy cốt lõi: CSV là định dạng vận chuyển dữ liệu. Excel là định dạng giao tiếp và trình bày.
Thư mục làm việc: Nơi R thực sự tìm kiếm
Một trong những lỗi phổ biến nhất của người mới không liên quan đến cú pháp R.
R không quét toàn bộ máy tính để tìm tệp. Nó chỉ nhìn vào thư mục làm việc (working directory) của mình.
1getwd()Lệnh này cho biết R đang nhìn ở đâu.
Nếu tệp tồn tại trên máy tính nhưng nằm ngoài thư mục này, R xử lý như thể tệp đó không tồn tại. Đó là lý do các lỗi như:
1cannot open the connectionthường chỉ ra vấn đề về đường dẫn, chứ không phải lỗi code.
Bộ dữ liệu ví dụ: tips
Trong suốt bài viết, chúng ta sử dụng một bộ dữ liệu duy nhất: tips.
- Dữ liệu tiền bo bếp tại nhà hàng.
- Nhỏ, dễ hiểu.
- Chứa cả biến số định lượng và định tính.
- Lý tưởng để trình diễn logic nhập/xuất.
Nguồn dữ liệu: https://raw.githubusercontent.com/mwaskom/seaborn-data/master/tips.csv
Đọc tệp CSV: Logic cốt lõi
Khi R đọc tệp CSV, nó cần câu trả lời cho bốn câu hỏi:
- Cột được phân tách như thế nào?
- Dòng đầu tiên có phải tiêu đề không?
- Dấu thập phân là gì?
- Văn bản nên được hiểu như thế nào?
Các câu trả lời này được cung cấp thông qua tham số hàm.
read.table(): Nền tảng
Tất cả các hàm đọc CSV trong R cơ bản (base R) đều xây dựng dựa trên read.table().
1tips <- read.table(
2 file = "tips.csv",
3 header = TRUE,
4 sep = ",",
5 dec = ".",
6 stringsAsFactors = FALSE
7)Hiểu được hàm này đồng nghĩa với hiểu được nhập CSV trong R.
read.csv() và các giả định của nó
read.csv() chỉ là một tiện ích (shortcut) cho trường hợp phổ biến:
- Cột phân tách bằng dấu phẩy.
- Dấu thập phân là chấm.
1tips <- read.csv("tips.csv")Hàm này hoạt động hoàn hảo — nếu các giả định khớp với tệp.
Phần nguy hiểm? R có thể không báo lỗi ngay cả khi giả định sai.
Những lỗi nguy hiểm nhất là những lỗi thầm lặng.
read.csv2() và sự khác biệt theo khu vực
Trong nhiều tập dữ liệu Châu Âu:
- Cột phân tách bằng dấu chấm phẩy.
- Thập phân dùng dấu phẩy.
1total_bill;tip;sex
216,99;1,01;FemaleĐối với cấu trúc này, read.csv2() được thiết kế riêng.
1tips2 <- read.csv2("tips_semicolon.csv")Lưu ý quan trọng: Ngay cả khi thập phân dùng chấm, read.csv2() vẫn có thể chạy được trong một số trường hợp — nhưng điều này không được đảm bảo.
Cách tiếp cận đúng:
Luôn kiểm tra cấu trúc tệp trước khi chọn hàm.
Ghi tệp CSV từ R
Phân tích dữ liệu hiếm khi kết thúc trong R. Kết quả cần được chia sẻ dưới dạng tệp.
Ghi CSV phân tách bằng dấu phẩy
1write.csv(tips, "tips_comma.csv", row.names = FALSE)Ghi CSV phân tách bằng dấu chấm phẩy
1write.csv2(tips, "tips_semicolon.csv", row.names = FALSE)Việc chọn định dạng đúng phụ thuộc vào người sẽ đọc tệp tiếp theo.
Tại sao chúng ta vẫn cần Excel
CSV vượt trội về mặt kỹ thuật ở nhiều khía cạnh. Tuy nhiên, Excel vẫn chiếm ưu thế trong thực tế.
Tại sao?
- Chứa nhiều bảng trong một tệp.
- Giao diện quen thuộc cho người không chuyên kỹ thuật.
- Định dạng báo cáo phổ biến.
Excel không phải công cụ phân tích — nhưng nó là công cụ phân phối mạnh mẽ.
Làm việc với Excel trong R: openxlsx
Gói openxlsx cho phép thao tác Excel mà không cần cài đặt Excel trên máy.
1library(openxlsx)Ghi tệp Excel đơn giản
1write.xlsx(tips, "tips.xlsx", sheetName = "tips")Đọc từ Excel
1tips_excel <- read.xlsx("tips.xlsx", sheet = 1)Nhiều trang tính: Một báo cáo nhỏ
Excel tỏa sáng khi tổ chức các bảng liên quan.
1summary_tips <- aggregate(tip ~ day, data = tips, mean)
2
3wb <- createWorkbook()
4
5addWorksheet(wb, "Raw Data")
6writeData(wb, "Raw Data", tips)
7
8addWorksheet(wb, "Summary")
9writeData(wb, "Summary", summary_tips)
10
11saveWorkbook(wb, "tips_report.xlsx", overwrite = TRUE)Một tệp.
Nhiều góc nhìn.
Cấu trúc sạch sẽ.
Những lỗi thường gặp cần lưu ý
Hầu hết lỗi không do R gây ra, mà do giả định sai:
- Sai thư mục làm việc.
- Sai ký tự phân tách (
sep). - Sai dấu thập phân (
dec). - Đọc sai trang tính Excel.
- Ghi đè tệp không cố ý.
Một thói quen tốt sau mỗi lần nhập dữ liệu:
1head(data)
2str(data)
3summary(data)Lời kết
Nếu bạn có thể:
- Đọc dữ liệu chính xác,
- Ghi dữ liệu có ý thức,
- Chọn định dạng tệp có mục đích,
thì bạn đã vượt qua một trong những ngưỡng cửa quan trọng nhất của phân tích dữ liệu.
✨ Giá trị đắt giá
Đừng tin tưởng cمي vào mặc định. Hãy mở tệp tin bằng trình soạn thảo văn bản (như Notepad, VS Code) để nhìn thấy ký tự phân tách, dấu thập phân và tiêu đề trước khi viết một dòng code R nào. Năm phút kiểm tra tệp tin tiết kiệm được hàng giờ gỡ lỗi mô hình sau này.
Câu hỏi tư duy: Bạn nhận được một tệp .csv từ đồng nghiệp Đức. Bạn chạy read.csv() và thấy cột revenue toàn là giá trị nguyên như 123456 (thực tế là 1.234,56 Euro). Vấn đề nằm ở đâu và bạn sẽ sửa như thế nào chỉ bằng một lệnh duy nhất?


