2012-11-21 12 views
11

appena se c'è un modo efficace per fare outer join con la tabella di dati come ad esempioouter join data.table R

a <- data.table(a=c(1,2,3),b=c(3,4,5)) 
b <- data.table(a=c(1,2),k=c(1,2)) 
merge(a,b,by="a",all.x=T) 

questo funziona bene, ma non è efficiente come la join interno con i dati più grande , quanto segue è molto veloce, ma quanto sopra è molto lento.

setkey(a,a) 
setkey(b,a) 
a[b,] 
+0

Nel primo caso, 'a' e' b' non vengono digitati, quindi 'merge' dovrà prima chiave (come copie locali (tipo di) all'interno di unione perché non vuole cambiare' a' e ' b' nel campo delle chiamate). Nel secondo caso sei stato felice di cambiare 'a' e' b' digitandoli (hai incluso il tempo per farlo?) E quindi 'a [b]' è veloce. Ma anche così sono sorpreso che c'è una grande differenza. 'merge' _should_ essere abbastanza paragonabile a' x [y] '. Si prega di indicare le informazioni sulla versione quando si parla di tempistiche: sei in v1.8.6? E anche il tuo "molto veloce" e "molto lento" potrebbe essere la mia idea di "simile"! Quali sono i tempi attuali? –

+0

È molto facile fare benchmark in modo inadeguato/inappropriato, quindi dobbiamo assolutamente vedere il tuo metodo di sincronizzazione prima di dire qualsiasi cosa. –

+0

Non ho potuto fornire il tempo per questo dato che il primo è esploso in memoria e si è bloccato durante la sessione R (unendo circa 19 milioni di linee). Farò un benchmark con un set più piccolo e posterò i risultati. (versione 1.8.2, sto usando) – jamborta

risposta

10

b[a,] è il "outer join" che stai cercando.

Dai uno sguardo allo ?merge.data.table per ulteriori dettagli.

+0

grazie! quindi un [b,] o b [a,] è essenzialmente un join di sinistra (in termini SQL)? L'ho sempre pensato come un'adesione interiore. – jamborta

+0

@jamborta Vedi FAQ 2.16 ('nomatch = 0 | NA') –

+1

grazie Matthew, questo lo spiega. Presumo che in questo modo non puoi fare il join esterno completo (solo sinistra esterna e interna)? – jamborta