2012-04-03 10 views
5

Il pacchetto data.table di R offre un subset rapido dei valori basato sui tasti.Come posso impostare la negazione di un valore chiave usando il pacchetto data.table di R?

Così, ad esempio:

set.seed(1342) 

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

df1["a"] 

torneranno tutte le righe in cui df1 gruppo == "a".

Cosa succede se desidero tutte le righe in df1 dove group != "a". Esiste una sintassi concisa per questo utilizzando data.table?

risposta

8

penso che si risposto alla tua domanda:

> 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 

sembra abbastanza conciso per me?

EDIT FROM MATTHEW: Come per i commenti questo è una scansione vettoriale. C'è un non unire idiomahere e here e feature request #1384 per rendere più facile.

EDIT: feature request #1384 è implementato in data.table 1.8.3

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

Ma '! =' È come '==' i.e. _vector scans_. Invece, c'è [un_nodo di join_ idioma in [questa domanda] (http://stackoverflow.com/questions/7920688/non-joins-with-data-tables) e [questa domanda] (http://stackoverflow.com/ domande/7822138/porting-set-operazioni-da-RS-data-frame-to-data-tabelle-how-to-identificare-DUPL). Quelli si collegano a una richiesta di funzionalità per semplificare la sintassi non-join. In questo caso sarebbe 'df1 [-" a "]'. L'idioma di non-join dovrebbe essere più veloce della scansione vettoriale. –

+0

Sì, Matt, come sospettavo, le soluzioni di cui sopra fanno uso di scansioni vettoriali, che mi piacerebbe evitare se possibile. Ho ancora notato un aumento di velocità rispetto ai dati di formato simile nel mio commento qui sotto, ma dovrò indagare sul perché. Nel frattempo, mi hai dato i giusti termini di ricerca e le formulazioni alternative della domanda, e capisci chiaramente cosa sto cercando. Grazie per tutto il tuo duro lavoro su questo fantastico pacchetto. –

1

vorrei solo ottenere tutte le chiavi che non sono "a":

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

Questo ottenere quello che vuoi?

+2

O, in alternativa, 'df1 [group = "a"!]'. Quello che sarei curioso di sapere è se ci sono importanti differenze di velocità tra le nostre due espressioni e: 'df1 [setdiff (unique (df1 $ group)," a ")]' o 'df1 [letters [2:10]] '. –

+0

@ JoshO'Brien Sì, ho sicuramente preso la strada complicata qui ;-) Quindi vorrei andare con Chase o la vostra soluzione pure. –

+0

Grazie a tutti, apprezzo l'aiuto. Tutte le soluzioni elencate finora sono molto simili con la dimensione dei miei dati e circa il doppio rispetto alle tecniche simili con data.frames. –

Problemi correlati