Comment supprimer des lignes en utilisant dplyr (avec exemples)

Guide académique complet pour apprendre à supprimer des lignes d’un jeu de données sous R avec dplyr : valeurs manquantes, doublons, index et filtres logiques.

Dr. Mohammed Looti Universitaire et chercheur spécialisé en psychologie
PUBLIÉ
Révisé scientifiquement · Dr. Marwa Abd-Alazim · septembre 11, 2026
Revu médicalement et scientifiquement Vérifié le : septembre 11, 2026
Dr. Marwa Abd-Alazim PhD in Psychology
Faculty Member • University of Kerbala
Critères d'évaluation et normes cliniques

Ce contenu fait l'objet d'un examen scientifique rigoureux et de normes éditoriales médicales afin de garantir l'exactitude clinique et la conformité aux directives fondées sur des preuves (APA / OMS).

Dans l’écosystème du traitement statistique contemporain, la manipulation rigoureuse des structures tabulaires constitue une étape cardinale, conditionnant l’ensemble des inférences ultérieures. L’avènement du paradigme du tidyverse au sein de l’environnement de programmation R a profondément transformé cette démarche méthodologique en substituant à des syntaxes historiques parfois absconses une grammaire formelle, expressive et hautement optimisée. Au cœur de cette architecture, l’extension dplyr fournit une collection cohérente de verbes conçus pour opérer sur les données comme le ferait un analyste formulant une série de propositions logiques ordonnées. La suppression de lignes — opération qui consiste formellement à isoler un sous-ensemble d’observations répondant à des critères d’exclusion ou d’inclusion rigoureux — représente l’un des actes fondamentaux de la préparation des données empiriques.

Traiter l’élagage d’une matrice d’observations ne se résume pas à une simple commodité d’écriture syntaxique. Cette tâche engage la responsabilité épistémologique du chercheur et du statisticien, dans la mesure où chaque ligne retranchée modifie la distribution empirique des variables, altère la structure des résidus dans les modèles paramétriques et influe sur la puissance statistique globale du dispositif expérimental. Qu’il s’agisse d’écarter des enregistrements pollués par des artefacts techniques, d’éliminer des redondances issues de jointures défectueuses ou de purger un corpus de ses valeurs manquantes selon des hypothèses explicites sur le mécanisme d’incomplétude, le choix des fonctions mobilisées doit reposer sur une maîtrise parfaite de leur sémantique computationnelle.

Cet article propose une exploration exhaustive, théorique et appliquée, des techniques permettant d’évincer des lignes au moyen du métalangage dplyr. À travers un continuum d’analyses détaillées, d’exemples reproductibles et de discussions méthodologiques approfondies, nous examinerons comment mobiliser les verbes cardinaux, articuler les prédicats booléens, appréhender la logique ternaire propre aux valeurs manquantes et optimiser les algorithmes sous-jacents sur des volumétries massives. L’ambition est d’offrir au praticien une référence incontournable pour assainir ses données sans jamais sacrifier la traçabilité ni l’intégrité de sa démarche scientifique.

1. Introduction aux principes fondamentaux de la suppression de lignes avec dplyr

1.1 Le rôle du filtrage des données dans le pipeline analytique

L’intégrité analytique d’une étude quantitative dépend en premier lieu de la salubrité de son corpus d’observations. Dans un pipeline de science des données standardisé, l’étape préliminaire de nettoyage (ou data wrangling) absorbe couramment une part prépondérante des ressources cognitives et temporelles de l’analyste. Ce processus ne constitue pas un simple préliminaire subalterne : il délimite précisément le champ d’application de la validité interne des inférences statistiques. Lorsque des données brutes parviennent au système d’ingestion, elles charrient inévitablement des bruits expérimentaux, des ruptures de protocole de mesure, des discordances de saisie et des anomalies structurelles. Si ces perturbations ne sont pas circonscrites et purgées avec méthode, les modèles prédictifs et descriptifs subséquents se trouveront irrémédiablement biaisés, illustrant l’adage classique selon lequel la qualité des extrapolations est strictement bornée par la qualité des intrants.

Au sein du tidyverse, conçu sous l’impulsion de Hadley Wickham, la manipulation des données s’ancre dans la philosophie de la programmation fonctionnelle. Contrairement aux approches impératives qui modifient les objets en place par réaffectation destructive, l’approche fonctionnelle préconise l’usage de transformations pures où chaque fonction prend une structure immuable en entrée et renvoie une nouvelle structure sans altérer l’état initial du système. Dans ce cadre épistémologique, la manipulation se décompose selon deux dimensions orthogonales : la sélection des variables, qui opère dans l’espace des attributs ou colonnes via le verbe select(), et le sous-ensemble d’observations, qui découpe l’espace des individus statistiques ou lignes. Cette distinction théorique s’avère capitale. Alors que l’omission d’une variable restreint le champ dimensionnel de l’analyse, l’éviction d’une ligne altère la taille d’échantillon effective ($N$), ce qui modifie instantanément les degrés de liberté disponibles pour l’estimation de la variance résiduelle.

Dès lors, chaque décision de suppression d’observations entraîne un impact direct et mesurable sur la puissance statistique des tests d’hypothèses. Retirer trop libéralement des lignes sous prétexte qu’elles constituent des observations atypiques ou atypiquement dispersées augmente mécaniquement l’erreur standard des estimateurs et majore le risque de commettre une erreur de type II (non-rejet à tort de l’hypothèse nulle). Inversement, faire preuve d’un laxisme méthodologique en conservant des observations intrinsèquement corrompues viole les hypothèses distributionnelles classiques (normalité des résidus, homoscédasticité) et gonfle artificiellement le taux d’erreur de type I. Le filtrage des lignes ne saurait donc être réduit à une commodité de codage : c’est un acte de modélisation à part entière qui réclame une compréhension exhaustive des opérateurs mobilisés.

1.2 Présentation des mécanismes conceptuels du verbe filter()

Le verbe filter() constitue le pivot central autour duquel s’articule la sélection des sous-ensembles d’observations dans l’environnement dplyr. Son mécanisme repose sur l’évaluation vectorisée d’expressions booléennes appliquées à chaque enregistrement de la table de données. D’un point de vue conceptuel, filter() inspecte ligne par ligne les valeurs prises par une ou plusieurs variables spécifiées dans l’argumentaire, résout les propositions logiques sous-jacentes et n’autorise le passage dans le tableau résultant qu’aux observations pour lesquelles l’évaluation produit rigoureusement la valeur logique TRUE. Les enregistrements renvoyant FALSE sont immédiatement éliminés, de même que ceux dont l’évaluation logique débouche sur une indétermination (NA), ce dernier point constituant une spécificité déterminante de l’ingénierie interne du paquet.

Une distinction fondamentale réside dans l’écart sémantique qui sépare la conservation explicite de l’exclusion par négation. Dans la pratique computationnelle, un utilisateur peut choisir d’exprimer ce qu’il souhaite garder (par exemple, retenir les individus dont l’âge dépasse 18 ans) ou, à l’inverse, formuler ce qu’il entend rejeter en mobilisant l’opérateur de négation logique (!). Bien que ces deux approches paraissent logiquement symétriques en vertu des lois de De Morgan dans une logique bivalente standard, elles ne sont pas équivalentes en présence d’incertitude informationnelle. Exclure formellement une modalité par variable != "Modalité" induit un comportement singulier face aux données manquantes, ces dernières se trouvant écartées par construction, ce qui peut surprendre l’analyste inattentif. Comprendre le verbe filter() requiert ainsi d’appréhender la mécanique exacte avec laquelle le moteur traite la valeur de vérité de chaque assertion.

Sous le capot, dplyr ne s’en remet pas à de simples boucles séquentielles interprétées dans l’interpréteur R natif, ce qui pénaliserait dramatiquement le temps d’exécution sur de grands volumes de données. Le paquet s’appuie sur une infrastructure hybride hautement optimisée, tirant parti de routines compilées en C++ via le métapaquet cpp11. Lorsqu’une instruction de filtrage est soumise, l’expression symbolique non évaluée (mobilisant l’évaluation non standard ou tidy evaluation assurée par rlang) est inspectée, traduite en un vecteur logique natif compilé, puis appliquée directement aux colonnes sous forme de vecteurs de bas niveau. Ce découplage entre l’expressivité syntaxique de haut niveau et l’efficacité d’exécution de bas niveau confère à filter() une rapidité d’exécution proche des limites théoriques du matériel, tout en préservant une lisibilité cognitive maximale.

1.3 Présentation du cadre méthodologique et reproductibilité

L’assainissement d’un jeu de données ne saurait s’affranchir d’un impératif d’auditabilité absolue. Dans le contexte de la crise de la reproductibilité qui traverse les sciences empiriques, l’altération manuelle de données sources via des tableurs conventionnels constitue une faute méthodologique critique. Lorsqu’un opérateur procède à la suppression manuelle de lignes en cliquant sur des cellules ou en coupant des plages de valeurs dans une interface graphique non journalisée, il détruit irrémédiablement l’historique de ses transformations. Aucun observateur extérieur, ni même l’expérimentateur initial quelques mois plus tard, ne possède alors les moyens de reconstituer la trajectoire qui a mené du relevé d’observation brut au tableau d’analyse épuré. Une telle opacité disqualifie d’emblée la prétention scientifique de l’étude.

