Est-il possible de filtrer un data.frame pour des cas complets en utilisant dplyr? complete.cases
avec une liste de toutes les variables fonctionne, bien sûr. Mais c'est a) verbeux quand il y a beaucoup de variables et b) impossible quand les noms des variables ne sont pas connus (par exemple dans une fonction qui traite n'importe quel 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
n'accepte pas seulement les vecteurs. Cela prend également des trames de données entières.dplyr
la fonction de filtre de. Je suppose que je n'ai pas été assez clair et j'ai mis à jour ma question.Réponses:
Essaye ça:
ou ca:
ou ca:
Si vous souhaitez filtrer en fonction de l'absence d'une variable, utilisez une condition:
ou
D'autres réponses indiquent que des solutions ci
na.omit
- dessus est beaucoup plus lente, mais cela doit être mis en balance avec le fait qu'elle renvoie les indices de ligne des lignes omises dans l'na.action
attribut alors que les autres solutions ci-dessus ne le font pas.AJOUTÉ Ont mis à jour pour refléter la dernière version de dplyr et des commentaires.
AJOUTÉ Ont mis à jour pour refléter la dernière version de tidyr et des commentaires.
la source
na.omit()
fonctionne assez mal mais celui-là est rapide.df %>% filter(complete.cases(.))
. Je ne sais pas si les changements récents de dplyr ont rendu cela possible.drop_na
, de sorte que vous pouvez faire:df %>% drop_na()
.Cela fonctionne pour moi:
Ou un peu plus général:
Cela aurait l'avantage que les données auraient pu être modifiées dans la chaîne avant de les transmettre au filtre.
Un autre benchmark avec plus de colonnes:
la source
df %>% slice(which(complete.cases(.)))
exécuté ~ 20% plus rapide que l'approche par filtre dans le benchmark ci-dessus.%>% data.frame() %>%
car il ne fonctionnera pas sur avant d'essayer et filtre sur complete.cases (.) tibbles ou groupes ou quelque chose. Ou du moins, c'est l'expérience que j'ai vécue.Voici quelques résultats de référence pour la réponse de Grothendieck. na.omit () prend 20 fois plus de temps que les deux autres solutions. Je pense que ce serait bien si dplyr avait une fonction pour cela peut-être dans le cadre du filtre.
la source
Il s'agit d'une fonction courte qui vous permet de spécifier des colonnes (essentiellement tout ce qui
dplyr::select
peut comprendre) qui ne devraient pas avoir de valeurs NA (modelées d'après pandas df.dropna () ):[ drop_na fait maintenant partie de tidyr : ce qui précède peut être remplacé par
library("tidyr")
]Exemples:
la source
essaye ça
OU même ça
Les commandes ci-dessus se chargent de vérifier l'exhaustivité de toutes les colonnes (variables) de votre data.frame.
la source
dplyr
dans le cadre de la fonction de filtre. Cela permettrait une intégration soignée dans les chaînes dplyr, etc.dplyr:::do.data.frame
la déclarationenv$. <- .data
ajoute un point à l'environnement. Aucune déclaration de ce type dans magrittr :: "%>%" `Juste pour être complet,
dplyr::filter
peut être complètement évité mais toujours capable de composer des chaînes simplement en utilisantmagrittr:extract
(un alias de[
):Le bonus supplémentaire est la vitesse, c'est la méthode la plus rapide parmi les variantes
filter
etna.omit
(testée avec les microbenchmarks @Miha Trošt).la source
extract()
est presque dix fois plus lente quefilter()
. Cependant, lorsque je crée un bloc de données plus petit avecdf <- df[1:100, 1:10]
, l'image change etextract()
est la plus rapide.magrittr::extract
soit le moyen le plus rapide uniquement lorsque len <= 5e3
benchmark Miha Trošt.