2013-08-20 5 views
5

Dies ist von den Beispielen in der data.table Einführung. Siehe http://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.pdfdata.table Ergebnisse unterscheiden sich zwischen Vektorsuche und binärer Suche nach fehlenden Daten

Die Beispiele gehen davon aus, dass eine binäre Suche schneller als ein Vektor-Scan ist und genau das gleiche Ergebnis liefert (siehe Seite 5). Also hier ist mein Beispiel:

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")] 

Wie erwartet, gibt dies genau das gleiche Ergebnis zurück. Der eine scannt jede Zeile, der andere ist eine binäre Suche. Wenn jedoch Zeilen vorhanden sind, die nicht vorhanden sind, unterscheiden sich die Ergebnisse. Siehe den folgenden Code:

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

bekomme ich folgende Ergebnisse

# > 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) Warum ist dies der Fall.?

b.) Gibt es eine Möglichkeit, das Verhalten der binären Suche so zu ändern, dass Ergebnisse nicht vorhandener Zeilen nicht zurückgegeben werden?

+4

Ich denke, 'J' ist mehr als nur eine binäre Suche; Es ist ein "Beitritt". Für jede Tastenkombination ist es gegeben, es muss etwas zurückgegeben werden. Um es auszuschalten: 'DT [J ('R', 'H'), nomatch = 0]' – Frank

+1

@Frank, du solltest das eine Antwort geben. – Arun

Antwort

10

Ich denke, J ist mehr als nur eine binäre Suche; Es ist ein "Beitritt". Für jede Tastenkombination ist es gegeben, es muss etwas zurückgegeben werden. Um es auszuschalten:

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

Wenn es hilft, verweist Seite 6 der Dokumentation OP auf Gespräche über dieses "Join" -Konzept. – Arun

Verwandte Themen