Thêm tập dữ liệu theo chiều ngang
Khi bạn có các tập dữ liệu đại diện cho cùng một bộ quan sát, bạn có thể nối chúng theo chiều ngang. Lần này, giữ nguyên các hàng của tập dữ liệu, bạn có thể thêm nhiều cột vào đó. Trong trường hợp này, bạn nên kiểm tra rằng thứ tự các quan sát là giống nhau. Nếu các tập dữ liệu có số hàng khác nhau, hoặc có cùng số hàng nhưng thứ tự hàng không nhất quán, bạn có thể ghép một bộ cột với bộ còn lại theo cách không hợp lý.
Hãy mở rộng ví dụ trên. Giả sử bạn có hai tệp dữ liệu, một tệp chứa hãng xe và số mẫu xe độc nhất được cung cấp, và tệp kia chứa hãng xe và tổng doanh số:
Số mẫu xe độc nhất được cung cấp
| Hãng xe | Số mẫu xe |
|---|---|
| Honda | 63 |
| BMW | 10 |
| Ford | 26 |
| Tesla | 4 |
Tổng doanh số
| Hãng xe | Doanh số |
|---|---|
| Ford | 119157 |
| BMW | 25908 |
| Honda | 188328 |
| Tesla | 29975 |
Lưu ý quan trọng: nếu bạn có cùng một quan sát xuất hiện ở nhiều tập dữ liệu và bạn nối ngang bằng cbind(), bạn sẽ có các cột dư thừa trong bảng. Và dù hai tập dữ liệu chứa thông tin liên quan, thứ tự các hàng là rất quan trọng!
Trong bảng điều khiển bên dưới, hãy gọi cbind() với models và sales và in kết quả:
# Add datasets horizontally
cbind(models, sales)
Bạn sẽ nhận được kết quả tương tự như sau:
Mẫu xe & Doanh số
| Hãng xe | Số mẫu xe | Hãng xe | Doanh số |
|---|---|---|---|
| Honda | 63 | Ford | 119157 |
| BMW | 10 | BMW | 25908 |
| Ford | 26 | Honda | 188328 |
| Tesla | 4 | Tesla | 29975 |
Bạn thấy vấn đề chứ? Dữ liệu này chưa tidy!
Theo các nguyên tắc về dữ liệu tidy được dạy trong khóa học nền tảng này, mỗi quan sát của một tập dữ liệu nên được biểu diễn trong một hàng duy nhất. Và nếu bạn chỉ có thông tin cho một số hàng ở một tập dữ liệu và muốn chỉ thêm thông tin cho những hàng đó thì sao? Nói cách khác, nếu bạn muốn thêm nhiều cột từ một tập dữ liệu vào tập khác, nhưng hai tập này không có cùng số lượng quan sát thì sao?
Khóa chính và khóa ngoại
Bước đầu tiên khi muốn kết hợp các tập dữ liệu là tìm khóa chính của tập dữ liệu. Khóa chính là cột hoặc tập hợp các cột xác định duy nhất mỗi quan sát trong tập dữ liệu. Trong ví dụ về hãng xe, số mẫu xe độc nhất được cung cấp và tổng doanh số, khóa chính của các tập dữ liệu là cột make.
Bây giờ, chúng ta có thể thực hiện các join, cách tiêu chuẩn để gộp các tập dữ liệu vào một bảng duy nhất.
Các loại join
Có nhiều loại join. Bạn có thể học cách bổ sung cột từ một tập dữ liệu bằng cột từ tập khác với mutating join, cách lọc một tập dữ liệu dựa trên tập khác với filtering join, và cách thao tác qua các tập dữ liệu với phép toán tập hợp trong khóa học Joining Data in R with dplyr. Dưới đây là một vài loại phổ biến.
left_join(x, y): trả về tất cả các hàng từ x, và tất cả các cột từ x và y. Những hàng trong x không khớp với y sẽ có giá trị NA ở các cột mới. Nếu có nhiều khớp giữa x và y, tất cả tổ hợp khớp sẽ được trả về.
inner_join(x, y): trả về tất cả các hàng từ x có giá trị khớp trong y, và tất cả các cột từ x và y. Nếu có nhiều khớp giữa x và y, tất cả tổ hợp khớp sẽ được trả về.
full_join(x, y): trả về tất cả các hàng và tất cả các cột từ cả x và y. Ở nơi không có giá trị khớp, hàm sẽ trả về NA cho bên thiếu.
Các join vừa nêu là ví dụ của mutating join vì chúng kết hợp các biến từ hai tập dữ liệu.
Thiếu khóa
Giả sử bạn có hai tập dữ liệu. Tập thứ nhất tên là size và chứa tên người cùng cỡ áo:
> size
name size
1 Tom M
2 Dan XL
3 Keil S
Tập thứ hai tên là color và chứa họ của mọi người, sở thích màu áo, đồng thời lưu một số thông tin trong thuộc tính row.names:
> color
surname color
Tom Jeon <NA>
Dan Smith Dark
Bob McLadden Light
Bạn thấy điều gì có thể sai ở đây không? Join hai bảng có thể trở nên phức tạp khi thiếu khóa hoặc trùng khóa. Trong ví dụ này, data frame của R lưu thông tin quan trọng trong thuộc tính row.names. Khi như vậy, bạn sẽ không thể truy cập khóa bằng hàm join, vì các hàm join chỉ truy cập được các cột của data frame.
Mẹo để sửa nhanh vấn đề này là dùng hàm rownames_to_column() từ gói tibble. Hàm trả về một bản sao tập dữ liệu với tên hàng được thêm vào như một cột. Đối số thứ nhất của rownames_to_column() là đối tượng data frame của bạn và đối số thứ hai là chuỗi chỉ định tên cột bạn muốn thêm.
Hãy thử khám phá trong bảng điều khiển bên dưới. Các tập dữ liệu size và color đã được nạp sẵn trong workspace của bạn.
# Explore here!
Lời kết
Trong thế giới thực, dữ liệu có thể bị tách nhỏ trong nhiều tập và nhiều định dạng khác nhau. Vì R được thiết kế để làm việc với các bảng dữ liệu đơn, thao tác và kết hợp các tập dữ liệu vào một bảng là kỹ năng thiết yếu. Hoàn thành lộ trình kỹ năng Importing & Cleaning Data with R và học cách phân tích cú pháp và kết hợp dữ liệu ở mọi định dạng. Xem thêm hướng dẫn R Data Import của DataCamp. Chúc bạn học tốt!
Trong thực tế, dữ liệu được lưu trữ trên nhiều máy chủ và tồn tại trong nhiều tệp khác nhau. Khi dữ liệu bạn cần đến từ nhiều nguồn, điều quan trọng là biết cách tổng hợp chúng sao cho mất ít thông tin nhất và ghép nối có ý nghĩa với cấu trúc dữ liệu của bạn.
Hướng dẫn này sẽ giúp bạn nắm được:
Nối tập dữ liệu
Ở mức khái quát, có hai cách để bạn gộp tập dữ liệu; bạn có thể bổ sung thông tin bằng cách thêm nhiều hàng hoặc thêm nhiều cột vào tập dữ liệu. Nhìn chung, khi bạn có các tập dữ liệu có cùng bộ cột hoặc cùng bộ quan sát, bạn có thể nối chúng lần lượt theo chiều dọc hoặc chiều ngang. Hãy học qua vài ví dụ.
Thêm tập dữ liệu theo chiều dọc
Khi bạn có nhiều tập dữ liệu có cùng bộ cột, bạn có thể nối dọc tập này với tập khác. Tức là, giữ nguyên các cột của tập dữ liệu, bạn có thể thêm nhiều hàng vào đó. Gom thông tin như vậy vào một tệp sẽ giúp bạn dễ tổng hợp và nhìn bức tranh lớn mà không phải lục giữa nhiều tệp và dễ bị lạc mất.
Tập dữ liệu 1
Tập dữ liệu 2
Lưu ý quan trọng: nếu bạn có cùng một quan sát xuất hiện ở nhiều tập dữ liệu và bạn nối dọc bằng
rbind(), bạn sẽ nhận được các quan sát trùng lặp trong bảng. Và dù hai tập dữ liệu phải có cùng bộ biến (tức là các cột), chúng không nhất thiết phải theo cùng thứ tự. Tự kiểm chứng trong bảng điều khiển bên dưới!Trong workspace của bạn có hai tập dữ liệu tên là
dataset1vàdataset2như trên. Hãy thử đổi thứ tự cột củadataset1. Gọirbind()vớidataset1vàdataset2cũng như vớireordered_dataset1vàdataset2.Sau
rbind(), kết quả của bạn sẽ có thông tin về cả bốn hãng xe trong một bảng như sau:Tập dữ liệu đã nối theo chiều dọc