Supongamos que tiene un data.frame como este:
x <- data.frame(v1=1:20,v2=1:20,v3=1:20,v4=letters[1:20])
¿Cómo seleccionaría solo aquellas columnas en x que son numéricas?
EDITAR: actualizado para evitar el uso de malos consejos sapply
.
Como un marco de datos es una lista, podemos usar las funciones de aplicar lista:
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 codey, menos reflejo de las peculiaridades particulares de R, y más directo y robusto de usar en tibbles back-end de base de datos:
dplyr::select_if(x, is.numeric)
x[nums]
ox[sapply(x,is.numeric)]
funciona igual de bien. Y siempre regresandata.frame
. Comparex[1]
vsx[,1]
- primero esdata.frame
, segundo es un vector. Si uno quiere evitar la conversión, entonces debe usarx[, 1, drop=FALSE]
.undefined columns selected
. Cómo lo evitas ?tryCatch()
para lidiar con esto. Por favor considere abrir una nueva pregunta.La función del paquete dplyr
select_if(
) es una solución elegante:fuente
Filter()
del paquete base es la función perfecta para ese caso de uso: simplemente tiene que codificar:También es mucho más rápido que
select_if()
:devuelve (en mi computadora) una mediana de 60 microsegundos para
Filter
y 21 000 microsegundos paraselect_if
(350 veces más rápido).fuente
Filter()
que no funciona aquí es reemplazar, por ejemploFilter(is.numeric,iris) <- 0.5*Filter(is.numeric,iris)
, no funcionará.en caso de que solo le interesen los nombres de columna, use esto:
fuente
Este es un código alternativo a otras respuestas:
con un
data.table
fuente
fuente
La biblioteca PCAmixdata tiene una función splitmix que divide divisiones cuantitativas (datos numéricos) y cualitativas (datos categóricos) de un marco de datos dado "YourDataframe" como se muestra a continuación:
fuente
Otra forma podría ser la siguiente:
fuente
Si tiene muchas variables de factores, puede usar la
select_if
función. instale los paquetes dplyr. Hay muchas funciones que separan los datos al satisfacer una condición. Puedes establecer las condiciones.Úselo así.
fuente
Esto no responde directamente a la pregunta, pero puede ser muy útil, especialmente si desea algo como todas las columnas numéricas, excepto su columna de identificación y la variable dependiente.
fuente