messenger_logo
Liên hệ qua Messenger
SciEco

Hiểu về nhập xuất dữ liệu trong R: Làm việc với tệp CSV và Excel

I
IEFPA
Ngày viết: 18/09/2026

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:

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

Ví dụ:

1total_bill,tip,sex
216.99,1.01,Female

Tệp Excel

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 connection

thườ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.

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:

  1. Cột được phân tách như thế nào?
  2. Dòng đầu tiên có phải tiêu đề không?
  3. Dấu thập phân là gì?
  4. 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:

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:

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?

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:

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ể:

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?


Bài viết khác
Trong hành trình phát triển các lệnh ước lượng chuyên sâu trong Stata, việc tích hợp mã nguồn từ ngôn ngữ khác như C, C++ hay Java mở ra một thế giới mới về hiệu suất và khả năng tùy biến. Một trong những kỹ thuật mạnh mẽ nhất là viết plugin — hay còn gọi là thư viện liên kết động (DLL) — để tận dụng sức mạnh của C trong môi trường Stata. Bài viết này là phần thứ hai trong chuỗi chuyên đề “Viết một lệnh ước lượng trong Stata”, tiếp nối bài trước về việc chuẩn bị viết plugin. Ở đây, chúng ta sẽ xây dựng một plugin C thực hiện chính xác các phép tính mà hàm mymean_work() trong tệp mymean11.ado đã làm. Mục tiêu không chỉ là minh họa cách giao tiếp giữa C và Stata, mà còn cung cấp một nền tảng vững chắc cho các tính toán hiệu suất cao trong các mô hình kinh tế lượng phức tạp. Viết một plugin C đơn giản: “Hello, C!” Trước khi tiến vào tính toán thực tế, hãy bắt đầu bằng một ví dụ đơn giản: một plugin C hiển thị thông điệp “Hello from C” trong cửa sổ Stata. Mã nguồn cho myhello.ado được trình bày như sau:
Trong bài viết trước, chúng ta đã xây dựng một đường ống phân tích văn bản sử dụng quanteda. Quy trình đó tạo ra ma trận đặc trưng văn bản (DFM), áp dụng trọng số TF-IDF và đo lường sự tương đồng qua cosine similarity. Tuy nhiên, phương pháp này bộc lộ một hạn chế căn bản: cosine similarity tính trên các vector TF-IDF thưa chỉ phản ánh sự trùng lặp từ vựng, chứ không nắm bắt được ý nghĩa ngữ nghĩa. Xét ví dụ hai câu: "Người vay nợ không thực hiện nghĩa vụ trả nợ" và "Khách hàng không đáp ứng được cam kết trả nợ". Sau khi loại từ dừng, chúng không chia sẻ từ vựng nào, dẫn đến độ tương đồng TF-IDF gần như bằng 0. Dù vậy, bất kỳ аналитик nào cũng nhận ra chúng mang ý nghĩa như nhau. Giải pháp nằm ở vector nhúng dày đặc (dense embeddings) — biểu diễn thần kinh nơi các văn bản mang ý nghĩa gần nhau được ánh xạ đến các vị trí lân cận trong không gian vectơ. Nhờ đó, chúng ta có thể đo lường sự tương đồng ngữ nghĩa ngay cả khi không có từ chung. Bài viết này sẽ hướng dẫn xây dựng một đường ống Tạo sinh tăng cường truy xuất (RAG) trong R, sử dụng ragnar cho kho truy xuất và ellmer cho tương tác mô hình ngôn ngữ lớn (LLM), minh họa sức mạnh của nhúng dày đặc trong truy xuất và sinh câu trả lời. Toàn bộ quy trình chạy cục bộ nhờ Ollama.
SciEco
Science for Economics
Định hướng đào tạo phân tích dữ liệu, xây dựng chính sách, tối ưu hoá danh mục tài chính cá nhân và dự báo thị trường.
Liên hệ
Địa chỉ: Số 60, ngõ 41, Phố Thái Hà, Trung Liệt, Đống Đa, Hà Nội (Google Map)
Email: [email protected]
Hotline: 03.57.94.7680 (Mrs. Hà)
Mạng xã hội