2013-04-02 3 views
5

Se si specificano n colonne come chiave di un data.table, sono consapevole che posso unirmi a un numero inferiore di colonne rispetto a definito in quella chiave fintanto che mi unisco allo head di key(DT). Ad esempio, per n = 2:Datafile data.table non testa (tasto (DT), m), utilizzando ricerca binaria non vector scan

X = data.table(A=rep(1:5, each=2), B=rep(1:2, each=5), key=c('A','B')) 
X 
    A B 
1: 1 1 
2: 1 1 
3: 2 1 
4: 2 1 
5: 3 1 
6: 3 2 
7: 4 2 
8: 4 2 
9: 5 2 
10: 5 2 

X[J(3)] 
    A B 
1: 3 1 
2: 3 2 

Lì uniti solo alla prima colonna della chiave 2-colonna DT. So che posso aderire a entrambe le colonne della chiave in questo modo:

X[J(3,1)] 
    A B 
1: 3 1 

Ma come faccio sottoinsieme utilizzando solo la seconda Colum colonna della chiave (ad esempio B==2), ma ancora con ricerca binaria non eseguire la scansione di vettore? Sono consapevole del fatto che è un duplicato di:

Subsetting data.table by 2nd column only of a 2 column key, using binary search not vector scan

così mi piacerebbe generalizzare questa domanda a n. Il mio set di dati ha circa un milione di righe e la soluzione fornita nella domanda dup collegata sopra non sembra essere ottimale.

+2

È solo 'X [B == 2,]'. Letture consigliate: http://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.pdf –

+2

@MatthewPlourde, sei sicuro? La vignetta di riferimento ha la seguente frase che rende la soluzione ottimale non ottimale: "Utilizziamo la chiave per sfruttare il fatto che la tabella è ordinata e utilizzare la ricerca binaria per trovare le righe corrispondenti. Non è stata eseguita la scansione vettoriale; non abbiamo usato ==. " – GSee

+0

@GSee grazie, hai assolutamente ragione. scuse, mio ​​errore. –

risposta

5

Ecco una semplice funzione che estrarrà i valori univoci corretti e restituirà una tabella di dati da utilizzare come chiave.

X <- data.table(A=rep(1:5, each=4), B=rep(1:4, each=5), 
        C = letters[1:20], key=c('A','B','C')) 
make.key <- function(ddd, what){ 
    # the names of the key columns 
    zzz <- key(ddd) 
    # the key columns you wish to keep all unique values 
    whichUnique <- setdiff(zzz, names(what)) 
    ## unique data.table (when keyed) 
    ud <- lapply([,whichUnique, with = FALSE], unique) 
    ## append the `what` columns and a Cross Join of the new 
    ## key columns 
    do.call(CJ, c(ud,what)[zzz]) 
} 

X[make.key(X, what = list(C = c('a','b'))),nomatch=0] 
## A B C 
## 1: 1 1 a 
## 2: 1 1 b 

io non sono sicuro che questo sarà qualsiasi più veloce di un paio di scansioni vettoriali su un grande data.table però.

1

calcolata tasti secondari è sulla lista funzionalità richiesta:

FR#1007 Build in secondary keys

Nel frattempo siamo bloccati sia con scansione vettoriale, o l'approccio utilizzato nella risposta alla n = 2 caso collegata nel domanda (che @mnel generalizza bene nella sua risposta).