Satu-ke-Banyak Kiri Gabung/Gabung di Data.Tabel di R

Jika Anda mengetahui jawaban atas pertanyaan ini di tempat lain, harap beri tahu saya, tetapi saya mencari dan membaca sejumlah besar topik bergabung terkait data.table serta intro paket dan FAQ dan masih belum menemukan jawabannya. Pada dasarnya saya mencari sesuatu seperti gabungan kiri yang fleksibel dan saya berpikir mengatur kunci secara langsung bahwa A[B] akan berhasil, tetapi ternyata tidak.

Pada dasarnya saya memiliki dua kumpulan data, A dan B (contoh di bawah). Saya ingin menambahkan data di A ke B berdasarkan pencocokan id dan tahun mereka, sehingga menghasilkan sesuatu seperti C. Ada beberapa hal yang membedakannya dari contoh yang pernah saya lihat. Pertama, ini satu ke banyak berdasarkan beberapa kunci (di sini id dan tahun). Kedua, saya tidak ingin semua kemungkinan kombinasi, artinya jika informasi di A tidak diperlukan di B maka informasi itu tidak ditambahkan. Ketiga, saya ingin mempertahankan B jika data di A tidak tersedia (jadi bukan hanya persimpangannya).

Sekali lagi, saya pikir sesuatu seperti mengatur kunci di A dan B menjadi id dan tahun, lalu C = A[B] akan memberi saya jawabannya, tetapi saya mendapatkan pesan kesalahan yang mengatakan bahwa lebih banyak (banyak, banyak) baris lagi yang ada di Hasilnya, memicu peringatan Cartesian. Namun, hasilnya harus memiliki jumlah baris yang sama persis dengan B, jadi tidak jelas bagi saya apa kesalahan yang saya lakukan.

Setiap saran atau wawasan sangat dihargai!

A
#    id   year   var1    var2
#    1    2010    10     20
#    1    2011    70     20
#    1    2012    90     30
#    1    2013    40     50 
#    2    2010    30     30
#    2    2011    50     60
#    2    2012    80     10
#    2    2013    90     80 
#    3    2010    50     50
#    3    2011    20     40
#    3    2012    90     30
#    3    2013    60     70 


B
#    id2  year    id    var3
#    1    2010    1     20
#    1    2011    1     20
#    1    2012    3     30
#    1    2013    4     50 
#    2    2010    1     30
#    2    2011    1     60
#    2    2012    1     10
#    2    2013    2     80 
#    3    2010    3     50
#    3    2011    2     40
#    3    2012    3     30
#    3    2013    2     70 

C
#    id2  year    id    var3   var1   var2
#    1    2010    1     20      10     20
#    1    2011    1     20      70     20
#    1    2012    3     30      90     30
#    1    2013    4     50      NA     NA 
#    2    2010    1     30      10     20
#    2    2011    1     60      70     20
#    2    2012    1     10      90     30
#    2    2013    2     80      90     80 
#    3    2010    3     50      50     50
#    3    2011    2     40      50     60
#    3    2012    3     30      90     30
#    3    2013    2     70      90     80  

person DaedalusBloom    schedule 01.10.2014    source sumber
comment
Harap berikan data dengan cara yang dapat kami salin/tempel, dan kode yang Anda coba yang menghasilkan pesan kesalahan.   -  person Arun    schedule 02.10.2014
comment
Saya tidak tahu sintaks tabel data, dan dengan semua karakter komentar itu saya terlalu malas untuk memasukkan data Anda ke R dan memeriksa (gunakan dput lain kali!), tetapi apakah merge(x = A, y = B, by.x = c("id", "year"), by.y = c("id2", "year"), all.y = T) yang Anda cari?   -  person Gregor Thomas    schedule 02.10.2014
comment
kamu setting kuncinya untuk apa? Selain itu, apakah Anda menggunakan versi stabil data.table (1.9.2) atau versi dev (1.9.3).   -  person Ricardo Saporta    schedule 02.10.2014
comment
@Gregor - Anda harus memeriksa overflow::soread() jika Anda benci menyalin/menempel dari SO. Ini sangat nyaman.   -  person Rich Scriven    schedule 02.10.2014
comment
@RichardScriven terima kasih atas rekomendasinya!   -  person Gregor Thomas    schedule 02.10.2014
comment
@Arun Seperti disebutkan di bawah, saya mengalami masalah dalam mereproduksi kesalahan, jadi saya akan mencoba memikirkan contoh yang lebih baik dan kemudian memperbarui pertanyaannya.   -  person DaedalusBloom    schedule 02.10.2014
comment
@RicardoSaporta, kunci yang saya gunakan adalah id dan tahun.   -  person DaedalusBloom    schedule 02.10.2014


