🧹 Hướng dẫn làm sạch dữ liệu trong R với tidyverse

Trong phân tích dữ liệu, làm sạch dữ liệu (data cleaning) là một bước thiết yếu giúp đảm bảo tính chính xác của phân tích và mô hình hóa.

R cung cấp nhiều công cụ mạnh mẽ cho việc làm sạch, đặc biệt thông qua các gói trong tidyverse như dplyr, tidyr, lubridate, janitor


🧱 1. Đổi tên tiêu đề cột

✅ Dùng rename() trong dplyr:

library(dplyr)

df <- data.frame(ma_kh = 1:3, doanhso = c(100, 200, 300))

df_renamed <- df %>%
  rename(
    MaKhachHang = ma_kh,
    DoanhSo = doanhso
  )

✅ Dùng clean_names() từ janitor để chuyển sang snake_case:


library(janitor)

df_clean <- df %>% clean_names()

🔢 2. Đổi kiểu dữ liệu

✅ Dùng as.character(), as.numeric(), as.factor()…

df <- df %>%
  mutate(
    MaKhachHang = as.character(MaKhachHang),
    DoanhSo = as.numeric(DoanhSo)
  )
  

🕒 3. Xử lý dữ liệu thời gian sai định dạng

✅ Dùng lubridate để chuẩn hóa ngày tháng:

 
 
library(lubridate)

df <- data.frame(NgayGiaoDich = c("2024/01/02", "02-03-2024", "March 4, 2024"))

df <- df %>%
  mutate(NgayGiaoDich = parse_date_time(NgayGiaoDich, orders = c("ymd", "dmy", "mdy")))

❓ 4. Xử lý dữ liệu thiếu (NA)

✅ Kiểm tra thiếu:

 
 
colSums(is.na(df))

✅ Loại bỏ dòng thiếu:

df_no_na <- df %>% drop_na()

✅ Thay thế giá trị thiếu:

 
 
df_filled <- df %>%
  mutate(
    DoanhSo = ifelse(is.na(DoanhSo), 0, DoanhSo)
  )
  

🔁 5. Loại bỏ dữ liệu trùng nhau

✅ Dùng distinct():

 
 
df_unique <- df %>% distinct()

✅ Chỉ giữ dòng duy nhất theo biến:

 
 
df_unique_ma_kh <- df %>% distinct(MaKhachHang, .keep_all = TRUE)

🔄 6. Pivot và Unpivot dữ liệu

✅ Unpivot (từ wide → long): pivot_longer()

 
 
library(tidyr)

df_wide <- data.frame(
  MaKH = c("A", "B"),
  Thang1 = c(100, 200),
  Thang2 = c(150, 250)
)

df_long <- df_wide %>%
  pivot_longer(cols = starts_with("Thang"),
               names_to = "Thang",
               values_to = "DoanhSo")

✅ Pivot (từ long → wide): pivot_wider()

 
 
df_wide_again <- df_long %>%
  pivot_wider(names_from = Thang, values_from = DoanhSo)

🔗 7. Gộp bảng – Join bảng

Giả sử có 2 bảng:

 
 
khachhang <- data.frame(ID = c(1,2,3), Ten = c("A", "B", "C"))
doanhso <- data.frame(ID = c(1,2), DoanhSo = c(100, 200))

✅ Left Join (giữ theo bảng chính):

 
 
left_join(khachhang, doanhso, by = "ID")

✅ Inner Join (chỉ giữ phần giao):

 
 
inner_join(khachhang, doanhso, by = "ID")

✅ Full Join (giữ tất cả):

 
 
full_join(khachhang, doanhso, by = "ID")

⬇️ 8. Nối bảng theo chiều dọc

✅ Dùng bind_rows() để ghép dòng:

 
 
df1 <- data.frame(ID = 1:2, DoanhSo = c(100, 200))
df2 <- data.frame(ID = 3:4, DoanhSo = c(300, 400))

df_all <- bind_rows(df1, df2)

📌 Hai bảng cần có cùng tên cột để nối.

📌 Tổng kết

Kỹ thuật Hàm sử dụng

Đổi tên cột rename(), clean_names()

Đổi kiểu dữ liệu as.character(), as.numeric()

Chuẩn hóa ngày giờ parse_date_time() – lubridate

Xử lý thiếu drop_na(), mutate(ifelse())

Loại trùng distinct()

Pivot/Unpivot pivot_longer(), pivot_wider()

Gộp bảng left_join(), inner_join()

Nối bảng dọc bind_rows()

📚 Tài nguyên hữu ích

Tidyverse Cheat Sheet

lubridate Guide

tidyr documentation

dplyr documentation