2011-09-21 21 views
13

Qual è il modo migliore per rimuovere più elementi da un dataframe? Nel mio caso ho tutti i giorni del mese in un frame di dati e voglio rimuovere diversi giorni. Qualcosa come sotto funziona bene per un giorno.Modo standard per rimuovere più elementi da un dataframe

m[m$date!="01/31/11",] 

Tuttavia se provo qualcosa di simile

m[m$date!=c("01/31/11","01/30/11"),] 

ricevo un messaggio di avviso

Warning message: 
In `!=.default`(m$date, c("01/31/11", "01/30/11")) : 
longer object length is not a multiple of shorter object length 
Calls: [ ... [.data.frame -> Ops.dates -> NextMethod -> Ops.times -> NextMethod 

Sembra funzionare per due giorni, ma se aggiungo 01/29/11 a il vettore mostra tutti i giorni, ma 31/01/11.

risposta

32

nzcoops è a posto con il suo suggerimento. Ho posto questa domanda nel R chiacchierare un po 'indietro e Paul Teetor suggerito la definizione di una nuova funzione:

`%notin%` <- function(x,y) !(x %in% y) 

che può quindi essere utilizzato come segue:

foo <- letters[1:6] 

> foo[foo %notin% c("a", "c", "e")] 
[1] "b" "d" "f" 

Inutile dire, questo piccolo gioiello è ora nel mio R profile e viene usato abbastanza spesso.

+0

Bello. Trovo sempre che rompa la mia concentrazione quando devo digitare qualcosa come '! (X% in% y)' ... ottimo suggerimento. –

+1

Non penso che 'dplyr' possa gestire questo, per esempio, ' filter (df, foo% notin% c ("a", "c", "e")) ' –

+0

@ MattO'Brien - non so cosa questo vuole significare ... non usare dplyr? – Chase

13

Penso per che si desidera:

m[!m$date %in% c("01/31/11","01/30/11"),] 
+0

Questo non sembra funzionare quando la data è in 'come. POSIXct' class! – vagabond

2

modo fresco è quello di utilizzare la funzione Nega per creare uno nuovo:

`%ni%` <- Negate(`%in%`) 

di quanto si può utilizzare per trovare elementi che non intersecate

Problemi correlati