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:

Trận đấu một phần

# 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.