À l’opposé de ces pratiques opaques, l’usage de scripts R programmatiques et documentés dans le cadre d’un flux de travail formalisé garantit la traçabilité complète de l’élagage des données. Chaque ligne de commande devient un acte d’exclusion consigné, dont les motivations peuvent être adossées à des commentaires explicatifs, des assertions logiques formelles ou des seuils statistiques justifiés théoriquement. Le script constitue alors le protocole d’extraction exécutable, garantissant que n’importe quel analyste disposant du jeu de données brut original et de l’environnement logiciel adéquat parviendra exactement au même résultat final, au bit près. Cette traçabilité favorise l’examen par les pairs et autorise une réévaluation continue des critères d’exclusion retenus au fur et à mesure que la modélisation progresse.

Ce principe méthodologique repose sur une règle absolue : la sacralisation des données sources brutes. Les données collectées sur le terrain, exportées depuis des bases de données de production ou capturées par des instruments de mesure doivent être traitées comme des archives en lecture seule strictement immuables. L’intégralité du nettoyage, incluant l’élimination des doublons, la purge des valeurs aberrantes et l’exclusion des non-réponses, doit s’exécuter en mémoire vive ou s’exporter vers de nouveaux répertoires de travail clairement étiquetés comme dérivés. En adoptant les fonctions de transformation non destructives de dplyr, le statisticien s’assure qu’aucune instruction n’écrase le fichier source, garantissant ainsi un retour permanent possible vers l’état originel des observations pour fin de validation ou de recalibrage du protocole.

2. Configuration de l’environnement de travail et jeu de données modèle

2.1 Installation et chargement des bibliothèques nécessaires

Pour mettre en œuvre les techniques d’épuration tabulaire avec toute la rigueur requise, l’installation préalable des bibliothèques logicielles idoines constitue le premier jalon technique. Le composant central, dplyr, peut être installé individuellement depuis le Comprehensive R Archive Network (CRAN) ou ingéré au sein du collectif plus vaste constitué par le méta-paquet tidyverse, lequel agrège harmonieusement les modules dédiés à l’importation, à la manipulation, au remodelage et à la visualisation de données. Il est vivement conseillé de privilégier cette seconde option afin de s’assurer d’une parfaite cohérence de version entre les extensions interdépendantes.

L’installation s’opère canoniquement par l’instruction install.packages("tidyverse") dans la console R. Une fois cette étape accomplie, le chargement en session active est assuré par l’appel library(tidyverse) ou, de façon plus ciblée, library(dplyr). Dès cette invocation, l’environnement R met en garde l’utilisateur quant à l’apparition de conflits dans l’espace de noms (namespace masking). En particulier, la fonction filter() de base R, issue du paquet stats, se trouve masquée par le verbe filter() introduit par dplyr. Cette collision lexicale peut engendrer des dysfonctionnements majeurs : si une fonction tierce attendait le comportement de filtrage temporel de stats::filter(), l’application par inadvertance du verbe de sous-ensemble de dplyr déclenchera une erreur fatale ou renverra un objet corrompu.

Pour immuniser les scripts d’analyse contre ce type de défaillance silencieuse, l’adoption de pratiques défensives de codage est requise. Lorsque l’ambiguïté est susceptible d’émerger, notamment au sein de fonctions réutilisables ou de paquets autonomes, il est impératif de préfixer formellement les appels de fonctions par le nom de leur espace de noms au moyen de l’opérateur double deux-points, par exemple dplyr::filter(). Par ailleurs, la consignation explicite de la version d’exécution via les fonctions sessionInfo() ou l’intégration d’un gestionnaire d’environnement d’isolation logicielle tel que renv garantit la reproductibilité pérenne du code au fil des évolutions incrémentales du langage R et des bibliothèques associées.

2.2 Construction du jeu de données synthétique pour les démonstrations

Afin de concrétiser les manipulations et d’offrir un terrain expérimental maîtrisé, nous construisons une table de données synthétique contenant les pathologies empiriques les plus fréquemment rencontrées dans les jeux de données réels. Ce tableau matriciel de type tibble ou data.frame rassemble des variables hétérogènes : des identifiants d’équipes sous forme de chaînes de caractères, des scores quantitatifs continus ou discrets (points et passes décisives), ainsi que des indicateurs de statut de performance. Cette hétérogénéité structurelle permettra de tester la sensibilité des algorithmes d’exclusion face à des typologies de données distinctes.

L’intérêt didactique de ce corpus d’essai réside dans l’injection délibérée de plusieurs anomalies contrôlées. Nous intégrons tout d’abord des valeurs manquantes structurelles (représentées par la constante NA) réparties asymétriquement : certaines lignes comporteront une lacune sur la variable points, d’autres sur la variable assists, tandis que certaines présenteront une incomplétude simultanée sur les deux métriques. Parallèlement, nous injectons sciemment des doublons parfaits — des réplications exactes de tuples d’observations sur l’ensemble des colonnes — ainsi que des redondances partielles, où seul un sous-ensemble d’attributs se trouve dupliqué. Enfin, un spectre de valeurs quantitatives positives, nulles et négatives ainsi que des chaînes textuelles comportant des préfixes particuliers viendront compléter l’échantillon.

L’observation préalable de cet objet se concrétise immédiatement par l’invocation de commandes d’inspection structurelle telles que str(df) ou glimpse(df). L’affichage révèle une table comportant initialement une dizaine d’enregistrements organisés selon trois ou quatre variables fondamentales. En visualisant ce micro-écosystème avant toute intervention, l’analyste se dote d’un point de référence stable permettant de vérifier point par point l’impact soustractif des fonctions appliquées, garantissant ainsi que chaque suppression de ligne est rigoureusement conforme aux attentes conceptuelles formulées dans nos hypothèses d’assainissement.

2.3 Compréhension de l’opérateur de redirection (pipe)

L’élégance architecturale et la fluidité cognitive des traitements réalisés sous dplyr reposent en grande partie sur l’utilisation de l’opérateur de redirection, universellement désigné sous le vocable anglais de pipe. Historiquement introduit dans l’univers R par Stefan Milton Bache et Stefan Frache via le paquet magrittr sous la forme %>%, cet opérateur arithmétique a profondément redéfini l’écriture du code statistique en favorisant une programmation déclarative et séquentielle. Son rôle mécanique est simple mais fondamental : il intercepte l’objet résultant de l’expression située à sa gauche pour l’injecter immédiatement comme premier argument positionnel de la fonction située à sa droite.

Depuis la publication de la version 4.1.0 du noyau de base de R en mai 2021, le langage s’est doté d’un opérateur de canalisation natif formalisé par la séquence de caractères |>. Cette adjonction au moteur de base présente des avantages computationnels notables : elle dispense de dépendances logicielles externes, s’exécute directement au niveau de la syntaxe de l’interpréteur abstrait et minimise la surcharge (overhead) sur la pile d’appels récursifs de fonctions. Bien que l’opérateur traditionnel de magrittr demeure omniprésent dans les dépôts historiques et conserve des options spécifiques de placement via le marqueur point (.), le pipe natif constitue désormais la recommandation stylistique privilégiée pour les projets contemporains ne nécessitant pas de liaisons d’arguments complexes hors de la première position.

Les gains cognitifs induits par cette écriture sont considérables pour l’analyste. En lieu et place d’imbrications illisibles de fonctions où la séquence chronologique des opérations est inversée de l’intérieur vers l’extérieur (ex. filter(na.omit(mutate(...)))) ou de créations successives de structures intermédiaires éphémères polluant l’espace de travail (df1, df2, df3), le flux analytique se lit de gauche à droite et de haut en bas, épousant le cheminement naturel de la pensée humaine. Chaque étape d’éviction de lignes s’insère harmonieusement dans cette chaîne linéaire, transformant le script de nettoyage en un récit ordonné d’opérations élémentaires et auto-documentées.

3. Suppression universelle des valeurs manquantes avec na.omit()

3.1 Fonctionnement et syntaxe de l’exclusion globale des NA

L’apparition de valeurs manquantes constitue l’une des problématiques les plus ubiquitaires de l’ingénierie des données empiriques. Dans le vocabulaire statistique de R, ces absences informationnelles sont désignées par l’entité atomique NA (Not Available), qui préserve le typage de la colonne sous-jacente tout en signalant l’indétermination de la mesure. Face à un tableau parsemé de telles absences, la stratégie la plus expéditive consiste à pratiquer une exclusion globale de tout individu ne possédant pas un profil complet. À cette fin, la fonction primitive na.omit() issue de la bibliothèque stats s’intègre avec une fluidité remarquable au sein des pipelines dplyr.

D’un point de vue syntaxique, l’intégration prend la forme linéaire df %>% na.omit() ou, dans le formalisme natif, df |> na.omit(). Le mécanisme exécutif sous-jacent parcourt la structure rectangulaire ligne par ligne. Dès lors qu’une observation présente ne serait-ce qu’une seule composante indéterminée, indépendamment du fait que cette omission touche une variable prédictive centrale ou un attribut secondaire superflu, la ligne dans son intégralité est instantanément bannie de l’échantillon sortant. Il convient de souligner l’équivalence fonctionnelle quasi parfaite entre cette instruction historique et la commande moderne drop_na() fournie par l’extension tidyr lorsqu’elle est exécutée sans renseigner d’attribut spécifique : dans les deux cas, le traitement applique le principe de cas complet (complete case analysis).

Toutefois, sous cette apparente simplicité syntaxique réside une asymétrie de traitement des objets structurés. Tandis que drop_na() préserve scrupuleusement la classe native tbl_df sans surcharger l’objet de métadonnées accessoires, na.omit() convertit l’objet selon les règles historiques de S3 en lui adjoignant un attribut particulier désigné sous l’étiquette na.action. Cet attribut contient l’énumération des indices scalaires des lignes éliminées, typé sous la classe omit. Bien que cette trace mémoire puisse s’avérer utile pour auditer les omissions ultérieures, elle peut induire des comportements inattendus lors de recombinaisons matricielles ou d’opérations d’exportation vers des formats stricts.

