Hợp nhất các khung dữ liệu trong R: So khớp toàn bộ và một phần
Rất thường xuyên, chúng tôi có dữ liệu từ nhiều nguồn. Để thực hiện phân tích, chúng ta cần hợp nhất hai khung dữ liệu cùng với một hoặc nhiều biến khóa chung.
Trong hướng dẫn này, bạn sẽ học
Toàn trận đấu
Kết quả khớp hoàn toàn trả về các giá trị có giá trị tương đương trong bảng đích. Các giá trị không khớp sẽ không được trả về trong khung dữ liệu mới. Tuy nhiên, kết quả khớp một phần sẽ trả về các giá trị còn thiếu dưới dạng NA.
Chúng ta sẽ thấy một cách đơn giản tham gia bên trong. Từ khóa kết nối bên trong chọn các bản ghi có giá trị trùng khớp trong cả hai bảng. Để nối hai tập dữ liệu, chúng ta có thể sử dụng hàm merge(). Chúng ta sẽ sử dụng ba đối số:
merge(x, y, by.x = x, by.y = y) Arguments: -x: The origin data frame -y: The data frame to merge -by.x: The column used for merging in x data frame. Column x to merge on -by.y: The column used for merging in y data frame. Column y to merge on
Ví dụ:
Tạo tập dữ liệu đầu tiên với các biến
- họ
- quốc tịch
Tạo tập dữ liệu thứ hai với các biến
- họ
- phim
Biến khóa chung là họ. Chúng tôi có thể hợp nhất cả hai dữ liệu và kiểm tra xem kích thước có phải là 7 × 3 hay không.
Chúng tôi thêm stringsAsFactors=FALSE vào khung dữ liệu vì chúng tôi không muốn R để chuyển đổi chuỗi thành hệ số, chúng tôi muốn biến được coi là ký tự.
# Create origin dataframe( producers <- data.frame( surname = c("Spielberg","Scorsese","Hitchcock","Tarantino","Polanski"), nationality = c("US","US","UK","US","Poland"), stringsAsFactors=FALSE) # Create destination dataframe movies <- data.frame( surname = c("Spielberg", "Scorsese", "Hitchcock", "Hitchcock", "Spielberg", "Tarantino", "Polanski"), title = c("Super 8", "Taxi Driver", "Psycho", "North by Northwest", "Catch Me If You Can", "Reservoir Dogs","Chinatown"), stringsAsFactors=FALSE) # Merge two datasets m1 <- merge(producers, movies, by.x = "surname") m1 dim(m1)
Đầu ra:
surname nationality title 1 Hitchcock UK Psycho 2 Hitchcock UK North by Northwest 3 Polanski Poland Chinatown 4 Scorsese US Taxi Driver 5 Spielberg US Super 8 6 Spielberg US Catch Me If You Can 7 Tarantino US Reservoir Dogs
Hãy hợp nhất các khung dữ liệu khi các biến khóa chung có tên khác nhau.
Chúng ta đổi họ thành tên trong khung dữ liệu phim. Chúng tôi sử dụng hàm giống hệt nhau (x1, x2) để kiểm tra xem cả hai khung dữ liệu có giống nhau hay không.
# Change name of ` movies ` dataframe colnames(movies)[colnames(movies) == 'surname'] <- 'name' # Merge with different key value m2 <- merge(producers, movies, by.x = "surname", by.y = "name") # Print head of the data head(m2)
Đầu ra:
##surname nationality title ## 1 Hitchcock UK Psycho ## 2 Hitchcock UK North by Northwest ## 3 Polanski Poland Chinatown ## 4 Scorsese US Taxi Driver ## 5 Spielberg US Super 8 ## 6 Spielberg US Catch Me If You Can
# Check if data are identical identical(m1, m2)
Đầu ra:
## [1] TRUE
Điều này cho thấy thao tác hợp nhất được thực hiện ngay cả khi tên cột khác nhau.
Trận đấu một phần
Không có gì đáng ngạc nhiên khi hai khung dữ liệu không có cùng các biến khóa chung. bên trong kết hợp đầy đủ, khung dữ liệu trả về có thể các hàng được tìm thấy trong cả khung dữ liệu x và y. Với sáp nhập một phần, có thể giữ các hàng không có hàng trùng khớp trong khung dữ liệu khác. Các hàng này sẽ có NA trong các cột thường chứa các giá trị từ y. Chúng ta có thể làm điều đó bằng cách đặt all.x= TRUE.
Ví dụ: chúng ta có thể thêm nhà sản xuất mới, Lucas, vào khung dữ liệu nhà sản xuất mà không cần tham chiếu phim trong khung dữ liệu phim. Nếu chúng ta đặt all.x= FALSE, R sẽ chỉ kết hợp các giá trị trùng khớp trong cả hai tập dữ liệu. Trong trường hợp của chúng tôi, nhà sản xuất Lucas sẽ không tham gia hợp nhất vì nó bị thiếu trong một tập dữ liệu.
Hãy xem thứ nguyên của từng đầu ra khi chúng ta chỉ định all.x= TRUE và khi không.
# Create a new producer add_producer <- c('Lucas', 'US') # Append it to the ` producer` dataframe producers <- rbind(producers, add_producer) # Use a partial merge m3 <-merge(producers, movies, by.x = "surname", by.y = "name", all.x = TRUE) m3
Đầu ra:
# Compare the dimension of each data frame dim(m1)
Đầu ra:
## [1] 7 3
dim(m2)
Đầu ra:
## [1] 7 3
dim(m3)
Đầu ra:
## [1] 8 3
Như chúng ta có thể thấy, kích thước của khung dữ liệu mới là 8×3 so với 7×3 của m1 và m2. R bao gồm NA cho tác giả bị thiếu trong khung dữ liệu sách.