นี่เป็นคำถามเชิงปรัชญาเกี่ยวกับ data.table join syntax ฉันพบการใช้งาน data.tables มากขึ้นเรื่อย ๆ แต่ยังคงเรียนรู้ ...
รูปแบบการเข้าร่วมX[Y]
สำหรับ data.tables นั้นกระชับสะดวกและมีประสิทธิภาพ แต่เท่าที่ฉันบอกได้มันรองรับเฉพาะการรวมภายในและการรวมภายนอกที่ถูกต้องเท่านั้น ในการรับการรวมด้านซ้ายหรือแบบเต็มฉันต้องใช้merge
:
X[Y, nomatch = NA]
- แถวทั้งหมดใน Y - การรวมภายนอกด้านขวา (ค่าเริ่มต้น)X[Y, nomatch = 0]
- เฉพาะแถวที่มีการจับคู่ทั้ง X และ Y - การเข้าร่วมภายในmerge(X, Y, all = TRUE)
- ทุกแถวจากทั้ง X และ Y - การรวมภายนอกแบบเต็มmerge(X, Y, all.x = TRUE)
- แถวทั้งหมดใน X - การรวมภายนอกด้านซ้าย
สำหรับฉันแล้วดูเหมือนว่าจะมีประโยชน์ถ้าX[Y]
รูปแบบการเข้าร่วมรองรับการรวมทั้ง 4 ประเภท มีเหตุผลที่รองรับการรวมสองประเภทเท่านั้นหรือไม่?
สำหรับฉันแล้วค่าพารามิเตอร์nomatch = 0
และnomatch = NA
ไม่ได้ใช้งานง่ายสำหรับการดำเนินการ มันง่ายกว่าสำหรับฉันที่จะเข้าใจและจำmerge
ไวยากรณ์: all = TRUE
, all.x = TRUE
และall.y = TRUE
. เนื่องจากการX[Y]
ดำเนินการมีลักษณะคล้ายmerge
กันมากกว่าmatch
ทำไมไม่ใช้merge
ไวยากรณ์สำหรับการรวมแทนที่จะใช้พารามิเตอร์match
ของฟังก์ชันnomatch
นี่คือตัวอย่างโค้ดของการเข้าร่วม 4 ประเภท:
# 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
อัปเดต: data.table v1.9.6 แนะนำon=
ไวยากรณ์ซึ่งอนุญาตให้รวมเฉพาะกิจในฟิลด์อื่นที่ไม่ใช่คีย์หลัก คำตอบของ jangorecki สำหรับคำถามจะเข้าร่วม (ผสาน) data frames (ด้านใน, ด้านนอก, ซ้าย, ขวา) ได้อย่างไร? ให้ตัวอย่างบางส่วนของประเภทการรวมเพิ่มเติมที่ data.table สามารถจัดการได้
unique()
แนวทางของคุณด้านล่างสำหรับการเข้าร่วมแบบเต็มนั้นดีกว่าrbind(Y[X],X[Y])
เนื่องจาก rbind จะเกี่ยวข้องกับการคัดลอกตาราง นั่นถูกต้องใช่ไหม?
unique(c(unique(X[,t]), unique(Y[,t]))
- นี่ควรจะมีประสิทธิภาพหน่วยความจำมากกว่าเนื่องจากเป็นการรวมสองรายการที่จะน้อยกว่าหรือเท่ากับจำนวนแถวใน X และ Y .
Y[X]
ถ้าคุณต้องการเข้าร่วม outer ซ้ายของX[Y]
และrbind(Y[X],X[Y])
ถ้าคุณต้องการด้านนอกเต็มรูปแบบเข้าร่วม