2012-10-22 18 views
17

Questa potrebbe essere una domanda facile, ma ho ancora bisogno di qualche aiuto per l'utilizzo di R.Come eliminare le righe da un data.frame, in base a un elenco esterno, utilizzando R?

Ho un data.frame (main_data), diciamo ..

NAMES AGE  LOC 
Jyo  23  Hyd 
Abid 27  Kar 
Ras  24  Pun 
Poo  25  Goa 
Sus  28  Kar 

desidero rimuovere qualche fila basato su un elenco di nomi. Quindi, consente di dire che ho un altro elenco di tabella come segue:

NAMES_list 
Jyo 
Ras 
Poo 

Quindi, sulla base di questo elenco, se uno dei nomi corrispondono al mio sopra "main_data" tavolo, poi vorrei cancellare l'intera riga li contianing , quindi il risultato dovrebbe essere il seguente

NAMES AGE  LOC 
Abid 27  Kar 
Sus  28  Kar 

Qualcuno può aiutarmi a ottenere questo utilizzando R? Grazie in anticipo .. :)

risposta

28

Utilizzare %in%:

main_data2 <- main_data[ ! main_data$NAMES %in% NAMES_list, ] 
+0

Grazie per il vostro aiuto. Lo proverò. – Letin

5

Replicare i dati:

dat <- read.table(text=" 
NAMES AGE  LOC 
Jyo  23  Hyd 
Abid 27  Kar 
Ras  24  Pun 
Poo  25  Goa 
Sus  28  Kar", 
stringsAsFactors=FALSE, header=TRUE) 

remove <- c("Jyo", "Ras", "Poo") 

Semplice sottoinsiemi:

dat[!dat$NAMES %in% remove, ] 
    NAMES AGE LOC 
2 Abid 27 Kar 
5 Sus 28 Kar 

Qui di Ho w funziona: usare una combinazione di ! negazione e %in% di restituire un vettore logico che indica le righe da mantenere:

!dat$NAMES %in% remove 
[1] FALSE TRUE FALSE FALSE TRUE 

Ricordo di essere stato sorpreso da questo costruire la prima volta che l'ho visto. Perché !dat$NAMES restituisce qualcosa di utile? Bene, ovviamente l'intuizione è che l'operatore infisso %in% viene valutato per primo, quindi lo ! è semplicemente un operatore logico NOT.

+0

... e viene valutato per primo perché ha [precedence] (http://stat.ethz.ch/R-manual/R-patched/library/base/html/Syntax.html) su '% any%' . – January

10

Se, per caso, in realtà hanno un data.table (al contrario di un data.frame), e la vostra data.table ha un key, è possibile utilizzare il non unirsi linguaggio

library(data.table) 
dat <- as.data.table(read.table(text=" 
NAMES AGE  LOC 
Jyo  23  Hyd 
Abid 27  Kar 
Ras  24  Pun 
Poo  25  Goa 
Sus  28  Kar", 
stringsAsFactors=FALSE, header=TRUE)) 

setkey(dat, NAMES) 

to.remove <- c("Jyo","Ras","Poo") 
dat[-dat[to.remove, which=TRUE]] 
# NAMES AGE LOC 
#1: Abid 27 Kar 
#2: Sus 28 Kar 

Naturalmente, l'altro twoanswers funzionerebbe anche su un data.table, ma questo dovrebbe essere più efficiente.


Modifica

partire dalla versione 1.8.3 data.table, il "!" il prefisso può essere utilizzato per "non-join" (vedere NEWS).

dat[!to.remove] 
    NAMES AGE LOC 
1: Abid 27 Kar 
2: Sus 28 Kar 
+2

+1 Abbiamo davvero bisogno che non si uniscano correttamente i lavori, no: 'dat [-to.remove]'. In realtà è abbastanza facile da implementare internamente ma non ci sono ancora arrivato :(È [FR # 1384] (https://r-forge.r-project.org/tracker/index.php?func=detail&aid= 1384 & group_id = 240 & Atid = 978). –

1

È possibile utilizzare anche utilizzare match se ci sono valori unici nel vostro main_data $ NOMI

NAMES_list <- c("Jyo","Ras","Poo") 
main_data <- main_data[-match(NAMES_list,main_data$NAMES),] 
main_data 
    NAMES AGE LOC 
2 Abid 27 Kar 
5 Sus 28 Kar 

Sarà rimuovere le righe che corrisponde esattamente alla NAMES_list con main_data $ NOMI.

Problemi correlati