Un caso ad esempio è qui:Come partecipare a una data.table con più colonne e valori multipli
DT = data.table(x=1:4, y=6:9, z=3:6)
setkey(DT, x, y)
Registrato colonne hanno più valori:
xc = c(1, 2, 4)
yc = c(6, 9)
DT[J(xc, yc), nomatch=0]
x y z
1: 1 6 3
Questo uso di J()
ritorni soltanto ad una corona . In realtà, voglio unirmi come operatore %in%
.
DT[x %in% xc & y %in% yc]
x y z
1: 1 6 3
2: 4 9 6
Ma usando %in%
operatore rende la ricerca una scansione vettoriale che è molto lenta rispetto alla ricerca binaria. Al fine di avere la ricerca binaria, costruisco ogni possibile combinazione di unire valori:
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
Ma costruzione xc2, YC2 in questo modo rende il codice difficile da leggere. C'è un modo migliore per avere la velocità della ricerca binaria e la semplicità dell'operatore %in%
in questo caso?
Penso che tu stia cercando * cross join * - che è la funzione 'CJ'. Prova 'DT [CJ (xc, yc), nomatch = 0L]'. Sentiti libero di postare questa risposta come risposta (se corretta) e accettarla. – Arun