2013-08-20 8 views
5

Ciò è dagli esempi nell'introduzione data.table. Vedi http://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.pdfdata.table i risultati differiscono tra ricerca vettoriale e ricerca binaria per dati mancanti

Gli esempi dimostrano che una ricerca binaria è più veloce di una scansione vettoriale e produce esattamente lo stesso risultato (vedere pagina 5). Quindi, ecco il mio esempio:

library(data.table) 
grpsize = ceiling(10000/26^2) 
DF <- data.frame(x=rep(LETTERS,each=26*grpsize), y=rep(letters,each=grpsize),v=runif(grpsize*26^2), stringsAsFactors=FALSE) 
DT = data.table(DF) 
setkey(DT,x,y) 

DT[x=='R' & y=='h'] 
DT[J("R","h")] 

Come previsto, ciò restituisce esattamente lo stesso risultato. Uno esegue la scansione di ogni riga, l'altro è una ricerca binaria. Tuttavia, quando ci sono righe che non esistono i risultati differiscono. Vedere il seguente codice:

DT[x=='R' & y=='H'] 
DT[J("R","H")] 

io ottenere i seguenti risultati

# > DT[x=='R' & y=='H', ] 
# Empty data.table (0 rows) of 3 cols: x,y,v 

# > DT[J("R","H")] 
# x y v 
# 1: R H NA 

a) Perché è questo il caso.?

b.) Esiste un modo per modificare il comportamento della ricerca binaria per non restituire risultati di righe non esistenti?

+4

Immagino che 'J' sia più di una semplice ricerca binaria; è un "join". Per ogni combinazione di tasti assegnata, deve restituire qualcosa. Per disattivarlo: 'DT [J ('R', 'H'), nomatch = 0]' – Frank

+1

@Frank, dovresti fare una risposta. – Arun

risposta

10

Immagino che J sia più di una semplice ricerca binaria; è un "join". Per ogni combinazione di tasti assegnata, deve restituire qualcosa. Per disattivarlo:

DT[J('R','H'),nomatch=0] 
+1

Se aiuta, la pagina 6 della documentazione OP fa riferimento ai discorsi su questo concetto di "join". – Arun

Problemi correlati