superponer - Seleccionar solo columnas numéricas de un marco de datos
superponer graficas en r (8)
EDITAR: actualizado para evitar el uso de sapply
mal aconsejado.
Como un marco de datos 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)
Supongamos que tiene un marco de datos 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?
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]
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))
La biblioteca PCAmixdata tiene functon splitmix que divide cuantitativo (datos numéricos) y cualitativo (datos categóricos) de un marco de datos 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)
La función select_if(
) del paquete select_if(
es una solución elegante:
library("dplyr")
select_if(x, is.numeric)
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)
en caso de que solo le interesen los nombres de las columnas, utilice esto:
names(dplyr::select_if(train,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).