Jawaban (1)


Anda tidak menunjukkan apa yang ingin Anda lihat sebagai hasil akhir. Anda memiliki tiga opsi utama:

 A[B]
 B[A]
 merge(A, B, all=TRUE)

Perhatikan bahwa kesalahan allow.cartesian adalah sesuatu yang akan Anda lihat jika ada kunci duplikat di tabel penggabungan. Dalam hal ini Anda cukup menyetel tandanya ke TRUE atau menghapus duplikatnya

 B[unique(A)]
 # or
 B[A, allow=TRUE]

setkey(A, id, year)
setkey(B, id, year)


A[B]
#     id year var1 var2 id2 var3
#  1:  1 2010   10   20   1   20
#  2:  1 2010   10   20   2   30
#  3:  1 2011   70   20   1   20
#  4:  1 2011   70   20   2   60
#  5:  1 2012   90   30   2   10
#  6:  2 2011   50   60   3   40
#  7:  2 2013   90   80   2   80
#  8:  2 2013   90   80   3   70
#  9:  3 2010   50   50   3   50
# 10:  3 2012   90   30   1   30
# 11:  3 2012   90   30   3   30
# 12:  4 2013   NA   NA   1   50

B[A, allow=TRUE]
#     id year id2 var3 var1 var2
#  1:  1 2010   1   20   10   20
#  2:  1 2010   2   30   10   20
#  3:  1 2011   1   20   70   20
#  4:  1 2011   2   60   70   20
#  5:  1 2012   2   10   90   30
#  6:  1 2013  NA   NA   40   50
#  7:  2 2010  NA   NA   30   30
#  8:  2 2011   3   40   50   60
#  9:  2 2012  NA   NA   80   10
# 10:  2 2013   2   80   90   80
# 11:  2 2013   3   70   90   80
# 12:  3 2010   3   50   50   50
# 13:  3 2011  NA   NA   20   40
# 14:  3 2012   1   30   90   30
# 15:  3 2012   3   30   90   30
# 16:  3 2013  NA   NA   60   70

merge(A, B, all=TRUE, allow=TRUE)
#     id year var1 var2 id2 var3
#  1:  1 2010   10   20   1   20
#  2:  1 2010   10   20   2   30
#  3:  1 2011   70   20   1   20
#  4:  1 2011   70   20   2   60
#  5:  1 2012   90   30   2   10
#  6:  1 2013   40   50  NA   NA
#  7:  2 2010   30   30  NA   NA
#  8:  2 2011   50   60   3   40
#  9:  2 2012   80   10  NA   NA
# 10:  2 2013   90   80   2   80
# 11:  2 2013   90   80   3   70
# 12:  3 2010   50   50   3   50
# 13:  3 2011   20   40  NA   NA
# 14:  3 2012   90   30   1   30
# 15:  3 2012   90   30   3   30
# 16:  3 2013   60   70  NA   NA
# 17:  4 2013   NA   NA   1   50
person Ricardo Saporta    schedule 01.10.2014
comment
Maaf jika saya tidak jelas. Saya mencoba untuk mendapatkan hasil seperti C. Seperti yang Anda tunjukkan dengan benar, A[B] sepertinya melakukan ini dengan contoh yang saya berikan. Sayangnya data saya jauh lebih besar dan kompleks, jadi saya belum menemukan cara yang lebih baik untuk mereproduksi masalah tersebut di sini. Kunci duplikat sepertinya tidak menjadi masalah, kecuali saya salah memahami konsepnya. Misalnya, di B, kombinasi id dan tahun terjadi beberapa kali tetapi hasilnya, C, masih memiliki nomor baris yang sama dengan B. Saya kira saya harus memikirkan lebih banyak tentang cara mereproduksi kesalahan di sini. Terima kasih atas waktu dan bantuan Anda! - person DaedalusBloom; 02.10.2014
comment
Ah, saya tahu masalahnya adalah keunikan kunci di A (atau analogi A di data saya) bukan di B. Saya pikir saya sudah memeriksa keunikan A, jadi saya belum mempertimbangkannya. Terima kasih telah membantu saya mempertimbangkan kemungkinan masalah karena ketidakmampuan saya mereproduksi kesalahan sebenarnya. Saya menghargai bantuannya! - person DaedalusBloom; 02.10.2014