Ini adalah sedikit pertanyaan filosofis tentang sintaks gabungan data.table. Saya menemukan semakin banyak kegunaan untuk data.tables, tetapi masih belajar ...
Format X[Y]
gabungan untuk data.tables sangat ringkas, praktis dan efisien, tetapi sejauh yang saya tahu, ini hanya mendukung gabungan dalam dan gabungan luar kanan. Untuk mendapatkan gabungan luar kiri atau penuh, saya perlu menggunakan merge
:
X[Y, nomatch = NA]
- semua baris di Y - gabungan luar kanan (default)X[Y, nomatch = 0]
- hanya baris dengan kecocokan di X dan Y - gabungan dalammerge(X, Y, all = TRUE)
- semua baris dari X dan Y - gabungan luar penuhmerge(X, Y, all.x = TRUE)
- semua baris di X - gabungan luar kiri
Menurut saya, akan berguna jika X[Y]
format gabungan mendukung semua 4 jenis gabungan. Apakah ada alasan mengapa hanya dua jenis gabungan yang didukung?
Bagi saya, nilai parameter nomatch = 0
dan nomatch = NA
tidak terlalu intuitif untuk tindakan yang dilakukan. Hal ini lebih mudah bagi saya untuk memahami dan mengingat merge
sintaks: all = TRUE
, all.x = TRUE
dan all.y = TRUE
. Karena X[Y]
operasi merge
lebih menyerupai daripada match
, mengapa tidak menggunakan merge
sintaks untuk gabungan daripada parameter match
fungsi nomatch
?
Berikut adalah contoh kode dari 4 jenis gabungan:
# 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
Pembaruan: data.table v1.9.6 memperkenalkan on=
sintaks, yang memungkinkan ad hoc bergabung pada bidang selain kunci utama. jawaban jangorecki atas pertanyaan Bagaimana cara menggabungkan (menggabungkan) bingkai data (dalam, luar, kiri, kanan)? menyediakan beberapa contoh tipe gabungan tambahan yang dapat ditangani oleh data.table.
unique()
pendekatan Anda di bawah ini untuk penggabungan penuh lebih disukai rbind(Y[X],X[Y])
, karena rbind akan melibatkan penyalinan tabel. Apakah itu benar?
unique(c(unique(X[,t]), unique(Y[,t]))
- ini harus lebih hemat memori karena hanya menggabungkan dua daftar yang akan kurang dari atau sama dengan jumlah baris di X dan Y .
Y[X]
jika Anda ingin kiri luar bergabung dariX[Y]
danrbind(Y[X],X[Y])
jika Anda ingin penuh luar bergabung