2011-10-27 14 views
21

ho la seguente struttura dati:Rimozione righe R trama di dati

> str(df) 
'data.frame': 3149 obs. of 9 variables: 
$ mkod : int 5029 5035 5036 5042 5048 5050 5065 5071 5072 5075 ... 
$ mad : Factor w/ 65 levels "Akgün Kasetçilik   ",..: 58 29 59 40 56 11 33 34 19 20 ... 
$ yad : Factor w/ 44 levels "BAKUGAN","BARBIE",..: 1 1 1 1 1 1 1 1 1 1 ... 
$ donem: int 201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ... 
$ sayi : int 201101 201101 201101 201101 201101 201101 201101 201101 201101 201101 ... 
$ plan : int 2 2 3 2 2 2 7 3 2 7 ... 
$ sevk : int 2 2 3 2 2 2 6 3 2 7 ... 
$ iade : int 0 0 3 1 2 2 6 2 2 3 ... 
$ satis: int 2 2 0 1 0 0 0 1 0 4 ... 

voglio rimuovere 21 righe specifiche da questo frame di dati.

> a <- df[df$plan==0 & df$sevk==0,] 
> nrow(a) 
[1] 21 

Così, quando ho rimuovere quelle 21 righe, avrò una nuova cornice di dati con 3149 - 21 = 3128 righe. Ho trovato la seguente soluzione:

> b <- df[df$plan!=0 | df$sevk!=0,] 
> nrow(b) 
[1] 3128 

mio sopra soluzione utilizza un'espressione logica modificata (!= invece di == e | invece di &). Oltre a modificare l'espressione logica originale, come posso ottenere il nuovo frame di dati senza quelle 21 righe? Ho bisogno di qualcosa di simile:

> df[-a,] #does not work 

EDIT (soprattutto per i downvoters, spero che capiscono il motivo per cui ho bisogno di una soluzione alternativa): ho chiesto una soluzione diversa, perché sto scrivendo un codice lungo, e ci sono varie assegnazioni di variabili (come nel a nel mio esempio) in varie parti del mio codice. Quindi, quando ho bisogno di rimuovere le righe in parti avanzate del mio codice, non voglio tornare indietro e provare a scrivere l'inverso delle espressioni logiche all'interno di espressioni simili a a. Ecco perché df[-a,] è più utilizzabile per me.

+0

-1 Avete una soluzione contenuta all'interno della domanda. Non c'è alcun problema da risolvere (poiché la domanda è attualmente formulata). –

+1

@RichieCotton: la mia soluzione utilizza un'espressione logica modificata (diversa) che termina con il risultato che mi serve; ma quello che voglio vedere è come rimuovere righe specifiche da un frame di dati. Ho incluso la mia soluzione nella mia domanda perché non volevo vederla nelle risposte. –

+0

Ho aggiunto alcune righe alla mia domanda per spiegare cosa voglio sapere. –

risposta

12

È possibile utilizzare la rownames per specificare un dataframe "complementare". La sua più facile se sono rownames numeriche:

df[-as.numeric(rownames(a)),] 

Ma più in generale è possibile utilizzare:

df[setdiff(rownames(df),rownames(a)),] 
+0

Ovviamente questo presuppone che tu abbia dei rownames, che l'OP ha fatto in questo caso, ma non è una soluzione generale –

+5

'rownames (df) <- 1: nrow (df)' – James

2

Sei quasi arrivato. 'A' deve essere un vettore di indici:

df <- data.frame(plan=runif(10),sevk=runif(10)) 
    a <- c(df$plan<.1 | df$sevk < .1) # some logical thing 
    df[-a,] 

o, con i tuoi dati:

a <- c(df$plan==0 & df$sevk==0) 
    df[-a,] 
+0

Ho provato le ultime due righe del codice con i miei dati, ma restituisce il risultato sbagliato (3148 righe anziché 3128). (BTW, 'b [-a,]' dovrebbe essere 'df [-a,]' Immagino) –

+0

scusa per lo slop- funziona con il mio piccolo esempio autonomo sopra, quindi suppongo che qualunque cosa stia succedendo con il tuo i dati sono sopra la mia testa –

0

non vedo il motivo per cui obiettare alla soluzione, ma ecco un altro modo.

which(df[df$plan==0 & df$sevk==0,], arr.ind=TRUE) ->killlist 
newdf <- df[-c(killlist[1,])] 
9

Sei alla ricerca di subset()?

dat <- airquality 
dat.sub <- subset(dat, Temp > 80 & Month < 10) 

dim(dat) 
dim(dat.sub) 

Applicato il tuo esempio:

df.sub <- subset(df, plan != 0 & sevk != 0) 
+0

Questo è uguale al mio soluzione: 'df [df $ plan! = 0 | df $ sevk! = 0,] 'che seleziona un sottoinsieme; ma grazie comunque. –

+0

BTW, l'operatore '&' deve essere l'operatore '|' (OR) in 'sottoinsieme (df, plan! = 0 & sevk! = 0)'. –

+0

Questa è un'ottima soluzione! – Brian

14

Basta negare la tua pedice logica:

a <- df[!(df$plan==0 & df$sevk==0),]