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?
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
@Frank, dovresti fare una risposta. – Arun