3.2 Exemple pratique d’application sur le tableau de données

Considérons l’application concrète de cette méthode sur notre jeu de données expérimental. La structure initiale, avant toute épuration, se caractérise par une dimension matricielle de huit lignes et trois colonnes. Deux de ces observations comportent une valeur NA localisée au sein de la colonne des points, tandis qu’une troisième présente une omission positionnée sur la variable mesurant les passes décisives. Une observation additionnelle cumule une double absence sur l’ensemble des indicateurs numériques. Lorsque le flux de traitement déclenche l’appel donnees_epurees <- df %>% na.omit(), la transformation s’opère instantanément à travers la pile d’exécution.

L’inspection des dimensions du tenseur de données consécutivement à cette purge met en évidence un rétrécissement substantiel du champ d’étude : seules les lignes possédant une réponse valide sur l’intégralité de leurs dimensions attributaires subsistent dans donnees_epurees. Le dénombrement résultant par nrow(donnees_epurees) indique une contraction sévère, l’objet ne conservant plus que quatre unités statistiques complètes. Toutes les lignes affichant au moins un point d’incomplétude ont été intégralement dissoutes, sans égégard pour la richesse informationnelle que ces unités auraient pu continuer d’offrir sur leurs autres attributs valides.

Une analyse approfondie de l’objet produit permet d’explorer les attributs internes via l’instruction attr(donnees_epurees, "na.action"). L’analyste observe alors un vecteur d’entiers pointant précisément vers les lignes originales qui ont été neutralisées lors de la traversée de la fonction. Cette persistance technique illustre la tension permanente entre la pureté fonctionnelle souhaitée dans l’approche du tidyverse — où les données doivent idéalement demeurer libres de toute métadonnée cachée entravant la composabilité — et les impératifs des algorithmes d’estimation matricielle traditionnels de R qui s’appuient sur ces attributs pour reconstituer les tableaux d’ajustement résiduel.

3.3 Limites méthodologiques de l’analyse des cas complets

Si la simplicité technique de l’exclusion globale via na.omit() présente un attrait ergonomique indéniable, ses implications épistémologiques et statistiques s’avèrent redoutables. En épidémiologie, en sociologie quantitative et en économétrie appliquée, l’analyse restreinte aux seuls cas complets ne peut être théoriquement justifiée que sous l’hypothèse excessivement restrictive d’une absence complète de corrélation entre le mécanisme causant la lacune et les valeurs des variables elles-mêmes. Selon la typologie canonique formulée par Donald Rubin, les données doivent être manquantes de façon totalement aléatoire (Missing Completely at Random, ou MCAR).

Or, dans la quasi-totalité des configurations réelles d’observation, les données relèvent d’un mécanisme manquant de façon aléatoire (MAR) conditionnellement à d’autres covariables, voire d’un mécanisme non aléatoire (MNAR) où la probabilité qu’une valeur soit manquante dépend directement de la valeur non observée elle-même (par exemple, les individus bénéficiant de revenus extrêmement élevés ou très faibles refusant systématiquement de dévoiler leur rémunération). L’omission mécanique de toute ligne incomplète au sein de ces schémas engendre un biais d’attrition systématique et irréversible, faussant les estimations de moyennes, écrasant les covariances et projetant un tableau déformé de la population cible sous-jacente.

À ce préjudice d’exactitude s’ajoute l’effondrement mécanique de la taille de l’échantillon effectif. Dans les bases de données multidimensionnelles contemporaines comprenant plusieurs centaines de variables, la probabilité cumulée qu’une observation présente au moins une valeur indéterminée croît de façon exponentielle avec le nombre de dimensions. Appliquer aveuglément na.omit() conduit fréquemment à éliminer plus de quatre-vingts pour cent des individus répertoriés, anéantissant la puissance des tests inférentiels. Face à ce péril, le recours aux techniques modernes d’imputation multiple par équations chaînées (MICE) ou à des algorithmes d’apprentissage acceptant structurellement les valeurs manquantes s’impose comme une alternative méthodologique infiniment supérieure à l’amputation aveugle du corpus.

4. Élimination ciblée des valeurs manquantes par colonne spécifique

4.1 Combinaison logique des prédicats !is.na() et filter()

Pour parer à la destruction massive d’informations induite par l’analyse systématique des cas complets, la méthode recommandée consiste à appliquer une politique d’exclusion sélective, restreinte exclusivement aux variables indispensables à l’hypothèse de travail immédiate. Au sein de dplyr, ce ciblage chirurgical se matérialise par l’articulation du verbe filter() avec le prédicat vectorisé universel is.na(), conjugué à l’opérateur de négation unaire !. Cette construction synthétique permet d’isoler l’impact du filtrage à une dimension unique de l’espace des données.

Le fonctionnement interne de cette formulation requiert une décomposition rigoureuse. La fonction is.na(x) analyse un vecteur de données de taille $n$ et convertit chaque élément scalaire en une valeur booléenne : elle renvoie TRUE si l’élément considéré est indéterminé, et FALSE dans le cas contraire. Placée seule au sein de filter(), cette expression conserverait précisément les anomalies que l’on cherche à bannir. C’est ici qu’intervient l’opérateur de négation logique point d’exclamation, qui inverse instantanément le tenseur logique sous-jacent : chaque TRUE devient FALSE, et chaque FALSE se mue en TRUE. Le verbe filter(), n’autorisant la persistance que des observations validées à TRUE, élimine rigoureusement les lignes où la variable cible contenait une absence.

La syntaxe canonique s’exprime donc sous la forme épurée : df %>% filter(!is.na(nom_de_colonne)). L’immense supériorité épistémique de ce canevas réside dans sa neutralité à l’égard du reste de l’enregistrement : si une observation présente des valeurs manquantes sur d’autres métriques non convoquées dans cette clause logique spécifique, ces dernières ne seront nullement sacrifiées. L’analyste préserve ainsi l’intégralité du capital informationnel périphérique tout en purgeant le système des défaillances localisées sur le prédicteur critique en cours d’évaluation.

4.2 Exemple empirique : ciblage d’une variable critique

Pour apprécier la granularité de ce filtrage ciblé, réexaminons notre jeu de données synthétique dans lequel des valeurs NA ont été simultanément introduites au sein de la colonne points et de la colonne assists. Supposons une hypothèse de recherche dont l’objectif exclusif est de quantifier la dispersion paramétrique de la marque offensive globale (mesurée par la variable points), tandis que la métrique de distribution de jeu (assists) demeure totalement accessoire à ce stade de l’investigation. L’élimination aveugle de tous les NA par na.omit() priverait l’analyste d’observations dont la variable points est parfaitement documentée, au seul motif que leur variable assists est absente.

En mobilisant la commande spécialisée df %>% filter(!is.na(points)), l’analyste applique un élagage ciblé. Le moteur logique de dplyr examine la colonne points : les enregistrements présentant une lacune sont expulsés de la structure de sortie, mais les lignes conservant un score valide de points subsistent sans altération, même si leur valeur d’assistance est marquée du sceau NA. L’opération garantit la préservation maximale du sous-échantillon d’intérêt pour la tâche analytique considérée.

La validation empirique de cette persistance différentielle s’effectue immédiatement en inspectant les effectifs au moyen du verbe count() ou de la primitive nrow(). On constate alors que la dimension de l’échantillon retenu est strictement supérieure à celle observée lors de l’application indiscriminée de na.omit(). Les observations partiellement documentées ont été sauvées de l’élimination prématurée, permettant ainsi d’optimiser l’efficacité asymptotique des calculs de moments statistiques d’ordre un et deux (moyenne et variance empiriques) sur la variable focale points.

4.3 Traitement de variables multiples et alternatives tidyr

Lorsque la structure du protocole empirique exige de garantir la complétude non pas sur une seule colonne, mais sur un sous-ensemble fini de variables cardinales (par exemple, un résultat clinique et un facteur d’exposition majeur), l’expression logique peut être étendue au sein du verbe filter() en enchaînant plusieurs prédicats conjonctifs. Deux syntaxes équivalentes sont admises : la séparation explicite par l’opérateur booléen ET (&), ou l’usage de la virgule comme séparateur d’arguments, selon la formulation : df %>% filter(!is.na(points), !is.na(assists)). Dans cette configuration, une observation n’est maintenue que si elle présente simultanément une valeur valide sur chacun des deux attributs sollicités.

Néanmoins, lorsque le nombre de variables à assainir croît, cette écriture répétitive peut alourdir inutilement le script et accroître la probabilité d’erreurs typographiques. C’est à cette fin que l’écosystème tidyverse propose une alternative dédiée au sein de la bibliothèque tidyr à travers le verbe drop_na(). Cette fonction combine l’expressivité de filter() et la compacité fonctionnelle : en écrivant df %>% drop_na(points, assists), l’utilisateur obtient rigoureusement le même sous-ensemble de données épuré sans devoir répéter fastidieusement l’opérateur !is.na().

Le choix entre ces deux approches procède d’un arbitrage méthodologique et contextuel bien établi :

  • L’usage de drop_na() s’impose par son ergonomie supérieure lorsqu’il s’agit d’éliminer des lignes sur la seule base de la vacuité d’un groupe arbitraire de variables, d’autant que cette fonction autorise l’usage des sélecteurs contextuels de tidyselect tels que drop_na(starts_with("score_")).
  • Le recours à filter(!is.na(...)) demeure irremplaçable lorsque la condition d’élimination de la valeur manquante est structurellement articulée avec d’autres prédicats logiques alternatifs ou disjonctifs (par exemple, exclure les NA uniquement si une troisième variable prend une modalité particulière).

