2011-01-29 14 views
22

Por ejemplo, con el conjunto de datos mtcars¿Cómo puedo obtener un marco de datos con columnas eliminadas temporalmente por su nombre?

mtcars[ , "cyl"] 

y

mtcars[ , 2] 

tanto dame la misma columna. Por lo tanto, ya que puedo conseguir todo pero la columna 2 de esta manera:

mtcars[ , -2] 

no me esperaba esto:

mtcars[ , -"cyl"] 
Error in -"cyl" : invalid argument to unary operator 

vez lo mejor que puedo llegar a es la siguiente:

mtcars[ , !colnames(mtcars)=="cyl"] 

¿Existe una solución más fácil?

EDITAR: Parece lógico que si las dos primeras técnicas funcionan, también deberían las dos técnicas siguientes. Esperaba que me estaba perdiendo algo. Las páginas de ayuda para ?"[" o ?subset no explican este resultado contrario a la intuición. Alguien sabe por qué es esto?

+0

@Joshua Creo que estos son un poco diferentes, aquí el objetivo es eliminar una sola columna por nombre, donde las convenciones habituales no funcionan. –

+0

Hice un ligero cambio en el título y agregué "por qué" a la pregunta. –

+0

Las reglas se explican en la sección 2.7 del manual Introducción a R: http://cran.r-project.org/doc/manuals/R-intro.html#Index-vectors –

Respuesta

27

[Editar:] explicación de por qué los índices de cadena negativa no funciona:

-() es una función y los desarrolladores R dicen que no se puede utilizar en un vector de caracteres (y no sólo por la negación de una cadena no tiene sentido). Como no puede negar un vector de caracteres, no puede suministrar cadenas negativas para soltar columnas. El problema es con - y es la fuente del mensaje de error que cita. De ahí la regla de que los índices negativos solo funcionan para los números. El origen del error original es:

> -"cyl" 
Error in -"cyl" : invalid argument to unary operator 

Tenga en cuenta que en los comentarios a la Q, hubo confusión que la versión negativa de "cyl" era "-cyl", lo que no es, es simplemente otra cadena. El fragmento R anterior muestra lo que estaba sucediendo en el subconjunto probado en la Pregunta.

Section 2.7 del manual "An Introduction to R" describe los métodos permitidos de subconjunto.

[Original:] La forma más sencilla de eliminar un componente es sólo para establecer ese componente a NULL:

> cars <- mtcars 
> cars[, "cyl"] <- NULL ## or cars$cyl <- NULL 
> names(cars) 
[1] "mpg" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb" 

[Editar:] A la luz de la edición a la Q indica se desea una caída temporal de la columna llamada, entonces:

subset(mtcars, select = -cyl) 

o

mtcars[, !names(mtcars) %in% "cyl"] 

son opciones, y el antiguo limpiador es el último.

+0

Editado la pregunta: Estoy buscando una caída temporal no permanente. –

12

A menudo uso subset. Un ejemplo utilizando mtcars

> names(mtcars) 
[1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb" 
> cars <- subset(mtcars, select=-c(mpg,cyl)) 
> names(cars) 
[1] "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb" 

Hay algunas otras ideas en las respuestas a this question.

Actualización: Subconjunto también funciona para la eliminación temporal de una o más columnas por nombre, simplemente reemplace mtcars[,-2] con subset(mtcars, select=-cyl).

+0

Gracias Seth, nunca exploré las opciones de subconjunto y esta será una herramienta útil. –

+0

En realidad, * select * arg es limitado, no puede ser un vector de caracteres negativos como @ Gavin-Simpson notas anteriores. Por lo tanto, los únicos argumentos negativos que puede obtener son una sola variable de carácter, o una lista fija de constantes de cadena, como 'select = -c (mpg, cyl)'. – smci

Cuestiones relacionadas