Bu, data.table birleştirme sözdizimi hakkında felsefi bir sorudur. Data.tables için gittikçe daha fazla kullanım buluyorum, ancak hala öğreniyorum ...
X[Y]
Data.tables için birleştirme formatı çok kısa, kullanışlı ve verimli, ancak söyleyebileceğim kadarıyla, yalnızca iç birleşimleri ve sağ dış birleşimleri destekliyor. Sol veya tam bir dış birleşim elde etmek için şunu kullanmam gerekiyor merge
:
X[Y, nomatch = NA]
- Y'deki tüm satırlar - sağ dış birleştirme (varsayılan)X[Y, nomatch = 0]
- yalnızca hem X hem de Y'de eşleşmeleri olan satırlar - iç birleşimmerge(X, Y, all = TRUE)
- hem X hem de Y'deki tüm satırlar - tam dış birleştirmemerge(X, Y, all.x = TRUE)
- X'teki tüm satırlar - sol dış birleştirme
Bana öyle geliyor ki, X[Y]
birleştirme formatı 4 tür birleştirmeyi destekleseydi kullanışlı olurdu . Yalnızca iki tür birleştirmenin desteklenmesinin bir nedeni var mı?
Benim için nomatch = 0
ve nomatch = NA
parametre değerleri, gerçekleştirilen eylemler için pek sezgisel değil. Anlamama ve hatırlamak açısından daha kolaydır merge
: sözdizimi all = TRUE
, all.x = TRUE
ve all.y = TRUE
. Yana X[Y]
operasyon benzer, merge
çok daha fazla match
, neden kullanmaz merge
yerine katılır için sözdizimi match
işlevin nomatch
parametresi?
İşte 4 birleştirme türünün kod örnekleri:
# 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
Güncelleme: data.table v1.9.6 on=
, birincil anahtar dışındaki alanlarda ad hoc birleştirmelere izin veren sözdizimini tanıttı . jangorecki cevabı soruya (birleştirme) veri çerçevelerini (iç, dış, sol, sağ) katılmak için nasıl? data.table'ın işleyebileceği ek birleştirme türü örnekleri sağlar.
unique()
, tam birleştirme için aşağıdaki yaklaşımınızın tercih edildiğini rbind(Y[X],X[Y])
varsayıyorum. Bu doğru mu?
unique(c(unique(X[,t]), unique(Y[,t]))
- bu, yalnızca X ve Y'deki satır sayısından daha az veya ona eşit olacak iki listeyi birleştireceğinden daha verimli bellek olmalıdır. .
Y[X]
isterseniz sol dış birleşim içindeX[Y]
verbind(Y[X],X[Y])
bir tam dış isterseniz katılma