Data.table: A união com o índice fornece resultados inesperados se o nome da coluna indexada for um prefixo do nome da coluna de união

Criado em 6 nov. 2017  ·  3Comentários  ·  Fonte: Rdatatable/data.table

Este problema é baseado na minha pergunta sobre stackoverflow .

Para uma configuração específica de dois data.tables, uma junção não fornece os resultados que estou esperando.

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

Para as variações a seguir, a junção funciona conforme o esperado. O comportamento inesperado acima parece estar ocorrendo apenas se existir um índice em uma coluna com um nome de coluna sendo o prefixo do nome da coluna de junção e ambos tendo conteúdo de texto semelhante.

# 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

Observe que o mesmo comportamento ocorre para data.table 1.10.4 e R.Version 3.4.2 no Windows e também no Ubuntu Linux 14.04.

bug joins

Comentários muito úteis

Essa foi uma solução fácil (consulte a solicitação de pull). Obrigado por relatar o bug e espero que o problema seja resolvido agora.

Todos 3 comentários

Este parece ser um bug que merece ser consertado. Vou cavar nisso e tentar consertar conforme meu tempo permitir.

Essa foi uma solução fácil (consulte a solicitação de pull). Obrigado por relatar o bug e espero que o problema seja resolvido agora.

@MarkusBonsch Acabei de aplicar seu compromisso com a versão dev mais recente de data.table e testei com os dois exemplos da pergunta vinculada ao SO.

Ambos os exemplos funcionam agora como esperado!

Muitos THX para a solução rápida.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

DavidArenburg picture DavidArenburg  ·  3Comentários

st-pasha picture st-pasha  ·  3Comentários

mattdowle picture mattdowle  ·  3Comentários

jangorecki picture jangorecki  ·  3Comentários

mattdowle picture mattdowle  ·  3Comentários