Seleccionar solo columnas numéricas de un dataframe

Supongamos que tiene un dataframe como este:

x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20]) 

¿Cómo seleccionarías solo aquellas columnas en x que son numéricas?

EDITAR: actualizado para evitar el uso de sapply mal aconsejado.

Como un dataframe es una lista, podemos usar las funciones de aplicar listas:

 nums <- unlist(lapply(x, is.numeric)) 

Luego subconjunto estándar

 x[ , nums] ## don't use sapply, even though it's less code ## nums <- sapply(x, is.numeric) 

Para una R moderna más idiomática, ahora recomendaría

 x[ , purrr::map_lgl(x, is.numeric)] 

Menos codiciosos, menos reflectantes peculiaridades de R, y más sencillo, y robusto para usar en tibbles de base de datos:

 dplyr::select_if(x, is.numeric) 

La función select_if( ) del paquete select_if( es una solución elegante:

 library("dplyr") select_if(x, is.numeric) 

Filter() del paquete base es la función perfecta para ese caso de uso: simplemente debe codificar:

 Filter(is.numeric, x) 

También es mucho más rápido que select_if() :

 library(microbenchmark) microbenchmark( dplyr::select_if(mtcars, is.numeric), Filter(is.numeric, mtcars) ) 

devuelve (en mi computadora) una mediana de 60 microsegundos para Filter , y 21 000 microsegundos para dplyr (350x más rápido).

Si tiene muchas variables de factor, puede usar select_if . instalar los paquetes dplyr. Hay muchas funciones que separan los datos al satisfacer una condición. puedes establecer las condiciones.

Úselo así

 categorical<-select_if(df,is.factor) str(categorical) 

La biblioteca PCAmixdata tiene functon splitmix que divide cuantitativo (datos numéricos) y cualitativo (datos categóricos) de un dataframe dado “YourDataframe” como se muestra a continuación:

 install.packages("PCAmixdata") library(PCAmixdata) split <- splitmix(YourDataframe) X1 <- split$X.quanti(Gives numerical columns in the dataset) X2 <- split$X.quali (Gives categorical columns in the dataset) 

Este es un código alternativo a otras respuestas:

 x[, sapply(x, class) == "numeric"] 

con un data.table

 x[, lapply(x, is.numeric) == TRUE, with = FALSE] 

en caso de que solo le interesen los nombres de las columnas, utilice esto:

 names(dplyr::select_if(train,is.numeric)) 

Esto no responde directamente la pregunta, pero puede ser muy útil, especialmente si desea algo así como todas las columnas numéricas, excepto su columna de identificación y su variable dependiente.

 numeric_cols <- sapply(dataframe, is.numeric) %>% which %>% names %>% setdiff(., c("id_variable", "dep_var")) dataframe %<>% dplyr::mutate_at(numeric_cols, function(x) your_function(x))