5. Suppression des observations dupliquées à l’aide de distinct()

5.1 Mécanisme de déduplication des enregistrements

La présence d’enregistrements dupliqués au sein d’une table d’observation constitue une pathologie structurelle fréquente, générée par des dysfonctionnements lors de la concaténation de fichiers, des boucles de collecte automatisées redondantes ou des jointures relationnelles mal conditionnées créant des produits cartésiens involontaires. L’impact de tels doublons sur l’analyse statistique est direct : ils faussent la pondération des individus au sein de l’échantillon, génèrent une inflation artificielle de la significativité statistique en biaisant vers le bas l’estimation de la variance résiduelle, et violent de front le postulat central d’indépendance et d’identique distribution des erreurs ($i.i.d.$).

Pour assainir ce type de distorsion, dplyr met à la disposition du praticien le verbe distinct(). Ce verbe a été conçu spécifiquement pour identifier les redondances observationnelles et ne conserver qu’une seule occurrence pour chaque motif unique détecté. Il convient d’opérer une distinction sémantique claire entre le doublon parfait et la redondance partielle. Un doublon parfait se définit comme une réplication strictement conforme d’un tuple complet d’observations : chaque case de la ligne $i$ est rigoureusement identique à la case homologue de la ligne $j$, pour l’ensemble des colonnes formant l’espace des attributs du tableau. La redondance partielle, quant à elle, ne concerne qu’un sous-ensemble désigné de clés primaires.

Le mécanisme computationnel de distinct() repose sur le hachage rapide des lignes vectorielles. Les signatures calculées permettent de classer les observations dans des tables de correspondance internes en temps linéaire ou quasi linéaire, garantissant une détection des doublons bien plus véloce que les comparaisons croisées matricielles d’ordre $O(N^2)$ issues des algorithmes naïfs. Par défaut, lorsqu’aucune variable n’est expressément passée en paramètre, distinct() inspecte l’intégralité du tenseur de données et opère une déduplication intégrale de la structure, tout en préservant scrupuleusement l’ordonnancement séquentiel originel des premières occurrences identifiées.

5.2 Exemple pratique de déduplication complète

Mettons à l’épreuve ce mécanisme sur notre jeu de données expérimental. Au sein de ce dernier, l’observation relative à l’équipe ‘C’, associée à un total de huit points et quatre passes décisives, a été insérée de façon répétée à deux positions disjointes dans le tableau brut d’origine. Cette réplication symétrique symbolise un incident typique de double transmission de paquets d’informations au sein d’un pipeline de collecte en continu. Si ce tableau est directement injecté dans un modèle d’inférence, le groupe ‘C’ pèsera d’un poids statistique double sans aucune justification empirique valable.

L’application de la commande épurée df_unique <- df %>% distinct() déclenche la scrutation exhaustive de la table. Chaque tuple de données est comparé à l’ensemble des tuples déjà rencontrés. Lors du traitement de la seconde occurrence de la ligne relative à l’équipe ‘C’, le processeur détecte une parfaite identité de signature avec l’enregistrement antérieur. En conséquence, cette seconde observation est instantanément évincée du flux de sortie. L’opération est totalement transparente et ne requiert aucune spécification algébrique lourde de la part de l’utilisateur.

L’évaluation de l’intégrité référentielle post-traitement atteste du rétablissement d’une structure saine : la table résultante voit son nombre de lignes réduit exactement du montant des redondances absolues, tandis que le contenu informatif intrinsèque de chaque variable demeure intact pour les occurrences uniques. On soulignera en outre que distinct() traite les valeurs NA de façon cohérente avec la norme relationnelle SQL : deux lignes contenant des NA sur les mêmes colonnes sont considérées comme équivalentes et dédupliquées en une seule occurrence, évitant ainsi la prolifération de lignes d’indétermination identiques.

5.3 Déduplication sélective basée sur des clés primaires partielles

Dans de nombreux contextes analytiques, les observations ne sont pas des doublons stricts sur l’ensemble de leurs dimensions, mais partagent un identifiant commun (tel qu’un numéro de sujet, un identifiant de capteur ou une référence transactionnelle) alors que d’autres variables périphériques divergent sous l’effet de bruits de mesure ou d’horodatages hétérogènes. Dans ce cas, la conservation d’une seule observation par unité nécessite de fonder la déduplication sur un sous-ensemble défini d’attributs fonctionnant comme clés primaires logiques.

Le verbe distinct() autorise cette sélection ciblée par le passage explicite du nom des variables directrices en argument, selon la forme df %>% distinct(team). Cependant, par construction élémentaire, cette commande renvoie une projection orthogonale ne contenant que la colonne mentionnée, éludant ainsi toutes les autres variables du tableau original. Pour contourner cette troncature dimensionnelle et préserver l’ensemble des colonnes associées à l’observation retenue, l’adjonction de l’argument booléen .keep_all = TRUE s’avère indispensable : df %>% distinct(team, .keep_all = TRUE).

Le comportement décisionnel de cet algorithme obéit à une règle purement déterministe basée sur l’ordre de traversée des données :

  • Pour chaque modalité unique de la clé primaire identifiée, la fonction conserve invariablement la toute première ligne rencontrée dans le flux d’entrée.
  • Toutes les occurrences ultérieures associées à cette même clé sont impitoyablement supprimées, indépendamment de la pertinence ou de la qualité relative de leurs attributs secondaires.

Cette spécificité impose une vigilance méthodologique extrême : si l’analyste souhaite conserver non pas la première occurrence chronologique accidentelle, mais l’observation la plus récente ou celle affichant la métrique de qualité la plus élevée, il est impératif d’intercaler une opération de tri explicite via le verbe arrange() préalablement à l’appel de distinct().

6. Filtrage et exclusion de lignes par position d’indexation numérique

6.1 Exploitation de la fonction utilitaire row_number()

Il est des scénarios d’ingénierie statistique où l’exclusion d’enregistrements ne répond pas à des critères substantiels portés par les valeurs des variables, mais découle de considérations positionnelles strictes. C’est le cas lors de l’élimination de lignes d’en-tête parasites mal interprétées lors de la conversion de fichiers tabulaires délimités, ou de la purge de segments temporels situés à des positions calendaires fixes. Pour accomplir ces retranchements à l’intérieur du paradigme déclaratif de dplyr, la fonction utilitaire row_number() déploie des capacités de ciblage positionnel remarquables.

La fonction row_number() opère sans argument au sein des verbes de transformation et génère dynamiquement un vecteur d’entiers séquentiels ($1, 2, dots, n$) indexant l’ordre de disposition relatif des lignes dans la structure courante. Combinée harmonieusement au verbe filter(), elle permet de construire des prédicats d’exclusion positionnels d’une grande rigueur formelle. Ainsi, l’expression df %>% filter(!row_number() %in% c(1, 2, 4)) soumet chaque enregistrement à un test d’appartenance : si l’index courant de la ligne est intercepté au sein du vecteur d’entiers désignés, la négation logique transforme l’évaluation en FALSE, entraînant l’exclusion immédiate de l’observation.

Il est impératif d’insister sur la distinction conceptuelle majeure existant entre une indexation positionnelle absolue et une indexation contextuelle. La position d’une ligne dans une table R n’est jamais une propriété intrinsèque de l’observation, mais un état éphémère lié à la disposition physique de la mémoire à un instant $t$. Toute permutation, réorganisation ou filtrage antérieur modifie irrémédiablement le rang numérique des enregistrements subséquents. Par conséquent, l’utilisation de row_number() pour exclure des observations doit être maniée avec une précaution rigoureuse, idéalement réservée aux phases initiales d’ingestion où l’architecture du fichier brut garantit une invariance topologique des données parasites.

6.2 Mise en œuvre concrète sur le tableau d’exemple

Illustrons empiriquement la mise en œuvre de cette exclusion positionnelle en ciblant des enregistrements désignés de notre matrice synthétique. Imaginons un protocole d’assurance qualité ayant formellement identifié que les observations occupant les positions scalaires $1$, $2$ et $4$ de la base brute résultent d’un étalonnage déficient de la chaîne de saisie. L’analyste se trouve dans l’obligation fonctionnelle d’expurger précisément ces trois entités sans toucher aux observations adjacentes.

En exécutant le pipeline déclaratif df_elague <- df %>% filter(!row_number() %in% c(1, 2, 4)), l’action est menée avec une précision chirurgicale. Le moteur parcourt la collection séquentielle : les rangs un et deux sont court-circuités et rejetés, le rang trois franchit le sas de validation, le rang quatre est banni à son tour, et l’intégralité des rangs subséquents ($5$ à $n$) est validée. Le tableau résultant présente une réorganisation immédiate de ses dimensions, amputé de ces trois corps statistiques spécifiques.

D’un point de vue comparatif, cette formulation s’inscrit en continuité avec les mécanismes classiques de l’indexation matricielle de base R, matérialisés traditionnellement par l’opérateur de crochet négatif df[-c(1, 2, 4), ]. Toutefois, l’intégration de row_number() au sein de filter() confère une cohérence stylistique inestimable au sein d’une séquence de transformations chaînées par le pipe, évitant de devoir interrompre le flux conceptuel pour réassigner des structures intermédiaires par extraction matricielle directe.

6.3 Utilisation de la fonction slice() et de ses variantes modernes

