2013-02-24 7 views
6

Moje pytanie dotyczy R data.table z wieloma kluczami. wziąć ten przykład:Połączenie łączenia z niepowiązaniami w data.table?

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

i załóżmy chcę odmianę "x nie jest równe B i Y nie równe 3", jak tu:

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 

Wahania chcę jest „x EQUAL b i y NOT równe 3 ", jak tutaj:

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

Czy istnieje jakaś możliwość powiedzenia J(), aby zanegować niektóre klucze? Dzięki!

+1

znajdę składnię follow nieco bardziej przejrzysty: 'DT [x == 'b' & y! = 3] ' –

+2

Witam @GaryWeissman, twoja składnia implikuje skanowanie wektorowe. Celem operacji data.table i join jest unikanie tych, używając kluczy. Ale myślę, że masz rację, że dla użytkowników non data.table, które jest łatwiejsze do zrozumienia. –

+0

Nie sądzę, że funkcja 'J' obsługuje non-concordant operatorów logicznych między argumentami. Wierzę, że powyższa składnia jest nadal szybsza w DT niż w DF. –

Odpowiedz

6

Dla kompozytowych kluczy można użyć następujących

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

Generalnie, można łańcuch razem kilka [ ] [ ] filtrować w dół do wyników trzeba.



pamiętać, że można również łatwo używać wyrażeń logicznych w i z data.table.
Ta składnia jest po prostu skróconą wygodą.

Możesz użyć prawie wszystkiego, co można znaleźć w klauzuli if, z zaletą dostępu do nazw kolumn jako zmiennych.

W Twoim konkretnym przykładzie, należy użyć x=="b" & y != 3 notatka pojedynczy & nie &&.

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

Można również połączyć skany wektorowych z binarnym poszukiwaniu data.table następująco

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

bingo! Dzięki za tonę! –