2012-03-23 9 views
6

Spesso ho bisogno di rimuovere gli elenchi di colonne da un data.frame.rimozione di un elenco di colonne da un data.frame utilizzando il sottoinsieme

solito faccio questo:

to.remove <- c("hp","drat","wt","qsec") 
mtcars[,-which(names(mtcars) %in% to.remove)] 

che funziona bene.

Ma mi piacerebbe poterlo fare in un modo più pulito usando subset. Ma sembra che colleghi il data.frame e acceda ai nomi delle colonne come variabili piuttosto che come stringhe.

Per esempio questo è ciò che vorrei essere in grado di fare:

subset(mtcars,select=-to.remove) 

C'è un modo per forzare subset utilizzare un vettori di stringhe nella dichiarazione select? O c'è un'altra alternativa migliore?

risposta

22

avrei probabilmente fare questo in questo modo:

to.remove <- c("hp","drat","wt","qsec") 
`%ni%` <- Negate(`%in%`) 
subset(mtcars,select = names(mtcars) %ni% to.remove) 

(io uso %ni% molto, quindi l'ho costruito nella mia .Rprofile già.)

+0

Nizza uso di un operatore binario creata con negate +1 –

+0

@TylerRinker Non ricordo più dove ho preso quella funzione dal. Deve essere stato SO o r-help. – joran

+0

Molto interessante per conoscere Negate. Uso raramente le cose in 'funprog' e questo è un ottimo uso per questo. – Jesse

4

Si può certamente usare di selezione, ma si Devo passare in nomi, non in personaggi. Quindi questo lavoro:

subset(mtcars, select = -c(hp, drat, wt, qsec)) 
Problemi correlati