2014-09-01 16 views
7

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?

+11

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

risposta

1

Risposta per rimuovere questa domanda dalle domande aperte del tag DT.
Il codice del commento di Arun DT[CJ(xc,yc), nomatch=0L] farà il lavoro.