Data.table: Bergabung dengan indeks memberikan hasil yang tidak diharapkan jika nama kolom yang diindeks adalah awalan dari nama kolom gabungan

Dibuat pada 6 Nov 2017  ·  3Komentar  ·  Sumber: Rdatatable/data.table

Masalah ini didasarkan pada pertanyaan saya

Untuk pengaturan spesifik dari dua data.tables, gabungan tidak memberikan hasil yang saya harapkan.

library(data.table)

# In the code below the join does not deliver the result I would expect
DT1 <- data.table(colname=c("test1","test2","test2","test3"), colname_with_suffix=c("other","test","includes test within","other"))
DT2 <- data.table(lookup=c("test1","test2","test3"), lookup_result=c(1,2,3))
DT1[colname_with_suffix == "not found", ]  # automatically creates index on colname_with_suffix
DT1[DT2, lookup_result := i.lookup_result, on=c("colname"="lookup")][]
# PLEASE NOTE: same result with slightly different syntax: DT1[DT2, lookup_result := i.lookup_result, on=c(colname="lookup")][]
# colname  colname_with_suffix lookup_result
# 1:   test1                other         NA
# 2:   test2                 test         NA
# 3:   test2 includes test within         NA
# 4:   test3                other          3


# Expected result:
 # colname  colname_with_suffix lookup_result
# 1:   test1                other          1
# 2:   test2                 test          2
# 3:   test2 includes test within          2
# 4:   test3                other          3

Untuk variasi berikut, gabungan berfungsi seperti yang diharapkan. Perilaku tidak terduga di atas tampaknya hanya terjadi, jika indeks ada di kolom yang memiliki nama kolom menjadi awalan dari nama kolom gabungan dan keduanya memiliki konten teks yang serupa.

# For all following alternatives the join delivers the correct result

# (a) Same data tables as above, but no index
DT1 <- data.table(colname=c("test1","test2","test2","test3"), colname_with_suffix=c("other","test","includes test within","other"))
DT2 <- data.table(lookup=c("test1","test2","test3"), lookup_result=c(1,2,3))
DT1[DT2, lookup_result := i.lookup_result, on=c("colname"="lookup")][]

# (b) Index on DT2, but completely different values in indexed column than in join column
DT1 <- data.table(colname=c("test1","test2","test2","test3"), colname_with_suffix=c("other","other","other","other"))
DT2 <- data.table(lookup=c("test1","test2","test3"), lookup_result=c(1,2,3))
DT1[colname_with_suffix == "not found", ]  # automatically creates index on colname_with_suffix
DT1[DT2, lookup_result := i.lookup_result, on=c("colname"="lookup")][]

# (c) Index on DT2, similar values in indexed column, but indexed column name is not a prefix of join column name
DT1 <- data.table(colname=c("test1","test2","test2","test3"), x.colname_with_suffix=c("other","test","includes test within","other"))
DT2 <- data.table(lookup=c("test1","test2","test3"), lookup_result=c(1,2,3))
DT1[x.colname_with_suffix == "not found", ]  # automatically creates index on x.colname_with_suffix
DT1[DT2, lookup_result := i.lookup_result, on=c("colname"="lookup")][]

SessionInfo:

# R version 3.3.2 (2016-10-31)
# Platform: x86_64-w64-mingw32/x64 (64-bit)
# Running under: Windows 7 x64 (build 7601) Service Pack 1
# 
# locale:
#     [1] LC_COLLATE=German_Germany.1252  LC_CTYPE=German_Germany.1252    LC_MONETARY=German_Germany.1252 LC_NUMERIC=C                    LC_TIME=German_Germany.1252    
# 
# attached base packages:
#     [1] stats     graphics  grDevices utils     datasets  methods   base     
# 
# other attached packages:
#     [1] data.table_1.10.0
# 
# loaded via a namespace (and not attached):
#     [1] tools_3.3.2

Harap dicatat bahwa perilaku yang sama terjadi untuk data.table 1.10.4 dan R.Version 3.4.2 di bawah Windows dan juga Ubuntu Linux 14.04.

bug joins

Komentar yang paling membantu

Ini adalah perbaikan yang mudah (lihat permintaan tarik). Terima kasih telah melaporkan bug dan berharap masalah ini diselesaikan sekarang.

Semua 3 komentar

Tampaknya ini adalah bug yang perlu diperbaiki. Saya akan menggali lebih dalam dan mencoba memperbaikinya jika waktu saya memungkinkan.

Ini adalah perbaikan yang mudah (lihat permintaan tarik). Terima kasih telah melaporkan bug dan berharap masalah ini diselesaikan sekarang.

@MarkusBonsch Saya baru saja menerapkan komitmen Anda ke versi dev terbaru data.table dan mengujinya dengan dua contoh dari pertanyaan SO yang ditautkan.

Kedua contoh bekerja sekarang seperti yang diharapkan!

Banyak THX untuk perbaikan cepat.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat