¿Es posible filtrar un data.frame para casos completos usando dplyr? complete.cases
con una lista de todas las variables funciona, por supuesto. Pero eso es a) detallado cuando hay muchas variables yb) imposible cuando no se conocen los nombres de las variables (por ejemplo, en una función que procesa cualquier data.frame).
library(dplyr)
df = data.frame(
x1 = c(1,2,3,NA),
x2 = c(1,2,NA,5)
)
df %.%
filter(complete.cases(x1,x2))
complete.cases
no solo acepta vectores. También se necesitan marcos de datos completos.dplyr
la función de filtro de. Supongo que no fui lo suficientemente claro y actualicé mi pregunta.Respuestas:
Prueba esto:
o esto:
o esto:
Si desea filtrar según la falta de una variable, use un condicional:
o
Otras respuestas indican que una de las soluciones anteriores
na.omit
es mucho más lenta, pero eso debe equilibrarse con el hecho de que devuelve índices de fila de las filas omitidas en elna.action
atributo, mientras que las otras soluciones anteriores no lo hacen.AÑADIDO Se actualizó para reflejar la última versión de dplyr y comentarios.
AÑADIDO Se actualizó para reflejar la última versión de tidyr y comentarios.
fuente
na.omit()
funciona bastante mal, pero el uno es rápido.df %>% filter(complete.cases(.))
. No estoy seguro de si los cambios recientes en dplyr lo hicieron posible.drop_na
, por lo que ahora puede hacer:df %>% drop_na()
.Esto funciona para mi:
O un poco más general:
Esto tendría la ventaja de que los datos podrían haberse modificado en la cadena antes de pasarlos al filtro.
Otro punto de referencia con más columnas:
fuente
df %>% slice(which(complete.cases(.)))
rendimiento ~ 20% más rápido que el enfoque de filtro en el punto de referencia anterior.%>% data.frame() %>%
antes de intentar filtrar en complete.cases (.) Porque no funcionará en tibbles o tibbles agrupados o algo así. O al menos, esa ha sido la experiencia que he tenido.Aquí hay algunos resultados de referencia para la respuesta de Grothendieck. na.omit () toma 20 veces más tiempo que las otras dos soluciones. Creo que sería bueno si dplyr tuviera una función para esto, tal vez como parte del filtro.
fuente
Esta es una función corta que le permite especificar columnas (básicamente todo lo que
dplyr::select
pueda entender) que no deberían tener ningún valor NA (modelado a partir de pandas df.dropna () ):[ drop_na ahora es parte de tidyr : lo anterior se puede reemplazar por
library("tidyr")
]Ejemplos:
fuente
prueba esto
O incluso esto
Los comandos anteriores se encargan de verificar la integridad de todas las columnas (variable) en su data.frame.
fuente
dplyr
como parte de la función de filtro. Eso permitiría una integración ordenada en cadenas dplyr, etc.dplyr:::do.data.frame
la declaraciónenv$. <- .data
agrega punto al medio ambiente. No existe tal declaración en magrittr :: "%>%" `Solo en aras de la integridad,
dplyr::filter
se puede evitar por completo, pero aún se puede componer cadenas simplemente usandomagrittr:extract
(un alias de[
):La ventaja adicional es la velocidad, este es el método más rápido entre las variantes
filter
yna.omit
(probado usando microbenchmarks @Miha Trošt).fuente
extract()
es casi diez veces más lento quefilter()
. Sin embargo, cuando creo un marco de datos más pequeño condf <- df[1:100, 1:10]
, la imagen cambia yextract()
es la más rápida.magrittr::extract
es la forma más rápida solo cuando están <= 5e3
en el punto de referencia de Miha Trošt.