2017-10-20 15 views
0

J'essaie de joindre deux tables.table à l'aide d'une jointure interne. Il est possible qu'aucune correspondance ne puisse être trouvée, alors je veux un data.table vide avec les bons noms de col.La jointure interne data.table génère une erreur lorsqu'aucune correspondance n'est trouvée

dt1 <- data.table(A = c(1,2), B = c(1,2)) 
dt2 <- data.table(A = c(3,4), D = c(3,4)) 
setkey(dt1, A) 
setkey(dt2, A) 
dt1[dt2, nomatch = 0] 
Error in xj[i] : invalid subscript type 'list' 
merge(dt1, dt2, 
     all.x = F, 
     all.y = F) 

Empty data.table (0 rows) of 3 cols: A,B,D 

La deuxième méthode me donne la réponse désirée. Mais je préfère la première syntaxe car elle est plus rapide. Est-ce que quelqu'un sait comment je pourrais résoudre cette erreur, sans utiliser une instruction trycatch.

+1

Dans les versions récentes de data.table, vous n'avez pas besoin d'utiliser 'setkey', de sorte que vous pouvez réduire ce à une seule ligne de code: 'dt1 [dt2, on =" A ", nomatch = 0]'. Lisez la section sur l'indexation automatique sur la page [data.table] (https://github.com/Rdatatable/data.table/wiki/Getting-started) pour plus d'informations. – lmo

Répondre

1

Je ne peux pas reproduire votre erreur dans le premier exemple .. Je suppose que vous parlez

dt1[dt2, nomatch = 0] 

?

je reçois:

Empty data.table (0 rows) of 3 cols: A,B,D 

L'utilisation dernière version de R et data.table

0

Je pense qu'il est juste une faute de frappe là:

library(data.table) 
dt1 <- data.table(A = c(1,2), B = c(1,2)) 
dt2 <- data.table(A = c(3,4), D = c(3,4)) 

setkey(dt1, A) 
setkey(dt2, A) 
dt1[dt2, nomatch = 0] #instead of t1[t2, nomatch = 0] 
Empty data.table (0 rows) of 3 cols: A,B,D