studio seleccionar filas eliminar datos data contar columnas columna agregar r dataframe subset

filas - seleccionar columnas en r



Seleccionar columnas en el marco de datos R basado en aquellos*no*en un vector (6)

La forma más fácil que me viene a la mente:

filtered_df <-df [, setdiff (nombres (df), c ("nombre1", "nombre2")]

en esencia, está calculando la diferencia establecida entre la lista completa de nombres de columna y el subconjunto que desea filtrar (nombre1 y nombre2 arriba).

Estoy familiarizado con la posibilidad de extraer columnas de un marco de datos R (o matriz) así:

df.2 <- df[, c("name1", "name2", "name3")]

Pero, ¿puede uno usar a ! u otra herramienta para seleccionar todas las columnas menos las enumeradas ?

Para el fondo, tengo un marco de datos con bastantes vectores de columna y me gustaría evitar:

  • Escribí la mayoría de los nombres cuando podía eliminar una minoría
  • Usando el df.2 <- df[, c(1,3,5)] mucho más corto df.2 <- df[, c(1,3,5)] porque cuando mi archivo .csv cambia, mi código se vuelve obvio ya que la numeración ya no es la misma. Soy nuevo en R y creo haber aprendido de la manera difícil de no usar vectores numéricos para df''s más grandes que puedan cambiar.

Lo intenté:

df.2 <- df[, !c("name1", "name2", "name3")] df.2 <- df[, !=c("name1", "name2", "name3")]

Y justo cuando estaba escribiendo esto, descubrí que esto funciona:

df.2 <- df[, !names(df) %in% c("name1", "name2", "name3")]

¿Hay una mejor manera que esta última?


Puede hacer una función personalizada para hacer esto si lo está usando para su propio uso para manipular datos. Puedo hacer algo como esto:

rm.col <- function(df, ...) { x <- substitute(...()) z <- Trim(unlist(lapply(x, function(y) as.character(y)))) df[, !names(df) %in% z] } rm.col(mtcars, hp, mpg)

El primer argumento es el nombre del marco de datos. los siguientes ... son los nombres de las columnas que desea eliminar.


Puede hacer una llamada más corta que también sea más generalizable con grep negativo:

df.2 <- df[, -grep("^name[1:3]$", names(df) )]

Como grep devuelve números, puede usar la indexación negativa de vectores para eliminar columnas. Puede agregar más números o más patrones complejos.


Una alternativa a grep es which :

df.2 <- df[, -which(names(df) %in% c("name1", "name2", "name3"))]


Viejo hilo, pero aquí hay otra solución:

df.2 <- subset(df, select=-c(name1, name2, name3))

Esto fue publicado en otro hilo similar (aunque no puedo encontrarlo ahora). Debe ser un código sostenible en la situación que describes, y probablemente sea más fácil de leer y editar que algunas de las otras opciones.


dplyr::select() tiene varias opciones para dplyr::select() columnas específicas:

library(dplyr) drop_columns <- c(''cyl'',''disp'',''hp'') mtcars %>% select(-one_of(drop_columns)) %>% head(2) mpg drat wt qsec vs am gear carb Mazda RX4 21 3.9 2.620 16.46 0 1 4 4 Mazda RX4 Wag 21 3.9 2.875 17.02 0 1 4 4

Al negar los nombres de columna específicos, lo siguiente quita la columna "hp" y las columnas de "qsec" a "engranaje":

mtcars %>% select(-hp, -(qsec:gear)) %>% head(2) mpg cyl disp drat wt carb Mazda RX4 21 6 160 3.9 2.620 4 Mazda RX4 Wag 21 6 160 3.9 2.875 4

También puede negar contains() , starts_with() , ends_with() o matches() :

mtcars %>% select(-contains(''t'')) %>% select(-starts_with(''a'')) %>% select(-ends_with(''b'')) %>% select(-matches(''^m.+g$'')) %>% head(2) cyl disp hp qsec vs gear Mazda RX4 6 160 110 16.46 0 4 Mazda RX4 Wag 6 160 110 17.02 0 4