Bien que la combinaison de filter() et de row_number() soit conceptuellement irréprochable, l’écosystème dplyr fournit une famille de fonctions spécifiquement forgée pour l’échantillonnage et la soustraction par rang numérique : la famille slice(). Cette suite de verbes spécialisés simplifie drastiquement la manipulation des positions ordinales et optimise les calculs sous-jacents en s’affranchissant de l’évaluation symbolique générale requise par filter().

Pour éliminer directement des lignes selon leurs coordonnées, la fonction slice() adopte nativement la convention des entiers négatifs de base R : l’instruction df %>% slice(-c(1, 2, 4)) intime l’ordre sans équivoque d’omettre les observations occupant les rangs un, deux et quatre. L’économie syntaxique est appréciable et la lisibilité algorithmique optimale. De surcroît, le paquet propose un ensemble de déclinaisons sémantiques raffinées pour traiter les segments extrêmes ou aléatoires d’une distribution :

  • slice_head(n = k) et slice_tail(n = k) : permettent d’isoler ou, par inversion de paramètre, de tronquer les premières ou dernières observations d’une série.
  • slice_min() et slice_max() : éliminent les lignes en fonction du classement d’une variable numérique donnée, gérant automatiquement les ex æquo (ties) de façon rigoureuse.
  • slice_sample(n = k, prop = p) : orchestre un sous-échantillonnage aléatoire d’observations, constituant l’outil idéal pour extraire des cohortes de validation ou alléger stochastiquement des tables volumineuses.

Le tableau suivant met en lumière les caractéristiques fondamentales et les divergences d’usage associées aux fonctions de partitionnement positionnel :

Fonction Mécanisme de suppression Cas d’usage privilégié Comportement face aux regroupements
filter(!row_number() %in% ...) Évaluation d’un prédicat logique séquentiel Conditions complexes mêlant index positionnel et valeurs Réinitialise l’indexation séquentielle au sein de chaque groupe
slice(-c(...)) Indexation directe par coordonnées d’entiers négatifs Suppression purement positionnelle d’enregistrements connus Élimine les rangs désignés localement dans chaque groupe
slice_head() / slice_tail() Troncature des bornes ordinales extrêmes Ablation de lignes de préambule ou de clôture parasites Opère indépendamment sur les bornes de chaque strate
slice_min() / slice_max() Tri scalaire implicite et extraction par quantile ordinal Élagage des queues de distribution empirique Sélectionne les extrema locaux groupe par groupe

7. Suppression conditionnelle simple basée sur des prédicats logiques

7.1 Principes des opérateurs de comparaison arithmétique

L’épuration des données empiriques requiert très fréquemment la formulation de règles d’exclusion s’appuyant sur la valeur intrinsèque portée par les variables. Au fondement de ces décisions se trouvent les comparateurs arithmétiques et relationnels classiques standardisés dans la syntaxe R : l’égalité stricte (==), la non-égalité (!=), la stricte supériorité (>), l’infériorité stricte (<), ainsi que les inégalités larges (>= et <=). Ces opérateurs agissent comme des fonctions vectorisées recevant un vecteur de mesures, le confrontant à une référence scalaire ou vectorielle, et renvoyant en sortie un vecteur de valeurs logiques conformes.

Dans la grammaire de dplyr, l'exclusion d'observations indésirables s'obtient conceptuellement en énonçant la condition logique de rétention complémentaire. Par exemple, si le protocole exige le rejet absolu des enregistrements où une mesure quantitative est inférieure à un seuil critique $\theta$, l'analyste spécifiera au sein du verbe de sélection l'assertion inverse stricte : filter(mesure >= theta). Cette formulation positive de la conservation requiert une gymnastique intellectuelle constante afin de ne pas inverser par inadvertance les frontières de décision, particulièrement lors de la gestion des inégalités strictes versus larges à la frontière du seuil.

Une vigilance particulière doit être portée au typage des données sous-jacentes. L'évaluation de l'égalité via == sur des nombres en virgule flottante (type double) expose l'analyste à des déconvenues majeures en raison de l'imprécision inhérente à l'arithmétique binaire standard (IEEE 754). Deux calculs censés converger vers la même grandeur théorique peuvent différer à la seizième décimale, rendant le test x == y faux de façon totalement inattendue. Pour les variables continues, les conditions d'exclusion par égalité exacte doivent être formellement proscrites au profit d'inégalités d'encadrement ou de l'usage de la fonction d'approximation near() mise à disposition par dplyr.

7.2 Exemple d'exclusion sur variable catégorielle

Considérons l'application de ces principes au retranchement d'une modalité spécifique au sein d'une variable qualitative nominale. Dans notre base de démonstration, la colonne team enregistre l'affiliation des individus à des sous-ensembles étiquetés par des lettres majuscules ('A', 'B', 'C', 'D'). Supposons qu'un incident survenu lors de la collecte implique le rejet sans appel de l'intégralité des observations associées au groupe 'A'. L'analyste se propose de purger la table de toute contamination par cette strate spécifique.

La transcription en syntaxe dplyr s'articule directement par l'application de l'inégalité stricte : df_sans_A <- df %>% filter(team != "A"). Lors de l'évaluation séquentielle, le moteur logicomathématique teste chaque chaîne textuelle. Pour l'ensemble des tuples dont l'attribut d'équipe équivaut lexicalement à "A", l'égalité renvoie TRUE, laquelle est instantanément inversée par l'inégalité en FALSE, condamnant l'enregistrement à l'omission. Inversement, toute modalité distincte ('B', 'C', etc.) valide la clause à TRUE et franchit victorieusement le filtre.

Le contrôle méthodologique post-filtrage constitue une étape non négociable de la démarche qualité. L'analyste diligent confirmera la disparition absolue de l'entité rejetée en mobilisant par exemple la commande df_sans_A %>% count(team) ou unique(df_sans_A$team). On observera alors que la distribution des modalités restantes est scrupuleusement préservée, sans modification de leur fréquence absolue respective, attestant du caractère strictement orthogonal de l'opération d'éviction par rapport aux données conformes.

7.3 Exemple d'exclusion sur variable numérique continue

L'élimination conditionnelle s'illustre avec une égale acuité lors de la régulation de seuils sur des métriques d'échelle continues ou discrètes. Prenons le cas d'une étude d'efficience sportive où l'on décrète arbitrairement qu'un score inférieur ou égal à sept unités sur la variable points traduit une contre-performance non exploitable pour l'étalonnage d'un modèle d'élite. L'objectif analytique consiste donc à supprimer systématiquement toutes les lignes affichant points <= 7.

Formulant la condition de préservation sous forme complémentaire, l'analyste écrit : df_performants <- df %>% filter(points > 7). L'évaluation s'exécute le long du vecteur numérique. Les lignes affichant des valeurs comme six ou sept sont évincées, tandis que celles pointant à huit ou au-delà sont préservées. Cette syntaxe offre une clarté visuelle indéniable qui documente directement le seuil d'inclusion choisi pour le design expérimental.

Néanmoins, une propriété fondamentale du moteur de filter() doit impérativement être comprise lors de l'exécution de comparaisons scalaires sur des colonnes contenant des données incomplètes : le traitement automatique des valeurs manquantes. Si la colonne points d'un individu contient NA, l'évaluation arithmétique NA > 7 ne renvoie ni TRUE, ni FALSE, mais la valeur indéterminée NA. Par construction, comme nous l'avons souligné au chapitre introductif, filter() écarte sans sommation toute observation dont l'évaluation produit un résultat indéterminé. Dès lors, le filtre quantitatif points > 7 opère une double suppression implicite : il élimine à la fois les valeurs numériques inférieures ou égales à sept, mais également l'intégralité des observations dont le score de points est manquant.

8. Filtrage conditionnel complexe avec opérateurs booléens multiples

8.1 Combinaison logique par conjonction et disjonction

La réalité des études scientifiques impose fréquemment la formulation de critères de tri d'une complexité supérieure à de simples seuils univariés. Les protocoles expérimentaux réclament l'entrelacement de multiples prédicats au moyen des connecteurs cardinaux de l'algèbre de Boole : l'opérateur de conjonction logique ET, matérialisé par le symbole esperluette (&), et l'opérateur de disjonction inclusive OU, transcrit par la barre verticale (|). La maîtrise de ces opérateurs au sein de filter() conditionne la finesse de l'extraction des données.

L'algèbre booléenne répond à des tables de vérité universelles que l'analyste doit garder constamment à l'esprit. L'expression conjonctive Condition_1 & Condition_2 n'évalue à TRUE que dans l'unique configuration où l'ensemble des propositions composantes est simultanément vérifié. À la moindre défaillance de l'une d'elles, l'enregistrement est écarté. À l'opposé, l'expression disjonctive Condition_1 | Condition_2 accorde la validation dès lors qu'au moins l'une des deux conditions est satisfaite, n'excluant la ligne que dans le cas d'une invalidation totale conjointe.

L'écueil prépondérant dans l'ordonnancement de prédicats multiples réside dans la méconnaissance des règles de préséance des opérateurs arithmétiques et logiques. En langage R, l'opérateur & possède une priorité syntaxique supérieure à l'opérateur |. En conséquence, une instruction formulée telle que filter(cond1 | cond2 & cond3) sera mécaniquement interprétée par l'interpréteur comme filter(cond1 | (cond2 & cond3)), ce qui peut diverger radicalement de la logique intentionnelle du chercheur qui envisageait filter((cond1 | cond2) & cond3). Le recours scrupuleux et systématique au parenthésage formel constitue le seul rempart méthodologique garantissant l'intégrité de l'évaluation lors d'assemblages logiques composites.

