2012-04-03 8 views
5

R data.table Paket bietet schnelle Untermenge von Werten basierend auf Schlüsseln.Wie kann ich die Negation eines Schlüsselwerts mit dem Paket data.table von R subsettieren?

So zum Beispiel:

set.seed(1342) 

df1 <- data.table(group = gl(10, 10, labels = letters[1:10]), 
        value = sample(1:100)) 
setkey(df1, group) 

df1["a"] 

kehren alle Zeilen in df1 wo Gruppe == "a".

Was ist, wenn ich alle Zeilen in df1 wo group != "a" möchte. Gibt es eine präzise Syntax dafür mit data.table?

Antwort

8

Ich glaube, Sie Ihre eigene Frage beantwortet:

> nrow(df1[group != "a"]) 
[1] 90 
> table(df1[group != "a", group]) 

a b c d e f g h i j 
0 10 10 10 10 10 10 10 10 10 

Scheint mir ziemlich prägnant?

EDIT VON MATTHEW: Laut Kommentare dies ein Vektor-Scan. Es gibt eine nicht verbinden idiomhere und here und feature request #1384, um es einfacher zu machen.

EDIT: feature request #1384 in data.table 1.8.3 implementiert

df1[!'a'] 

# and to avoid the character-to-factor coercion warning in this example (where 
# the key column happens to be a factor) : 
df1[!J(factor('a'))] 
+1

Aber '! =' Ist wie '==' d. H. _vector scans_. Stattdessen gibt es ein _not join_ idiom in [diese Frage] (http://stackoverflow.com/questions/7920688/non-joins-with-data-tables) und [diese Frage] (http://stackoverflow.com/ Fragen/7822138/porting-set-operations-von-rs-daten-frames-to-data-tables-how-to-identify-dupl). Diese verlinken auf eine Feature-Anfrage, um die Nicht-Join-Syntax noch einfacher zu machen. In diesem Fall wäre es "df1 [-" a "]". Das Nicht-Join-Idiom sollte schneller sein als das Vektor-Scannen. –

+0

Ja, Matt, wie ich vermutete, verwenden die obigen Lösungen Vektor-Scans, die ich möglichst vermeiden würde. Ich habe immer noch eine Geschwindigkeitszunahme im Vergleich zu ähnlich großen Datenfeldern in meinem Kommentar bemerkt, aber ich werde herausfinden müssen, warum das so ist. In der Zwischenzeit haben Sie mir die richtigen Suchbegriffe und alternativen Formulierungen der Frage gegeben, und Sie verstehen klar, wonach ich suche. Danke für all deine harte Arbeit an diesem tollen Paket. –

1

Ich würde nur bekommen alle Schlüssel, die nicht „a“ sind:

df1[!(group %in% "a")] 

Ist dies erreichen, was Sie wollen?

+2

Oder alternativ 'df1 [group = "a"!]'. Ich würde gerne wissen, ob es zwischen unseren beiden Ausdrücken wichtige Geschwindigkeitsunterschiede gibt und: 'df1 [setdiff (unique (df1 $ group)," a ")]' oder 'df1 [letters [2:10]] '. –

+0

@ JoshO'Brien Ja, ich habe den komplizierten Weg hier genommen ;-) Also würde ich auch mit Chase oder deiner Lösung gehen. –

+0

Vielen Dank, ich schätze die Hilfe. Alle bisher aufgelisteten Lösungen sind mit der Größe meiner Daten vergleichbar und etwa doppelt so schnell wie die ähnlichen Techniken mit data.frames. –

Verwandte Themen