2014-09-01 21 views
7

Ein Beispielfall verbinden ist hier:Wie ein data.table mit mehreren Spalten und mehreren Werten

xc = c(1, 2, 4) 
yc = c(6, 9) 
DT[J(xc, yc), nomatch=0] 
    x y z 
1: 1 6 3 

Diese Verwendung von J() gibt nur einzelne Zeile:

DT = data.table(x=1:4, y=6:9, z=3:6) 
setkey(DT, x, y) 

Joinspalten mehrere Werte haben . Eigentlich möchte ich als Operator %in% beitreten.

DT[x %in% xc & y %in% yc] 
    x y z 
1: 1 6 3 
2: 4 9 6 

Aber mit %in% Operator macht die Suche eines Vektor-Scan, die im Vergleich zu binärer Suche sehr langsam ist. Um binäre Suche zu haben, baue ich jede mögliche Kombination von Werten verbinden:

xc2 = rep(xc, length(yc)) 
yc2 = unlist(lapply(yc, rep, length(xc))) 
DT[J(xc2, yc2), nomatch=0] 
    x y z 
1: 1 6 3 
2: 4 9 6 

Aber Gebäude xc2, YC2 auf diese Weise zu lesen Code erschwert. Gibt es einen besseren Weg, um die Geschwindigkeit der binären Suche und die Einfachheit des Operators %in% in diesem Fall zu haben?

+11

Ich denke, Sie suchen nach * Cross Join * - das ist die Funktion 'CJ'. Versuchen Sie 'DT [CJ (xc, yc), nomatch = 0L]'. Fühlen Sie sich frei, dies als die Antwort (wenn richtig) zu posten und zu akzeptieren. – Arun

Antwort

1

Beantworten Sie diese Frage aus DT-Tag offene Fragen zu entfernen.
Code aus Aruns Kommentar DT[CJ(xc,yc), nomatch=0L] wird die Aufgabe erledigen.

Verwandte Themen