8.2 Exemple pratique : filter(column1 == 'A' | column2 > 8)

Examinons pas à pas la dynamique opératoire d'une assertion disjonctive complexe en soumettant notre jeu de données expérimental à la commande suivante : df_complexe <- df %>% filter(team == 'A' | points > 8). Dans cette configuration, l'intention de l'analyste est de préserver une observation si elle remplit au moins l'une de ces deux conditions : appartenir formellement à l'équipe 'A' OU avoir cumulé un score strictement supérieur à huit points. L'exclusion frappera donc uniquement les observations ne satisfaisant ni à l'un, ni à l'autre de ces critères.

Le traitement ligne par ligne s'effectue selon la séquence logique suivante :

  • Une ligne rattachée à l'équipe 'A' affichant un score modeste de six points est formellement validée, car le premier prédicat est TRUE, rendant l'état du second indifférent à la validation finale.
  • Une ligne appartenant à l'équipe 'B' mais affichant un score remarquable de dix points est également retenue, le second terme validant la disjonction.
  • Une ligne affiliée à l'équipe 'C' dotée de seulement cinq points voit ses deux prédicats s'effondrer à FALSE ; elle est en conséquence expulsée de la table résultante.

Toutefois, la présence de valeurs NA vient compliquer l'évaluation logique en vertu des principes de la logique ternaire de Kleene. Si une observation de l'équipe 'B' présente un score NA sur la variable points, l'expression globale se décompose ainsi : FALSE | NA, ce qui s'évalue irrémédiablement en NA. La ligne est donc supprimée par le filtre. En revanche, si une observation rattachée à l'équipe 'A' affiche un score NA, l'expression devient : TRUE | NA. Dans la logique de R, la certitude que le premier terme est vrai suffit à rendre l'expression globale universellement vraie, quelle que soit la valeur théorique cachée derrière le NA. En conséquence, cette ligne spécifique est retenue, illustrant la subtilité chirurgicale avec laquelle filter() résout les équations logiques partielles.

8.3 Filtrage d'appartenance à un ensemble avec l'opérateur %in%

Il est fréquent de devoir conditionner l'exclusion ou la conservation de lignes sur la base d'une énumération étendue de critères discrets. Par exemple, si l'on souhaite éliminer les observations issues des équipes 'A', 'C', 'E' et 'G', l'écriture séquentielle de disjonctions d'égalités sous la forme team == 'A' | team == 'C' | team == 'E' | ... s'avère non seulement fastidieuse, mais hautement propice aux erreurs de frappe et difficilement généralisable au sein d'un pipeline d'automatisation.

L'opérateur d'appartenance vectorielle %in% résout ce problème d'élégance syntaxique et de puissance d'évaluation. Cet opérateur confronte chaque élément du vecteur de gauche à l'ensemble constitué par le vecteur de droite, renvoyant TRUE en cas d'intersection avérée. Pour convertir cette appartenance en critère d'exclusion, il suffit d'adjoindre l'opérateur de négation logique unaire placé en préambule de la proposition. L'instruction prend ainsi la forme canonique : df %>% filter(!team %in% c('A', 'C')).

Outre sa supériorité évidente en matière de concision d'écriture, l'opérateur %in% présente un avantage majeur dans le traitement des incertitudes : contrairement à l'opérateur d'égalité stricte ==, %in% ne renvoie jamais NA lorsqu'il rencontre une valeur manquante. Si la colonne examinée comporte une entrée NA, celle-ci est testée contre l'ensemble cible. Si le vecteur cible ne contient pas explicitement NA, le test renvoie sagement FALSE. Dès lors, son inversion logique par ! produira un TRUE robuste, garantissant que les lignes possédant des valeurs manquantes ne seront pas éjectées accidentellement par un effet de bord du test d'appartenance catégorielle.

9. Suppression de lignes par correspondance textuelle et motifs regex

9.1 Intégration des fonctions stringr dans filter()

L'épuration des données textuelles non structurées ou semi-structurées requiert des outils d'extraction d'une flexibilité supérieure aux comparaisons scalaires directes. Au sein du tidyverse, l'extension spécialisée stringr s'interface avec une cohérence remarquable au sein du verbe filter() de dplyr pour exécuter des suppressions d'observations fondées sur la reconnaissance de motifs linguistiques ou lexicaux. Cette intégration confère aux pipelines R la puissance d'analyse textuelle indispensable aux études contemporaines.

Le pivot de cette synergie réside dans la fonction str_detect(). Cette dernière accepte en entrée un vecteur de chaînes de caractères ainsi qu'un motif de recherche (pattern), puis renvoie un vecteur logique de même longueur indiquant par TRUE la présence du motif au sein de la chaîne considérée, et par FALSE son absence. Dès lors, pour opérer l'éviction systématique de lignes renfermant une sous-chaîne proscrite, il suffit d'inverser la réponse booléenne de str_detect() au moyen de la négation logique : df %>% filter(!str_detect(variable_texte, "motif_a_exclure")).

Cette approche fonctionnelle dépasse les anciennes routines issues du langage R de base telles que grepl(). Non seulement la famille str_* garantit une homogénéité stricte des signatures d'arguments (le vecteur analysé occupant invariablement le premier paramètre positionnel), mais elle assure une prise en charge native et sécurisée de l'encodage universel UTF-8 ainsi qu'un comportement prévisible face aux valeurs indéterminées. Lorsqu'une case textuelle contient un NA, str_detect() renvoie un NA formel, assurant sa neutralisation sécurisée dans le filtre sans risque de conversion silencieuse en chaîne de caractères littérale "NA".

9.2 Applications pratiques sur des variables de type caractère

Les champs d'application de cette technique d'élimination textuelle sont particulièrement vastes dans le traitement quotidien des bases de données de recherche. Prenons le cas d'un identifiant patient ou participant issu d'une étude observationnelle dans laquelle des enregistrements temporaires, identifiés par le préfixe "TEST_" ou le suffixe "_DRAFT", ont été malencontreusement conservés dans les tables de production. L'objectif est d'éliminer toutes les lignes d'observations contenant ces marqueurs de développement.

La formulation de la commande d'exclusion s'exprime ainsi : df_nettoye <- df %>% filter(!str_detect(identifiant, "^TEST_")). L'utilisation du métacaractère accent circonflexe ancre la détection au début exact de la chaîne, garantissant qu'un enregistrement valide qui contiendrait malencontreusement la sous-chaîne "TEST" en milieu de mot ne soit pas évincé indûment. De manière symétrique, le filtrage des suffixes parasites recourt à l'ancre dollar, matérialisant la terminaison formelle de l'attribut textuel : filter(!str_detect(identifiant, "_DRAFT$")).

Un autre cas d'usage récurrent concerne le nettoyage des espaces blancs résiduels et des chaînes composées exclusivement de caractères invisibles (tabulations, sauts de ligne, espaces insécables). Ces entrées corrompues ne sont pas formellement des NA au sens informatique, mais représentent un vide informationnel équivalent. En associant str_trim() à la détection de vacuité, l'analyste peut formuler un filtre d'assainissement radical tel que filter(str_trim(commentaire) != ""), éjectant ainsi d'un seul bloc toutes les lignes où la variable ne contient aucune information textuelle utile.

9.3 Filtrage avancé par expressions régulières

Lorsque les critères de non-conformité structurelle ne reposent pas sur des motifs textuels constants mais sur le non-respect d'un standard de formatage syntaxique complexe, le recours aux expressions régulières complètes (regex) devient incontournable. Les expressions régulières constituent un métalangage de description formelle de structures textuelles, mobilisant des classes de caractères, des quantificateurs et des assertions d'encadrement.

Supposons que notre table de données comporte une colonne dédiée à l'enregistrement d'un code d'identification normalisé, lequel doit rigoureusement obéir à la composition suivante : deux lettres alphabétiques majuscules, suivies d'un tiret d'union, suivi de quatre chiffres décimaux (ex. "AB-1234"). Tout enregistrement dérogeant à cette structure rigoureuse résulte d'une corruption de saisie et doit être supprimé de l'espace analytique. L'invalidation se traduit en syntaxe dplyr par la validation positive du motif régulier conforme :

df_valide <- df %>% filter(str_detect(code_patient, "^[A-Z]{2}-[0-9]{4}$"))

L'observation du comportement computationnel de ce type de filtre appelle à des précautions méthodologiques d'importance quant à la complexité algorithmique. Les moteurs d'expressions régulières (fondés sur la bibliothèque open-source ICU sous stringr) mobilisent des automates finis non déterministes. Bien que remarquablement performants sur des jeux de données d'échelle courante, des motifs regex excessivement complexes comportant des quantificateurs imbriqués non possessifs peuvent induire un phénomène catastrophique de rétrogradation exponentielle (catastrophic backtracking). Sur des corpus massifs de plusieurs millions de lignes, l'analyste veillera à formuler des regex déterministes d'une parcimonie maximale ou à décomposer ses filtres en étapes booléennes élémentaires pour préserver l'efficience du temps de calcul.

10. Suppression conditionnelle au niveau groupé avec group_by()

10.1 Concept de filtrage contextuel par groupe

L'une des innovations majeures introduite par dplyr réside dans sa capacité à partitionner virtuellement une structure rectangulaire au moyen du verbe group_by() afin de modifier le contexte d'évaluation de toutes les fonctions ultérieures. Lorsqu'un tableau subit un groupement, les opérations ne sont plus appliquées à l'échelle globale de la population statistique, mais s'exécutent de façon étanche et autonome au sein de chaque strate définie par les variables de regroupement.

