Đây là một chút câu hỏi triết học về cú pháp tham gia data.table. Tôi đang tìm thấy ngày càng nhiều cách sử dụng cho data.tables, nhưng vẫn đang học ...
Định dạng nối X[Y]
cho data.tables rất ngắn gọn, tiện dụng và hiệu quả, nhưng theo như tôi có thể nói, nó chỉ hỗ trợ các phép nối bên trong và các phép nối bên ngoài bên phải. Để có được kết nối bên trái hoặc toàn bộ bên ngoài, tôi cần sử dụng merge
:
X[Y, nomatch = NA]
- tất cả các hàng trong Y - nối ngoài bên phải (mặc định)X[Y, nomatch = 0]
- chỉ các hàng có kết quả phù hợp trong cả X và Y - nối bên trongmerge(X, Y, all = TRUE)
- tất cả các hàng từ cả X và Y - tham gia bên ngoài đầy đủmerge(X, Y, all.x = TRUE)
- tất cả các hàng trong X - nối ngoài cùng bên trái
Đối với tôi, có vẻ như sẽ rất hữu ích nếu X[Y]
định dạng nối hỗ trợ cả 4 kiểu nối. Có lý do gì mà chỉ có hai loại liên kết được hỗ trợ?
Đối với tôi, các giá trị nomatch = 0
và nomatch = NA
tham số không trực quan cho các hành động đang được thực hiện. Nó là dễ dàng hơn cho tôi để hiểu và nhớ merge
cú pháp: all = TRUE
, all.x = TRUE
và all.y = TRUE
. Vì X[Y]
hoạt động giống với merge
nhiều hơn match
, tại sao không sử dụng merge
cú pháp cho phép nối hơn match
là nomatch
tham số của hàm ?
Dưới đây là các ví dụ về mã của 4 loại kết hợp:
# sample X and Y data.tables
library(data.table)
X <- data.table(t = 1:4, a = (1:4)^2)
setkey(X, t)
X
# t a
# 1: 1 1
# 2: 2 4
# 3: 3 9
# 4: 4 16
Y <- data.table(t = 3:6, b = (3:6)^2)
setkey(Y, t)
Y
# t b
# 1: 3 9
# 2: 4 16
# 3: 5 25
# 4: 6 36
# all rows from Y - right outer join
X[Y] # default
# t a b
# 1: 3 9 9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36
X[Y, nomatch = NA] # same as above
# t a b
# 1: 3 9 9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36
merge(X, Y, by = "t", all.y = TRUE) # same as above
# t a b
# 1: 3 9 9
# 2: 4 16 16
# 3: 5 NA 25
# 4: 6 NA 36
identical(X[Y], merge(X, Y, by = "t", all.y = TRUE))
# [1] TRUE
# only rows in both X and Y - inner join
X[Y, nomatch = 0]
# t a b
# 1: 3 9 9
# 2: 4 16 16
merge(X, Y, by = "t") # same as above
# t a b
# 1: 3 9 9
# 2: 4 16 16
merge(X, Y, by = "t", all = FALSE) # same as above
# t a b
# 1: 3 9 9
# 2: 4 16 16
identical( X[Y, nomatch = 0], merge(X, Y, by = "t", all = FALSE) )
# [1] TRUE
# all rows from X - left outer join
merge(X, Y, by = "t", all.x = TRUE)
# t a b
# 1: 1 1 NA
# 2: 2 4 NA
# 3: 3 9 9
# 4: 4 16 16
# all rows from both X and Y - full outer join
merge(X, Y, by = "t", all = TRUE)
# t a b
# 1: 1 1 NA
# 2: 2 4 NA
# 3: 3 9 9
# 4: 4 16 16
# 5: 5 NA 25
# 6: 6 NA 36
Cập nhật: data.table v1.9.6 đã giới thiệu on=
cú pháp, cho phép kết hợp đặc biệt trên các trường không phải khóa chính. câu trả lời của jangorecki cho câu hỏi Làm thế nào để nối (hợp nhất) các khung dữ liệu (trong, ngoài, trái, phải)? cung cấp một số ví dụ về các kiểu nối bổ sung mà data.table có thể xử lý.
unique()
cách tiếp cận của bạn dưới đây cho phép tham gia đầy đủ là thích hợp hơn rbind(Y[X],X[Y])
, vì rbind sẽ liên quan đến việc sao chép bảng. Có đúng không?
unique(c(unique(X[,t]), unique(Y[,t]))
- điều này sẽ hiệu quả hơn về bộ nhớ vì nó chỉ kết hợp hai danh sách sẽ nhỏ hơn hoặc bằng số hàng trong X và Y .
Y[X]
nếu bạn muốn nối ngoài bên trái củaX[Y]
vàrbind(Y[X],X[Y])
nếu bạn muốn có một bên ngoài đầy đủ tham gia