2012-03-23 8 views
6

A menudo necesito eliminar listas de columnas de un data.frame.eliminando una lista de columnas de un data.frame usando el subconjunto

que suelo hacer esto:

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

que funciona muy bien.

Pero me gustaría poder hacer esto de una manera más limpia usando subset. Pero parece estar adjuntando data.frame y luego acceder a los nombres de columna como variables en lugar de cadenas.

Por ejemplo esto es lo que me gustaría ser capaz de hacer:

subset(mtcars,select=-to.remove) 

¿Hay una manera de forzar subset utilizar un vectores de cadenas en la declaración select? ¿O hay otra mejor alternativa?

Respuesta

22

que probablemente hacerlo de esta manera:

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

(I utilizar %ni% mucho, así que tengo que construye en mi .Rprofile ya.)

+0

Niza uso de un operador binario creado con negate 1 –

+0

@TylerRinker No puedo recordar más donde recogí esa función a partir. Debe haber sido SO o r-help. – joran

+0

Muy bueno para aprender sobre Negate. Raramente uso cosas en 'funprog' y este es un gran uso para eso. – Jesse

4

Por supuesto que puede usar select, pero Tengo que pasar nombres, no personajes. Así que esto va a funcionar:

subset(mtcars, select = -c(hp, drat, wt, qsec)) 
Cuestiones relacionadas