2013-04-02 7 views
5

Jeśli podam n kolumn jako klucz do data.table, jestem świadomy, że mogę dołączyć do mniejszej liczby kolumn niż zdefiniowane w tym kluczu, o ile dołączę do head z . Na przykład, dla N = 2:Podział danych na tabelę bez nagłówka (klawisz (DT), m), przy użyciu wyszukiwania binarnego bez skanowania wektorowego

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 

Tam połączone tylko w pierwszej kolumnie Klucza 2-rdzeniowego DT. Wiem, że mogę dołączyć do obu kolumnach klucza tak:

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

Ale jak mogę podzbiór używając tylko druga kolumna Columa klucza (np B==2), ale nadal nie używając wyszukiwania binarny wektor skanować? Zdaję sobie sprawę, że to duplikat:

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

więc chciałabym generalizować to pytanie n. Mój zbiór danych ma około miliona wierszy, a rozwiązanie dostarczone w podwójnym pytaniu powiązanym powyżej nie wydaje się optymalne.

+2

To tylko 'X [B ==2,]'. Sugerowane czytanie: http://cran.r-project.org/web/packages/data.table/vignettes/datatable-intro.pdf –

+2

@MatthewPlourde, jesteś pewien? Winieta, do której się odwołujesz, ma następujące zdanie, które sprawia, że ​​twoje rozwiązanie brzmi nieoptymalnie: "Używamy klucza, aby wykorzystać fakt, że tabela jest posortowana i użyć wyszukiwania binarnego, aby znaleźć pasujące wiersze. nie użyliśmy ==. " – GSee

+0

@GSee dziękuję, masz absolutną rację. przepraszam, mój błąd. –

Odpowiedz

5

Oto prosta funkcja, która wyodrębni prawidłowe unikatowe wartości i zwróci tabelę danych do użycia jako klucz.

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 

Nie jestem pewien, czy będzie to szybsze niż kilka skanów wektorowych na dużym pliku data.table.

1

Dodawanie kluczy wtórnych znajduje się na liście żądanie cecha:

FR#1007 Build in secondary keys

W międzyczasie jesteśmy skazani albo skan wektora lub podejścia stosowanego w odpowiedzi na n = 2 przypadku połączonych w pytanie (które @mel ładnie generalizuje w swojej odpowiedzi).

Powiązane problemy