Menu
CoddyTech

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  55000

3. 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     NA

4. 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>  65000

5. 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>  65000

6. 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")))
quiz iconTự kiểm tra

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 độ.

quiz iconTự kiểm tra

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 độ.

quiz iconTự kiểm tra

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 độ.

challenge icon

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:

  1. Thực hiện kết hợp trong để ghép sách với lượt đánh giá
  2. 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á
  3. 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
  4. Thực hiện kết hợp đầy đủ để lấy tất cả sách và tất cả lượt đánh giá
  5. 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á
  6. 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