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?
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