L'application du verbe filter() à une structure groupée altère profondément la sémantique de l'évaluation logique. Au lieu de confronter les données d'une ligne à une constante scalaire universelle ou à un vecteur global, filter() résout les assertions logiques par rapport aux moments statistiques locaux propres à la strate à laquelle appartient chaque ligne. Il devient ainsi possible d'écrire df %>% group_by(team) %>% filter(points > mean(points, na.rm = TRUE)). Dans cette configuration, le seuil d'inclusion n'est pas figé : une ligne n'est conservée que si son score de points surpasse la moyenne spécifique de sa propre équipe.

Cette distinction entre filtres au niveau de l'individu isolé et filtres au niveau de la population groupée introduit un saut qualitatif dans l'analyse de données. Elle permet d'éliminer des lignes non pas sur la base de critères absolus arbitraires, mais en fonction de leur position relative au sein de leur propre sous-population de référence. Cette approche contextualisée évite de biaiser l'échantillon en éliminant préférentiellement des individus appartenant à des sous-groupes structurellement caractérisés par des moyennes globales inférieures.

10.2 Exemples d'élimination de strates entières d'observations

Une modalité fondamentale du filtrage groupé réside dans la capacité à éliminer d'un seul bloc des strates complètes d'observations dès lors que la sous-population concernée ne satisfait pas à un cahier des charges statistique prédéfini. L'analyste ne filtre plus des individus isolés, mais utilise la taille ou les propriétés d'agrégation du groupe pour autoriser ou interdire la persistance de l'ensemble de ses composantes.

Un cas de figure canonique concerne l'exclusion systématique des strates sous-représentées. Dans de nombreux protocoles cliniques ou sociologiques, un groupe dont l'effectif d'échantillonnage ($n$) est trop exigu ne permet pas d'estimer valablement la variance intra-groupe et menace la convergence des modèles multiniveaux. Pour évincer tous les groupes comptant moins de trois individus, la formulation dplyr s'avère d'une concision exemplaire :

df_filtre <- df %>% group_by(team) %>% filter(n() >= 3) %>% ungroup()

Dans ce segment de code, la fonction utilitaire n() calcule dynamiquement l'effectif associé à chaque modalité d'équipe. Si une équipe ne réunit qu'une ou deux observations, l'assertion évalue à FALSE pour l'intégralité des membres de cette équipe, ce qui provoque la disparition complète de la strate dans le tableau épuré.

Il est impératif de souligner l'obligation méthodologique absolue de clore systématiquement toute séquence de traitement groupé par l'appel explicite au verbe ungroup(). Omettre ce dégroupement final laisse la table dans un état partitionné invisible en mémoire. Toutes les transformations, sélections ou calculs statistiques subséquents conduits ultérieurement par d'autres fonctions continueront alors de s'exécuter strate par strate, ce qui peut engendrer des ralentissements algorithmiques massifs et des erreurs d'interprétation critiques lors d'estimations globales.

10.3 Applications empiriques aux séries temporelles et mesures répétées

Dans les dispositifs longitudinaux, les essais randomisés contrôlés à mesures répétées et les séries temporelles en panel, l'unité d'analyse statistique n'est plus l'observation instantanée, mais la trajectoire temporelle globale du participant ou de l'entité suivie. L'un des impératifs du nettoyage de telles structures consiste à supprimer l'intégralité des enregistrements temporels d'un sujet dès lors que son suivi longitudinal présente des ruptures de protocole ou une incomplétude rédhibitoire.

Supposons un protocole d'observation s'étendant formellement sur quatre vagues séquentielles (temps $T_1$, $T_2$, $T_3$, $T_4$). Si un participant a manqué l'une des vagues d'évaluation intermédiaire, son profil longitudinal est incomplet et l'estimation de son modèle de croissance individuel se trouve compromise. Pour purger la base de données de tous les participants n'ayant pas honoré l'intégralité des quatre temps de recueil, l'analyste formule le filtre contextuel suivant :

df_longitudinal <- df_panel %>% group_by(sujet_id) %>% filter(n_distinct(temps_mesure) == 4) %>% ungroup()

Par cette instruction, le nombre de temps de mesure distincts est calculé à l'intérieur de chaque profil individuel. Les participants présentant un historique tronqué (trois mesures ou moins) sont intégralement retranchés de la cohorte d'analyse, éliminant ainsi le risque d'introduire des séries temporelles déséquilibrées dans les estimations économétriques sans devoir procéder à des ajustements matriciels manuels laborieux.

11. Bonnes pratiques, performance algorithmique et erreurs courantes

11.1 Le piège triadique des valeurs manquantes dans les tests logiques

La source d'erreurs la plus pernicieuse lors de la suppression de lignes avec dplyr découle directement de la confrontation entre les comparateurs relationnels et la logique triadique (ou ternaire) inhérente au traitement des valeurs indéterminées en R. Dans le modèle formel de Kleene, une assertion logique confrontée à une absence d'information ne produit pas un état binaire vrai ou faux, mais un troisième état indéterminé matérialisé par la constante NA. La proposition formelle NA == 5 ne renvoie pas FALSE, elle renvoie rigoureusement NA, car il est logiquement impossible d'affirmer la fausseté d'une égalité dont l'un des termes est inconnu.

Ce postulat épistémique engendre un piège critique lorsque l'analyste recourt au prédicat d'exclusion standard filter(variable != "Valeur"). L'intuition commune conduit à supposer que cette commande préserve toutes les lignes dont la variable n'est pas égale à la modalité désignée. Or, pour toute observation où la variable est codée NA, le test NA != "Valeur" se résout en NA. Puisque filter() applique le principe conservateur d'écarter systématiquement tout enregistrement non expressément validé à TRUE, toutes les lignes comportant des valeurs manquantes sont éliminées silencieusement. L'analyste se trouve alors avoir supprimé des données sans en avoir formulé l'intention explicite.

Pour neutraliser ce piège fondamental et immuniser le pipeline contre ces ablations clandestines, deux stratégies syntaxiques défensives doivent être adoptées :

  • Formuler explicitement la clause de tolérance des valeurs manquantes au moyen d'une disjonction inclusive : filter(variable != "Valeur" | is.na(variable)).
  • Mobiliser la fonction utilitaire coalesce() issue de dplyr pour remplacer dynamiquement, au moment strict de l'évaluation logique, les indéterminations par une modalité neutre qui ne perturbe pas le test relationnel.

11.2 Optimisation computationnelle pour les volumétries massives

Lorsque le volume de données franchit l'échelle des dizaines de millions d'enregistrements (Big Data), l'efficience algorithmique des opérations d'éviction de lignes devient une préoccupation architecturale majeure. Bien que les routines C++ de dplyr soient remarquablement optimisées, des disparités de performances considérables peuvent survenir selon la manière dont les prédicats de filtrage sont agencés et exécutés en mémoire vive.

Une première règle d'optimisation fondamentale concerne l'ordre d'évaluation des prédicats multiples au sein de filter(). Le moteur sous-jacent applique le principe de l'évaluation court-circuit (short-circuit evaluation) : dans une suite d'arguments conjonctifs séparés par des virgules, l'évaluation s'interrompt dès qu'un prédicat renvoie FALSE. Par conséquent, il est stratégiquement impératif de placer en première position les prédicats logiques les plus sélectifs (ceux qui éliminent la fraction la plus importante du tableau) et les moins coûteux en temps CPU (comme les comparaisons scalaires directes), et de reléguer en queue de chaîne les expressions computationnellement onéreuses, telles que les détections de motifs par expressions régulières ou les fonctions statistiques fenêtrées.

Pour les contextes où l'empreinte mémoire d'un data.frame dépasse les capacités de l'interpréteur R standard, l'intégration du paquet dtplyr représente une solution technique de premier plan. dtplyr fournit une interface transparente permettant d'écrire du code dplyr canonique tout en traduisant automatiquement les expressions sous forme d'instructions compilées à destination de l'architecture ultra-véloce de data.table. Cette hybridation garantit des vitesses de filtrage multi-cœurs quasi instantanées et des modifications en mémoire par référence sans copie superficielle de structure (copy-on-modify), alliant l'ergonomie sémantique du tidyverse à la puissance brute du calcul vectoriel compilé.

11.3 Validation et auditabilité du processus de suppression

L'assainissement statistique d'une matrice empirique ne saurait être considéré comme complet sans la mise en place d'un protocole formel de validation et d'auditabilité. Chaque transformation soustractive appliquée au corpus doit pouvoir être mesurée, documentée et adossée à des indicateurs de déperdition d'effectifs vérifiables. Cette exigence de rigueur répond directement aux standards de publication académique internationaux, à l'image des célèbres diagrammes de flux d'inclusion préconisés par les directives CONSORT dans le domaine biomédical.

Pour matérialiser cet audit au fil de l'eau, il est vivement recommandé d'encadrer les pipelines d'épuration par des points de contrôle quantitatifs. L'adjonction de messages d'information calculant la différence absolue et relative d'individus après chaque étape critique permet d'alerter instantanément l'analyste en cas d'effondrement anormal de la taille de l'échantillon. L'usage de structures d'enregistrement d'états intermédiaires permet ainsi d'extraire automatiquement des métadonnées de traçabilité décrivant avec exactitude le nombre d'observations retranchées pour chaque critère d'exclusion spécifique (doublons, seuils quantitatifs, incomplétude).

