2013-02-24 13 views
6

Meine Frage bezieht sich auf R data.table mit mehreren Schlüsseln. Nehmen Sie dieses Beispiel:Kombination von Join mit Nicht beitreten in data.table?

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

und nehme ich eine Variation wollen "x nicht gleich b und y 3 nicht gleich", wie hier:

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 

Die Variation ich will, ist „x EQUAL b und y nicht gleich 3" , wie hier in:

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

jede Chance zu sagen, J() einige Schlüssel zu negieren? Danke!

+1

ich die Folge Syntax etwas transparenter finden: 'DT [x == 'b' & y! = 3] ' –

+2

Hallo @GaryWeissman, deine Syntax impliziert einen Vektor-Scan. Der Punkt der data.table- und join-Operationen besteht darin, genau diese mithilfe von Schlüsseln zu vermeiden. Aber ich denke, Sie haben Recht, dass für Nicht-Data.Table-Benutzer, die leichter zu verstehen ist. –

+0

Ich glaube nicht, dass die 'J'-Funktion nicht-konkordante logische Operatoren zwischen Argumenten unterstützt. Ich glaube, die obige Syntax ist in DT immer noch schneller als in DF. –

Antwort

6

Für zusammengesetzte Schlüssel Sie die folgende

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

Im Allgemeinen verwenden können, können Sie verketten mehrere [ ] [ ] auf die Ergebnisse filtern nach unten Sie benötigen.



Beachten Sie, dass Sie auch leicht logische Aussagen in der i von data.table verwenden können.
Die J() - oder jetzt .() - Syntax, ist einfach eine Kurzschrift Bequemlichkeit.

Sie können fast alles verwenden, was in eine if-Klausel mit dem Vorteil des Zugriffs auf die Spaltennamen als Variablen gehen würde.

In Ihrem speziellen Beispiel würden Sie x=="b" & y != 3 Note der einzelnen &, nicht && verwenden.

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

Sie können auch Vektor-Scans mit der binären Suche nach data.table kombinieren wie folgt

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

Bingo! Danke vielmals! –

Verwandte Themen