Tengo un marco de datos y una lista de columnas en ese marco de datos que me gustaría eliminar. Usemos el iris
conjunto de datos como ejemplo. Me gustaría dejar caer Sepal.Length
y Sepal.Width
y utilizar sólo las columnas restantes. ¿Cómo puedo hacer esto usando select
o select_
desde el dplyr
paquete?
Esto es lo que he probado hasta ahora:
drop.cols <- c('Sepal.Length', 'Sepal.Width')
iris %>% select(-drop.cols)
Error en -drop.cols: argumento no válido para el operador unario
iris %>% select_(.dots = -drop.cols)
Error en -drop.cols: argumento no válido para el operador unario
iris %>% select(!drop.cols)
Error en! Drop.cols: tipo de argumento no válido
iris %>% select_(.dots = !drop.cols)
Error en! Drop.cols: tipo de argumento no válido
Siento que me estoy perdiendo algo obvio porque parece una operación bastante útil que ya debería existir. En Github, alguien publicó un problema similar , y Hadley dijo que usara 'indexación negativa'. Eso es lo que (creo) he intentado, pero fue en vano. ¿Alguna sugerencia?
iris
, pero no en mi marco de datos real (iris
fue un ejemplo de juguete). Mi marco de datos contiene 4558 filas y 147 columnas. El mensaje de error que recibí fueError in eval(x$expr, data, x$env) : variable names are limited to 10000 bytes
. ¿Alguna idea de por qué esto podría estar sucediendo?select_vars
lugar deselect
. ¡Ahora funciona perfectamente!one_of
? A menos que me falte algo, no aparece en la documentación del paquete (help(package='dplyr')
).help(one_of, package = "dplyr")
. Al menos está en la versión de paquete 0.5.0. Pero es útil leer los blogs que publica Hadley cuando hay actualizaciones de uno de sus paquetes. Y algunas funciones están documentadas dentro de otras funciones. Desafortunadamente, eso requiere leer toda la documentación, lo que hago principalmente cuando quiero algo que no es inmediatamente obvio o posible con la función.intenta también
fuente
Más allá,
select(-one_of(drop.cols))
hay un par de otras opciones para eliminar columnasselect()
que no implican la definición de todos los nombres de columna específicos (usando los datos de muestra dplyr starwars para obtener más variedad en los nombres de columna):fuente
select_if(~!is.list(.))
equivalente aselect_if(is.list(.))
?~
es purrr abreviatura para definir una función anónima, no es otro símbolo para no. Por ejemplo, estos dos significan lo mismofunction(x) {!is.list(x)}
y~!is.list(.)
. Piense~
en la abreviatura defunction(.)
.Tenga cuidado con la
select()
función, porque se usa tanto en los paquetes dplyr como en MASS, por lo que si MASS está cargado, es posible que select () no funcione correctamente. Para saber qué paquetes están cargados, escríbalosessionInfo()
y búsquelo en la sección "otros paquetes adjuntos:". Si está cargado, escribadetach( "package:MASS", unload = TRUE )
y suselect()
función debería funcionar nuevamente.fuente
dplyr::select()
.dselect <- dplyr::select()
.Podemos intentar
fuente
dplyr
capacidad del entorno para hacer que las tareas de análisis básicas sean fáciles de leer y escribir, me decepciona que la solución real parezca una solución alternativa.one_of
de la otra solución es el camino a seguir. Me habia olvidado de eso.Otra forma es mutar las columnas no deseadas a
NULL
, esto evita los paréntesis incrustados:fuente
Si usted tiene un carácter especial en los nombres de columna, ya sea
select
oselect_
no funcionen como se esperaba. Esta propiedaddplyr
de usar"."
. Para hacer referencia al conjunto de datos en la pregunta, se puede utilizar la siguiente línea para resolver este problema:fuente
Puedes probar
fuente