Enfin, la fiabilisation industrielle du pipeline de données exige l'intégration de tests unitaires automatisés mobilisant des extensions spécialisées telles que testthat. En formulant des assertions systématiques sur le résultat final — certifiant par exemple que nrow(df_propre) > 0, que anyDuplicated(df_propre) == 0 ou qu'aucune valeur de la variable cible ne viole le domaine de définition théorique admis —, l'analyste érige des barrières étanches contre la propagation silencieuse d'anomalies de traitement, garantissant une robustesse méthodologique irréprochable.

12. Étude de cas intégrée : protocole complet de nettoyage d'un jeu de données

12.1 Présentation du cas d'étude et formalisation du problème

Afin de synthétiser l'ensemble des concepts, fonctions et stratégies explorés au cours de ce traité, nous déployons une étude de cas intégrée modélisant un protocole complet de nettoyage de données. Considérons un jeu de données brut issu d'une enquête comportementale multicentrique mesurant les performances cognitives d'individus soumis à différents stimuli expérimentaux. Ce fichier source, caractérisé par un volume initial de dix mille enregistrements ventilés sur six variables fondamentales, présente l'intégralité des pathologies couramment disséminées dans les environnements de production réels.

L'audit préliminaire du corpus brut met en lumière une série de défaillances structurelles majeures qu'il convient de résorber méthodiquement :

  • Des dysfonctionnements de transfert réseau ont provoqué l'insertion d'un nombre conséquent de doublons parfaits répartis de façon aléatoire dans la base.
  • Des sessions d'évaluation interrompues ont généré des valeurs manquantes massives (NA) sur la variable d'évaluation principale (score_cognitif) ainsi que sur les indicateurs physiologiques annexes.
  • Des erreurs de saisie manuelle ont introduit des scores aberrants irréalistes (valeurs négatives ou dépassant les bornes maximales théoriques de l'échelle d'évaluation fixée à cent points).
  • La présence d'identifiants de participants non conformes comportant des mentions de test interne ou des anomalies typographiques altère la variable d'identification.
  • Certains centres expérimentaux n'ont recruté qu'une poignée marginale de participants, interdisant toute modélisation multi-niveaux fiable à l'échelle du centre en raison d'un manque d'effectif critique.

Le cahier des charges méthodologique est formellement arrêté : il s'agit d'élaborer un pipeline séquentiel continu, articulé autour des verbes cardinaux de dplyr, capable de purger rigoureusement l'intégralité de ces scories sans jamais dénaturer la cohérence globale des observations valides, tout en assurant une traçabilité intégrale de la déperdition d'échantillon.

12.2 Mise en œuvre séquentielle du pipeline dplyr complet

La transcription de ce protocole en syntaxe déclarative prend la forme d'une séquence ininterrompue d'opérations chaînées par l'opérateur de canalisation. Chaque étape répond à un objectif précis d'assainissement et met en œuvre l'un des mécanismes fondamentaux étudiés dans les sections précédentes :

# Pipeline séquentiel d'épuration complète des données d'évaluation comportementale
donnees_finales <- donnees_brutes |>
  # Étape 1 : Élimination intégrale des doublons parfaits d'enregistrement
  distinct() |>
  # Étape 2 : Purge ciblée des identifiants non conformes ou de test technique
  filter(!str_detect(participant_id, "^TEST_|_DEV$")) |>
  # Étape 3 : Suppression des observations incomplètes sur la métrique focale
  filter(!is.na(score_cognitif)) |>
  # Étape 4 : Éviction des valeurs aberrantes hors bornes théoriques de l'instrument
  filter(score_cognitif >= 0 & score_cognitif <= 100) |>
  # Étape 5 : Filtrage groupé pour éliminer les centres à trop faible effectif de recrutement
  group_by(centre_id) |>
  filter(n() >= 10) |>
  ungroup()

L'exécution de cette suite logique de transformations s'opère avec une fluidité totale. La table brute traverse successivement le filtre de déduplication haché, l'évaluation par expression régulière textuelle, l'exclusion ciblée de la vacuité informationnelle, la normalisation paramétrique par encadrement arithmétique, et enfin le tamisage contextuel au niveau groupé. L'analyste s'assure par l'appel final à ungroup() que la structure matricielle de sortie est immédiatement disponible pour l'estimation de modèles linéaires généralisés ou de visualisations sous ggplot2, sans persistance d'états d'agrégation résiduels.

L'évaluation des effectifs post-nettoyage au moyen des commandes de dénombrement rapide comme tally() démontre que la base a été allégée d'environ vingt-cinq pour cent de son volume brut initial. Loin d'être un préjudice, cet émondage sélectif a éliminé les biais de mesure les plus sévères, harmonisé les variances intra-centres et restauré la validité interne des estimations statistiques futures.

12.3 Synthèse comparative des commandes dplyr de suppression de lignes

Pour parachever ce tour d'horizon complet et guider le praticien dans l'arbitrage quotidien de ses choix syntaxiques, le tableau synoptique suivant récapitule de manière exhaustive l'arsenal des commandes disponibles au sein de dplyr et du tidyverse pour l'éviction d'observations, en spécifiant pour chacune son domaine de prédilection et ses comportements caractéristiques face à l'indétermination informationnelle :

Fonction / Syntaxe Objectif premier Sensibilité aux valeurs NA Coût computationnel Alternative privilégiée
na.omit() Suppression universelle des lignes incomplètes Élimine la ligne si un seul NA est détecté Faible (routine C optimisée) tidyr::drop_na()
filter(!is.na(col)) Suppression ciblée des NA sur une colonne donnée Cible exclusivement la variable spécifiée Très faible (évaluation vectorielle directe) tidyr::drop_na(col)
distinct() Suppression des redondances et doublons Considère deux NA comme des valeurs équivalentes Modéré à élevé (table de hachage en mémoire) unique() (base R)
slice(-c(...)) Suppression directe par position ordinale Totalement insensible au contenu des cellules Extrêmement faible (accès direct par index) Indexation matricielle [-i, ]
filter(predicat) Suppression conditionnelle selon critères de valeur Supprime systématiquement les NA (sauf précaution) Variable selon la complexité des prédicats subset() (base R)
group_by() %>% filter() Suppression conditionnelle à l'échelle d'une strate Dépend de la gestion des NA dans les agrégats Élevé (partitionnement et calculs locaux) Agrégation puis jointure de filtrage

Au terme de cette exploration systématique, il apparaît avec évidence que la suppression de lignes dans l'environnement R ne relève pas d'une simple routine d'exécution mécanique, mais constitue un pan fondamental de la méthodologie statistique. La richesse, la flexibilité et la rigueur conceptuelle des fonctions fournies par dplyr confèrent à l'analyste les leviers indispensables pour manipuler ses données empiriques avec un niveau d'exactitude, de transparence et d'élégance syntaxique conforme aux exigences les plus strictes de la science contemporaine.

Références

  • Bache, S. M., & Wickham, H. (2022). magrittr: A Forward-Pipe Operator for R (R package version 2.0.3). https://CRAN.R-project.org/package=magrittr
  • Dowle, M., & Srinivasan, A. (2023). data.table: Extension of `data.frame` (R package version 1.14.8). https://CRAN.R-project.org/package=data.table
  • Little, R. J. A., & Rubin, D. B. (2019). Statistical Analysis with Missing Data (3rd ed.). John Wiley & Sons. https://doi.org/10.1002/9781119482260
  • R Core Team. (2023). R: A Language and Environment for Statistical Computing. R Foundation for Statistical Computing, Vienna, Austria. https://www.R-project.org/
  • van Buuren, S. (2018). Flexible Imputation of Missing Data (2nd ed.). Chapman and Hall/CRC. https://doi.org/10.1201/9780429492259
  • Wickham, H. (2019). Advanced R (2nd ed.). Chapman and Hall/CRC. https://adv-r.hadley.nz/
  • Wickham, H., Averick, M., Bryan, J., Chang, W., McGowan, L. D., François, R., Grolemund, G., Hayes, A., Henry, L., Hester, J., Kuhn, M., Pedersen, T. L., Miller, E., Bache, S. M., Müller, K., Ooms, J., Robinson, D., Seidel, D. P., Spinu, V., Takahashi, K., Vaughan, D., Wilke, C., Woo, K., & Yutani, H. (2019). Welcome to the Tidyverse. Journal of Open Source Software, 4(43), 1686. https://doi.org/10.21105/joss.01686
  • Wickham, H., Çetinkaya-Rundel, M., & Grolemund, G. (2023). R for Data Science: Import, Tidy, Transform, Visualize, and Model Data (2nd ed.). O'Reilly Media. https://r4ds.hadley.nz/
  • Wickham, H., François, R., Henry, L., Müller, K., & Vaughan, D. (2023). dplyr: A Grammar of Data Manipulation (R package version 1.1.4). https://CRAN.R-project.org/package=dplyr
★

Rate This Content

5.0 / 5 • 1 vote

Citer cet article

Looti, M. (2026, septembre 11). Comment supprimer des lignes en utilisant dplyr (avec exemples). Base de données de psychologie en français. https://fr.arabpsychology.com/statistics/comment-supprimer-des-lignes-dplyr-exemples/
Looti, Mohammed. “Comment supprimer des lignes en utilisant dplyr (avec exemples).” Base de données de psychologie en français, 11 septembre 2026, https://fr.arabpsychology.com/statistics/comment-supprimer-des-lignes-dplyr-exemples/.
Looti, Mohammed. “Comment supprimer des lignes en utilisant dplyr (avec exemples).” Base de données de psychologie en français. septembre 11, 2026. https://fr.arabpsychology.com/statistics/comment-supprimer-des-lignes-dplyr-exemples/.