Kết hợp dữ liệu với dplyr
Bài học 8 trên 14 trong khóa học Thao tác dữ liệu trong R của Coddy.
Ghép dữ liệu là một thao tác quan trọng trong quá trình thao tác dữ liệu, cho phép bạn kết hợp nhiều khung dữ liệu dựa trên các cột chung. Gói dplyr trong R cung cấp các hàm hiệu quả cho nhiều kiểu ghép khác nhau. Hãy cùng tìm hiểu các thao tác ghép chính: ghép trong, ghép trái, ghép phải và ghép đầy đủ.
1. Chuẩn bị dữ liệu
Trước tiên, hãy tạo hai khung dữ liệu mẫu để minh họa các thao tác ghép:
# Tải dplyr
library(dplyr)
# Tạo các khung dữ liệu mẫu
employees <- data.frame(
emp_id = c(1, 2, 3, 4),
name = c("Alice", "Bob", "Charlie", "David"),
department = c("HR", "IT", "Finance", "IT")
)
salaries <- data.frame(
emp_id = c(1, 2, 3, 5),
salary = c(50000, 60000, 55000, 65000)
)2. Ghép trong
Ghép trong chỉ trả về các hàng có giá trị khớp nhau trong cả hai khung dữ liệu:
inner_join_result <- inner_join(employees, salaries, by = "emp_id")
print(inner_join_result)Đầu ra:
emp_id name department salary
1 1 Alice HR 50000
2 2 Bob IT 60000
3 3 Charlie Finance 550003. Ghép trái
Ghép trái trả về tất cả các hàng từ khung dữ liệu bên trái và các hàng khớp từ khung dữ liệu bên phải:
left_join_result <- left_join(employees, salaries, by = "emp_id")
print(left_join_result)Đầu ra:
emp_id name department salary
1 1 Alice HR 50000
2 2 Bob IT 60000
3 3 Charlie Finance 55000
4 4 David IT NA4. Ghép phải
Ghép phải trả về tất cả các hàng từ khung dữ liệu bên phải và các hàng khớp từ khung dữ liệu bên trái:
right_join_result <- right_join(employees, salaries, by = "emp_id")
print(right_join_result)Đầu ra:
emp_id name department salary
1 1 Alice HR 50000
2 2 Bob IT 60000
3 3 Charlie Finance 55000
4 5 <NA> <NA> 650005. Ghép đầy đủ
Ghép đầy đủ trả về tất cả các hàng có giá trị khớp trong khung dữ liệu bên trái hoặc bên phải:
full_join_result <- full_join(employees, salaries, by = "emp_id")
print(full_join_result)Đầu ra:
emp_id name department salary
1 1 Alice HR 50000
2 2 Bob IT 60000
3 3 Charlie Finance 55000
4 4 David IT NA
5 5 <NA> <NA> 650006. Chỉ định các cột ghép
Nếu tên cột trong hai khung dữ liệu khác nhau, bạn có thể chỉ định rõ các cột ghép:
# Giả sử 'salaries' có 'employee_id' thay vì 'emp_id'
salaries_alt <- salaries %>% rename(employee_id = emp_id)
join_result <- inner_join(employees, salaries_alt, by = c("emp_id" = "employee_id"))
print(join_result)7. Thêm cột mới
Thêm hoặc sửa đổi cột bằng mutate() Hàm mutate() trong dplyr cho phép bạn thêm cột mới hoặc sửa đổi các cột hiện có trong khung dữ liệu. Hàm này thường được dùng sau các thao tác ghép để tính toán hoặc biến đổi dữ liệu đã ghép:
Cách dùng cơ bản:
result <- data_frame %>% mutate(new_column = calculation)Ví dụ:
# Thêm cột thưởng vào dữ liệu đã kết nối
result_with_bonus <- inner_join(employees, salaries, by = "emp_id") %>%
mutate(bonus = salary * 0.1)Bạn cũng có thể dùng mutate() để thực hiện các phép tính phức tạp hơn hoặc sử dụng logic điều kiện:
# Thêm nhóm đánh giá hiệu suất dựa trên mức lương
result_with_category <- inner_join(employees, salaries, by = "emp_id") %>%
mutate(performance_category = ifelse(salary < 55000, "Needs Improvement",
ifelse(salary < 60000, "Meets Expectations",
"Exceeds Expectations")))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 độ.
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
DễTạo một hàm thực hiện một loạt thao tác kết hợp trên hai khung dữ liệu chứa thông tin về sách và lượt đánh giá. Hàm cần:
- Thực hiện kết hợp trong để ghép sách với lượt đánh giá
- Thực hiện kết hợp trái để lấy tất cả sách, kể cả những sách chưa có lượt đánh giá
- Thực hiện kết hợp phải để lấy tất cả lượt đánh giá, kể cả lượt đánh giá của những sách không có trong danh sách sách
- Thực hiện kết hợp đầy đủ để lấy tất cả sách và tất cả lượt đánh giá
- Với mỗi kết quả kết hợp, tính và thêm một cột chứa số lượt đánh giá
- Trả về một danh sách chứa cả bốn kết quả kết hợp
Tự làm thử
# Đọc tất cả các dòng đầu vào
con <- file("stdin", "r")
all_lines <- suppressWarnings(readLines(con))
# Tìm chỉ số bắt đầu của khung dữ liệu thứ hai
separator_index <- which(grepl("^book_id,rating,user_id", all_lines))
# Chia đầu vào thành hai phần
books_data <- all_lines[1:(separator_index - 1)]
ratings_data <- all_lines[separator_index:length(all_lines)]
# Tải thư viện cần thiết
suppressPackageStartupMessages(library(dplyr))
# Chuyển các chuỗi đầu vào thành khung dữ liệu
books <- read.csv(text = paste(books_data, collapse = "\n"), stringsAsFactors = FALSE)
ratings <- read.csv(text = paste(ratings_data, collapse = "\n"), stringsAsFactors = FALSE)
# TODO: Viết code của bạn bên dưới
# Thực hiện các phép nối và tính toán cần thiết
# Hàm (function) thực hiện các phép nối
perform_joins <- function(books, ratings) {
# Viết code của bạn tại đây
# Trả về danh sách chứa kết quả của cả bốn phép nối
list(
inner_join = NULL,
left_join = NULL,
right_join = NULL,
full_join = NULL
)
}
# Gọi hàm và lưu kết quả
results <- perform_joins(books, ratings)
# In kết quả ra
print(results)Tất cả bài học trong Thao tác dữ liệu trong R
Tự luyện tập: Trình biên dịch R online