Xử lý dữ liệu thiếu
Bài học 11 trên 14 trong khóa học Thao tác dữ liệu trong R của Coddy.
Các giá trị bị thiếu thường được biểu diễn dưới dạng <strong>NA</strong> (Không có sẵn). Hãy cùng tìm hiểu các cách xác định, loại bỏ và điền giá trị cho dữ liệu bị thiếu.
Xác định dữ liệu bị thiếu
Để kiểm tra các giá trị bị thiếu trong R, bạn có thể dùng những hàm sau:
# Kiểm tra xem một giá trị có phải là NA không
is.na(x)
# Đếm số giá trị NA trong một vectơ
sum(is.na(x))
# Xác định các hàng có ít nhất một giá trị NA trong khung dữ liệu
complete.cases(df)Loại bỏ dữ liệu bị thiếu
Bạn có thể loại bỏ các hàng có giá trị bị thiếu bằng những cách sau:
# Xóa các hàng có bất kỳ giá trị NA nào
df_clean <- na.omit(df)
# Dùng dplyr để xóa các hàng có giá trị NA ở những cột cụ thể
library(dplyr)
df_clean <- df %>% filter(!is.na(column_name))Điền giá trị cho dữ liệu bị thiếu
Việc điền giá trị bao gồm thay thế các giá trị bị thiếu bằng những giá trị ước tính. Sau đây là một số kỹ thuật điền giá trị phổ biến:
# Điền giá trị thiếu bằng giá trị trung bình
df$column[is.na(df$column)] <- mean(df$column, na.rm = TRUE)
# Điền giá trị thiếu bằng trung vị
df$column[is.na(df$column)] <- median(df$column, na.rm = TRUE)
# Điền giá trị thiếu trong dữ liệu phân loại bằng giá trị xuất hiện nhiều nhất
mode_value <- names(sort(table(df$category), decreasing = TRUE))[1]
df$category[is.na(df$category)] <- mode_valueBài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Bài học này có một bài trắc nghiệm ngắn. Bắt đầu bài học để trả lời và theo dõi tiến độ.
Thử thách
Trung bìnhTạo một hàm (function) xử lý tập dữ liệu chứa thông tin về bệnh nhân và kết quả xét nghiệm y tế của họ. Hàm này cần thực hiện các thao tác sau:
- Chuyển chuỗi đầu vào thành khung dữ liệu
- Xác định và đếm số giá trị bị thiếu trong mỗi cột
- Xóa các hàng có giá trị bị thiếu trong cột 'age' hoặc 'test_result'
- Điền giá trị trung vị vào các giá trị bị thiếu trong cột 'blood_pressure'
- Tạo cột mới 'status' dựa trên 'test_result':
- Nếu test_result bị thiếu, đặt status thành "Unknown"
- Nếu test_result nhỏ hơn 50, đặt status thành "Normal"
- Nếu test_result bằng hoặc lớn hơn 50, đặt status thành "Elevated"
- In ra các thông tin sau:
- Số giá trị bị thiếu trong mỗi cột trước khi xử lý
- Số hàng đã xóa
- Giá trị trung vị của huyết áp được dùng để điền giá trị thiếu
- Khung dữ liệu đã xử lý
Tự làm thử
# Đọc đầu vào
con <- file("stdin", "r")
input_string <- suppressWarnings(readLines(con))
# Chuyển chuỗi đầu vào thành khung dữ liệu
data <- read.csv(text = input_string, stringsAsFactors = FALSE)
# TODO: Viết code bên dưới
# 1. Xác định và đếm các giá trị bị thiếu
# 2. Xóa các hàng thiếu giá trị ở 'age' hoặc 'test_result'
# 3. Điền các giá trị bị thiếu ở 'blood_pressure'
# 4. Tạo cột 'status'
# 5. In ra thông tin cần thiết
# Chỗ dành sẵn cho đầu ra
cat("Missing values in each column before processing:\n")
print(missing_counts)
cat("\nNumber of rows removed:\n")
print(rows_removed)
cat("\nMedian blood pressure used for imputation:\n")
print(median_bp)
cat("\nProcessed data:\n")
print(data_clean)Tất cả bài học trong Thao tác dữ liệu trong R
3Định hình lại dữ liệu
Định dạng rộng sang định dạng dàiĐịnh dạng dài sang định dạng rộngXử lý dữ liệu thiếuTự luyện tập: Trình biên dịch R online