Cách ghép các bảng dữ liệu với JOIN

Tác giả: Nguyễn Hải Trường | 2019-03-05

Trong thực tế dữ liệu của chúng ta có thể lưu trữ rời rạc ở các bảng dữ liệu khác nhau, vì vậy sẽ có lúc chúng ta cần phải nối các bảng dữ liệu với nhau để có thêm thông tin phục vụ cho việc phân tích dữ liệu.

Trong bài viết này, Ranalytics sẽ hướng dẫn các bạn cách nối các bảng dữ liệu sử dụng nhóm hàm join trong R.

Mutating join

Giả sử chúng ta có 2 data về việc khách hàng sử dụng các sản phẩm ngân hàng như sau:

# Data frame 1
df1 <- data.frame(CustomerId = c(1:6), Product = c(rep("CreditCard", 3), rep("HomeLoan", 3)))
df1
##   CustomerId    Product
## 1          1 CreditCard
## 2          2 CreditCard
## 3          3 CreditCard
## 4          4   HomeLoan
## 5          5   HomeLoan
## 6          6   HomeLoan
# Data frame 2
df2 <- data.frame(CustomerId = c(2, 4, 7), Province = c(rep("Hanoi", 2), rep("Hochiminh", 1)))
df2
##   CustomerId  Province
## 1          2     Hanoi
## 2          4     Hanoi
## 3          7 Hochiminh

Hai bảng dữ liệu này có chung trường key là CustomerId.

left_join

Hàm left_join() sẽ lấy tất cả dữ liệu có trong bảng đầu tiên.

library(dplyr)

df1 %>% 
  left_join(df2, 
            by = "CustomerId"   # nối theo trường key
            )
##   CustomerId    Product Province
## 1          1 CreditCard     <NA>
## 2          2 CreditCard    Hanoi
## 3          3 CreditCard     <NA>
## 4          4   HomeLoan    Hanoi
## 5          5   HomeLoan     <NA>
## 6          6   HomeLoan     <NA>

right_join

Hàm right_join() sẽ lấy tất cả dữ liệu có trong bảng thứ hai.

df1 %>% 
  right_join(df2, 
             by = "CustomerId"   # nối theo trường key
             )
##   CustomerId    Product  Province
## 1          2 CreditCard     Hanoi
## 2          4   HomeLoan     Hanoi
## 3          7       <NA> Hochiminh

inner_join

Hàm inner_join() sẽ lấy tất cả dữ liệu trùng key có trong cả 2 bảng.

df1 %>% 
  inner_join(df2, 
             by = "CustomerId"   # nối theo trường key
             )
##   CustomerId    Product Province
## 1          2 CreditCard    Hanoi
## 2          4   HomeLoan    Hanoi

full_join

Hàm full_join() sẽ lấy tất cả dữ liệu có 1 trong 2 bảng.

df1 %>% 
  full_join(df2, 
             by = "CustomerId"   # nối theo trường key
            )
##   CustomerId    Product  Province
## 1          1 CreditCard      <NA>
## 2          2 CreditCard     Hanoi
## 3          3 CreditCard      <NA>
## 4          4   HomeLoan     Hanoi
## 5          5   HomeLoan      <NA>
## 6          6   HomeLoan      <NA>
## 7          7       <NA> Hochiminh

Filtering join

semi_join

Hàm semi_join() lấy những quan sát trong bảng đầu tiên và đồng thời trong bảng thứ hai. Các biến/cột sẽ chỉ lấy theo bảng đầu tiên - đây chính là điểm khác biệt so với inner_join().

df1 %>% 
  semi_join(df2, 
             by = "CustomerId"   # nối theo trường key
            )
##   CustomerId    Product
## 1          2 CreditCard
## 2          4   HomeLoan

anti_join

Hàm anti_join() lấy những quan sát trong bảng đầu tiên mà ko có trong bảng thứ hai. Các biến/cột sẽ chỉ lấy theo bảng đầu tiên.

df1 %>% 
  anti_join(df2, 
             by = "CustomerId"   # nối theo trường key
            )
##   CustomerId    Product
## 1          1 CreditCard
## 2          3 CreditCard
## 3          5   HomeLoan
## 4          6   HomeLoan

Như vậy, chúng ta đã vừa được học cách nối các bảng dữ liệu với nhau sử dụng nhóm hàm join. Chúc các bạn học tập và làm việc hiệu quả với Ranalytics.vn!

comments powered by Disqus