Data.table: Join with index fournit des résultats inattendus si le nom de la colonne indexée est un préfixe du nom de la colonne de jointure

Créé le 6 nov. 2017  ·  3Commentaires  ·  Source: Rdatatable/data.table

Ce problème est basé sur ma question sur le stackoverflow .

Pour une configuration spécifique de deux data.tables, une jointure ne fournit pas les résultats attendus.

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

Pour les variantes suivantes, la jointure fonctionne comme prévu. Le comportement inattendu ci-dessus semble se produire uniquement si un index existe sur une colonne dont le nom de colonne est le préfixe du nom de la colonne de jointure et les deux ont un contenu textuel similaire.

# 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

Veuillez noter que le même comportement se produit pour data.table 1.10.4 et R.Version 3.4.2 sous Windows et aussi Ubuntu Linux 14.04.

bug joins

Commentaire le plus utile

C'était une solution facile (voir pull request). Merci d'avoir signalé le bogue et espérons que le problème est résolu maintenant.

Tous les 3 commentaires

Cela semble être un bogue qui mérite d'être corrigé. Je vais creuser dedans et essayer de réparer comme mon temps le permet.

C'était une solution facile (voir pull request). Merci d'avoir signalé le bogue et espérons que le problème est résolu maintenant.

@MarkusBonsch Je viens d'appliquer votre commit à la version de développement la plus récente de data.table et je l'ai testé avec les deux exemples de la question SO liée.

Les deux exemples fonctionnent maintenant comme prévu!

Beaucoup de THX pour la solution rapide.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

sengoku93 picture sengoku93  ·  3Commentaires

mattdowle picture mattdowle  ·  3Commentaires

andschar picture andschar  ·  3Commentaires

alex46015 picture alex46015  ·  3Commentaires

jangorecki picture jangorecki  ·  3Commentaires