Chủ đề này quá cũ.Nhưng tôi nhận thấy rằng các giải pháp có thể dễ dàng bắt nguồn từ định nghĩa về bán join được đưa ra trong các bài bản gốc:
"Một nửa tham gia cũng giống như một bên tham gia ngoại trừ việc nó chỉ trả về cột của X (không còn những người Y), và không lặp lại các hàng của X để phù hợp với các hàng của Y"
library(data.table)
dt1 <- data.table(ProdId = 1:4,
Product = c("Bread", "Cheese", "Pizza", "Butter"))
dt2 <- data.table(ProdId = c(1, 1, 3, 4, 5),
Company = c("A", "B", "C", "D", "E"))
# semi-join
unique(merge(dt1, dt2, on="ProdId")[, names(dt1), with=F])
ProdId Product
1: 1 Bread
2: 3 Pizza
3: 4 Butter
tôi chỉ đơn giản là áp dụng cú pháp của nội tham gia, tiếp theo bằng cách lọc các cột từ đầu tiên chỉ bảng, với unique()
để xóa các hàng của bảng đầu tiên được lặp lại để khớp với các hàng của giây ond bảng.
Chỉnh sửa: Cách tiếp cận trên sẽ chỉ khớp với đầu ra dplyr::semi_join()
chỉ khi chúng tôi có các hàng duy nhất trong bảng đầu tiên. Nếu chúng ta cần xuất tất cả các hàng bao gồm các bản sao từ bảng đầu tiên, thì chúng ta có thể sử dụng phương thức fsetdiff()
được hiển thị bên dưới.
Một một dòng data.table
giải pháp:
fsetdiff(dt1, dt1[!dt2, on="ProdId"])
ProdId Product
1: 1 Bread
2: 3 Pizza
3: 4 Butter
Tôi vừa mới lấy ra từ bảng đầu tiên chống tham gia của đầu tiên và thứ hai. Có vẻ đơn giản hơn với tôi. Nếu bảng đầu tiên có hàng trùng lặp, chúng tôi sẽ cần:
fsetdiff(dt1, dt1[!dt2, on="ProdId"], all=T)
Các fsetdiff()
kết quả với ,all=T
phù hợp với sản lượng từ dplyr:
dplyr::semi_join(dt1, dt2, by="ProdId")
ProdId Product
1 1 Bread
2 3 Pizza
3 4 Butter
Sử dụng một tập hợp các dữ liệu được lấy từ một trong những bài viết theo thời gian:
x <- data.table(x = c(1,1,1,2), y = c("a", "a", "a", "b"))
y <- data.table(x = c(1, 1), z = 10:11)
Với dplyr:
dplyr::semi_join(x, y, by="x")
x y
1 1 a
2 1 a
3 1 a
Với data.table:
fsetdiff(x, x[!y, on="x"], all=T)
x y
1: 1 a
2: 1 a
3: 1 a
Without ,all=T
, các hàng trùng lặp được loại bỏ:
fsetdiff(x, x[!y, on="x"])
x y
1: 1 a
Tuyệt! Bây giờ tôi hiểu những gì 'allow.cartesian = TRUE' là cho. –
Tôi biết rằng guru sẽ dừng lại! Kể từ khi bạn chính thức thích cách tiếp cận chống chống tham gia, làm thế nào về việc thêm 'x [!! y]' vào cú pháp? :) –
@VictorK. :) 'x [!! y]' là một lỗi hiện tại không phải là nó, vì vậy ok. Vui lòng gửi dưới dạng yêu cầu tính năng. –