2013-02-24 1 views
6

La mia domanda riguarda R data.table con più chiavi. prendere questo esempio:Combinazione di Join with Not Join in data.table?

library(data.table) 
example(data.table) 
key(DT) 
[1] "x" "y" 

e immagino voglio una variazione di "b x è uguale e y è uguale a 3", come qui:

DT[!J("b",3)] 
    x y v v2 m 
1: a 1 42 NA 42 
2: a 3 42 NA 42 
3: a 6 42 NA 42 
4: b 1 4 84 5 
5: b 6 6 84 5 
6: c 1 7 NA 8 
7: c 3 8 NA 8 
8: c 6 9 NA 8 

La variazione voglio è "x EQUAL b e y NOT uguale a 3 ", come qui:

DT[J("b",!3)] 
Error in `[.data.table`(DT, J("b", !3)) : 
    typeof x.y (double) != typeof i.V2 (logical) 

Qualche possibilità di dire a J() di annullare alcune chiavi? Grazie!

+1

trovo la sintassi seguito un po 'più trasparente: 'DT [x == 'b' & y! = 3] ' –

+2

Ciao @GaryWeissman, la tua sintassi implica una scansione vettoriale. Il punto delle operazioni data.table e join è di evitare esattamente quelli, usando i tasti. Ma immagino che tu abbia ragione che per gli utenti non data.table è più facile da capire. –

+0

Non penso che la funzione 'J' supporti operatori logici non concordanti tra gli argomenti. Credo che la sintassi precedente sia ancora più veloce in DT che in DF. –

risposta

6

Per chiavi composte è possibile utilizzare la seguente

DT[.("b")][!.(x, 3)] # x is the name of first column of key 

In generale, è possibile concatenare vari [ ] [ ] filtrare all'interno i risultati desiderati.



Si noti che è anche possibile utilizzare facilmente le dichiarazioni logiche nella i di data.table.
Il J() - o ora .() - sintassi, è semplicemente una comodità abbreviata.

È possibile utilizzare quasi tutto ciò che andrebbe all'interno di una clausola if, con il vantaggio di accedere ai nomi delle colonne come variabili.

Nel tuo esempio specifico, si può usare x=="b" & y != 3 nota il singolo &, non &&.

DT[ x=="b" & y != 3] 

È possibile anche combinare scansioni vettore con la ricerca binaria di data.table come segue

DT[.("b")][y != 3] 
+0

bingo! Grazie mille! –