{"id":4123,"date":"2026-10-14T18:01:10","date_gmt":"2026-10-14T18:01:10","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-supprimer-des-lignes-dplyr-exemples\/"},"modified":"2026-10-14T18:01:10","modified_gmt":"2026-10-14T18:01:10","slug":"comment-supprimer-des-lignes-dplyr-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-supprimer-des-lignes-dplyr-exemples","title":{"rendered":"Comment supprimer des lignes en utilisant dplyr (avec exemples)"},"content":{"rendered":"<p>Dans l&rsquo;\u00e9cosyst\u00e8me du traitement statistique contemporain, la manipulation rigoureuse des structures tabulaires constitue une \u00e9tape cardinale, conditionnant l&rsquo;ensemble des inf\u00e9rences ult\u00e9rieures. L&rsquo;av\u00e8nement du paradigme du <a rel=\"noopener noreferrer\" href=\"https:\/\/www.tidyverse.org\/\">tidyverse<\/a> au sein de l&rsquo;environnement de programmation R a profond\u00e9ment transform\u00e9 cette d\u00e9marche m\u00e9thodologique en substituant \u00e0 des syntaxes historiques parfois absconses une grammaire formelle, expressive et hautement optimis\u00e9e. Au c\u0153ur de cette architecture, l&rsquo;extension <strong>dplyr<\/strong> fournit une collection coh\u00e9rente de verbes con\u00e7us pour op\u00e9rer sur les donn\u00e9es comme le ferait un analyste formulant une s\u00e9rie de propositions logiques ordonn\u00e9es. La suppression de lignes \u2014 op\u00e9ration qui consiste formellement \u00e0 isoler un sous-ensemble d&rsquo;observations r\u00e9pondant \u00e0 des crit\u00e8res d&rsquo;exclusion ou d&rsquo;inclusion rigoureux \u2014 repr\u00e9sente l&rsquo;un des actes fondamentaux de la pr\u00e9paration des donn\u00e9es empiriques.<\/p>\n<p>Traiter l&rsquo;\u00e9lagage d&rsquo;une matrice d&rsquo;observations ne se r\u00e9sume pas \u00e0 une simple commodit\u00e9 d&rsquo;\u00e9criture syntaxique. Cette t\u00e2che engage la responsabilit\u00e9 \u00e9pist\u00e9mologique du chercheur et du statisticien, dans la mesure o\u00f9 chaque ligne retranch\u00e9e modifie la distribution empirique des variables, alt\u00e8re la structure des r\u00e9sidus dans les mod\u00e8les param\u00e9triques et influe sur la puissance statistique globale du dispositif exp\u00e9rimental. Qu&rsquo;il s&rsquo;agisse d&rsquo;\u00e9carter des enregistrements pollu\u00e9s par des artefacts techniques, d&rsquo;\u00e9liminer des redondances issues de jointures d\u00e9fectueuses ou de purger un corpus de ses valeurs manquantes selon des hypoth\u00e8ses explicites sur le m\u00e9canisme d&rsquo;incompl\u00e9tude, le choix des fonctions mobilis\u00e9es doit reposer sur une ma\u00eetrise parfaite de leur s\u00e9mantique computationnelle.<\/p>\n<p>Cet article propose une exploration exhaustive, th\u00e9orique et appliqu\u00e9e, des techniques permettant d&rsquo;\u00e9vincer des lignes au moyen du m\u00e9talangage <strong>dplyr<\/strong>. \u00c0 travers un continuum d&rsquo;analyses d\u00e9taill\u00e9es, d&rsquo;exemples reproductibles et de discussions m\u00e9thodologiques approfondies, nous examinerons comment mobiliser les verbes cardinaux, articuler les pr\u00e9dicats bool\u00e9ens, appr\u00e9hender la logique ternaire propre aux valeurs manquantes et optimiser les algorithmes sous-jacents sur des volum\u00e9tries massives. L&rsquo;ambition est d&rsquo;offrir au praticien une r\u00e9f\u00e9rence incontournable pour assainir ses donn\u00e9es sans jamais sacrifier la tra\u00e7abilit\u00e9 ni l&rsquo;int\u00e9grit\u00e9 de sa d\u00e9marche scientifique.<\/p>\n<h2>1. Introduction aux principes fondamentaux de la suppression de lignes avec dplyr<\/h2>\n<h3>1.1 Le r\u00f4le du filtrage des donn\u00e9es dans le pipeline analytique<\/h3>\n<p>L&rsquo;int\u00e9grit\u00e9 analytique d&rsquo;une \u00e9tude quantitative d\u00e9pend en premier lieu de la salubrit\u00e9 de son corpus d&rsquo;observations. Dans un pipeline de science des donn\u00e9es standardis\u00e9, l&rsquo;\u00e9tape pr\u00e9liminaire de nettoyage (ou <em>data wrangling<\/em>) absorbe couramment une part pr\u00e9pond\u00e9rante des ressources cognitives et temporelles de l&rsquo;analyste. Ce processus ne constitue pas un simple pr\u00e9liminaire subalterne : il d\u00e9limite pr\u00e9cis\u00e9ment le champ d&rsquo;application de la validit\u00e9 interne des inf\u00e9rences statistiques. Lorsque des donn\u00e9es brutes parviennent au syst\u00e8me d&rsquo;ingestion, elles charrient in\u00e9vitablement des bruits exp\u00e9rimentaux, des ruptures de protocole de mesure, des discordances de saisie et des anomalies structurelles. Si ces perturbations ne sont pas circonscrites et purg\u00e9es avec m\u00e9thode, les mod\u00e8les pr\u00e9dictifs et descriptifs subs\u00e9quents se trouveront irr\u00e9m\u00e9diablement biais\u00e9s, illustrant l&rsquo;adage classique selon lequel la qualit\u00e9 des extrapolations est strictement born\u00e9e par la qualit\u00e9 des intrants.<\/p>\n<p>Au sein du <a rel=\"noopener noreferrer\" href=\"https:\/\/r4ds.hadley.nz\/\">tidyverse<\/a>, con\u00e7u sous l&rsquo;impulsion de Hadley Wickham, la manipulation des donn\u00e9es s&rsquo;ancre dans la philosophie de la programmation fonctionnelle. Contrairement aux approches imp\u00e9ratives qui modifient les objets en place par r\u00e9affectation destructive, l&rsquo;approche fonctionnelle pr\u00e9conise l&rsquo;usage de transformations pures o\u00f9 chaque fonction prend une structure immuable en entr\u00e9e et renvoie une nouvelle structure sans alt\u00e9rer l&rsquo;\u00e9tat initial du syst\u00e8me. Dans ce cadre \u00e9pist\u00e9mologique, la manipulation se d\u00e9compose selon deux dimensions orthogonales : la s\u00e9lection des variables, qui op\u00e8re dans l&rsquo;espace des attributs ou colonnes via le verbe <code>select()<\/code>, et le sous-ensemble d&rsquo;observations, qui d\u00e9coupe l&rsquo;espace des individus statistiques ou lignes. Cette distinction th\u00e9orique s&rsquo;av\u00e8re capitale. Alors que l&rsquo;omission d&rsquo;une variable restreint le champ dimensionnel de l&rsquo;analyse, l&rsquo;\u00e9viction d&rsquo;une ligne alt\u00e8re la taille d&rsquo;\u00e9chantillon effective (<span class=\"arabpsy-math-inline\" data-latex=\"N\">$N$<\/span>), ce qui modifie instantan\u00e9ment les degr\u00e9s de libert\u00e9 disponibles pour l&rsquo;estimation de la variance r\u00e9siduelle.<\/p>\n<p>D\u00e8s lors, chaque d\u00e9cision de suppression d&rsquo;observations entra\u00eene un impact direct et mesurable sur la puissance statistique des tests d&rsquo;hypoth\u00e8ses. Retirer trop lib\u00e9ralement des lignes sous pr\u00e9texte qu&rsquo;elles constituent des observations atypiques ou atypiquement dispers\u00e9es augmente m\u00e9caniquement l&rsquo;erreur standard des estimateurs et majore le risque de commettre une erreur de type II (non-rejet \u00e0 tort de l&rsquo;hypoth\u00e8se nulle). Inversement, faire preuve d&rsquo;un laxisme m\u00e9thodologique en conservant des observations intrins\u00e8quement corrompues viole les hypoth\u00e8ses distributionnelles classiques (normalit\u00e9 des r\u00e9sidus, homosc\u00e9dasticit\u00e9) et gonfle artificiellement le taux d&rsquo;erreur de type I. Le filtrage des lignes ne saurait donc \u00eatre r\u00e9duit \u00e0 une commodit\u00e9 de codage : c&rsquo;est un acte de mod\u00e9lisation \u00e0 part enti\u00e8re qui r\u00e9clame une compr\u00e9hension exhaustive des op\u00e9rateurs mobilis\u00e9s.<\/p>\n<h3>1.2 Pr\u00e9sentation des m\u00e9canismes conceptuels du verbe filter()<\/h3>\n<p>Le verbe <code>filter()<\/code> constitue le pivot central autour duquel s&rsquo;articule la s\u00e9lection des sous-ensembles d&rsquo;observations dans l&rsquo;environnement <strong>dplyr<\/strong>. Son m\u00e9canisme repose sur l&rsquo;\u00e9valuation vectoris\u00e9e d&rsquo;expressions bool\u00e9ennes appliqu\u00e9es \u00e0 chaque enregistrement de la table de donn\u00e9es. D&rsquo;un point de vue conceptuel, <code>filter()<\/code> inspecte ligne par ligne les valeurs prises par une ou plusieurs variables sp\u00e9cifi\u00e9es dans l&rsquo;argumentaire, r\u00e9sout les propositions logiques sous-jacentes et n&rsquo;autorise le passage dans le tableau r\u00e9sultant qu&rsquo;aux observations pour lesquelles l&rsquo;\u00e9valuation produit rigoureusement la valeur logique <code>TRUE<\/code>. Les enregistrements renvoyant <code>FALSE<\/code> sont imm\u00e9diatement \u00e9limin\u00e9s, de m\u00eame que ceux dont l&rsquo;\u00e9valuation logique d\u00e9bouche sur une ind\u00e9termination (<code>NA<\/code>), ce dernier point constituant une sp\u00e9cificit\u00e9 d\u00e9terminante de l&rsquo;ing\u00e9nierie interne du paquet.<\/p>\n<p>Une distinction fondamentale r\u00e9side dans l&rsquo;\u00e9cart s\u00e9mantique qui s\u00e9pare la conservation explicite de l&rsquo;exclusion par n\u00e9gation. Dans la pratique computationnelle, un utilisateur peut choisir d&rsquo;exprimer ce qu&rsquo;il souhaite garder (par exemple, retenir les individus dont l&rsquo;\u00e2ge d\u00e9passe 18 ans) ou, \u00e0 l&rsquo;inverse, formuler ce qu&rsquo;il entend rejeter en mobilisant l&rsquo;op\u00e9rateur de n\u00e9gation logique (<code>!<\/code>). Bien que ces deux approches paraissent logiquement sym\u00e9triques en vertu des lois de De Morgan dans une logique bivalente standard, elles ne sont pas \u00e9quivalentes en pr\u00e9sence d&rsquo;incertitude informationnelle. Exclure formellement une modalit\u00e9 par <code>variable != \"Modalit\u00e9\"<\/code> induit un comportement singulier face aux donn\u00e9es manquantes, ces derni\u00e8res se trouvant \u00e9cart\u00e9es par construction, ce qui peut surprendre l&rsquo;analyste inattentif. Comprendre le verbe <code>filter()<\/code> requiert ainsi d&rsquo;appr\u00e9hender la m\u00e9canique exacte avec laquelle le moteur traite la valeur de v\u00e9rit\u00e9 de chaque assertion.<\/p>\n<p>Sous le capot, <strong>dplyr<\/strong> ne s&rsquo;en remet pas \u00e0 de simples boucles s\u00e9quentielles interpr\u00e9t\u00e9es dans l&rsquo;interpr\u00e9teur R natif, ce qui p\u00e9naliserait dramatiquement le temps d&rsquo;ex\u00e9cution sur de grands volumes de donn\u00e9es. Le paquet s&rsquo;appuie sur une infrastructure hybride hautement optimis\u00e9e, tirant parti de routines compil\u00e9es en C++ via le m\u00e9tapaquet <a rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/tidyverse\/dplyr\">cpp11<\/a>. Lorsqu&rsquo;une instruction de filtrage est soumise, l&rsquo;expression symbolique non \u00e9valu\u00e9e (mobilisant l&rsquo;\u00e9valuation non standard ou <em>tidy evaluation<\/em> assur\u00e9e par <strong>rlang<\/strong>) est inspect\u00e9e, traduite en un vecteur logique natif compil\u00e9, puis appliqu\u00e9e directement aux colonnes sous forme de vecteurs de bas niveau. Ce d\u00e9couplage entre l&rsquo;expressivit\u00e9 syntaxique de haut niveau et l&rsquo;efficacit\u00e9 d&rsquo;ex\u00e9cution de bas niveau conf\u00e8re \u00e0 <code>filter()<\/code> une rapidit\u00e9 d&rsquo;ex\u00e9cution proche des limites th\u00e9oriques du mat\u00e9riel, tout en pr\u00e9servant une lisibilit\u00e9 cognitive maximale.<\/p>\n<h3>1.3 Pr\u00e9sentation du cadre m\u00e9thodologique et reproductibilit\u00e9<\/h3>\n<p>L&rsquo;assainissement d&rsquo;un jeu de donn\u00e9es ne saurait s&rsquo;affranchir d&rsquo;un imp\u00e9ratif d&rsquo;auditabilit\u00e9 absolue. Dans le contexte de la crise de la reproductibilit\u00e9 qui traverse les sciences empiriques, l&rsquo;alt\u00e9ration manuelle de donn\u00e9es sources via des tableurs conventionnels constitue une faute m\u00e9thodologique critique. Lorsqu&rsquo;un op\u00e9rateur proc\u00e8de \u00e0 la suppression manuelle de lignes en cliquant sur des cellules ou en coupant des plages de valeurs dans une interface graphique non journalis\u00e9e, il d\u00e9truit irr\u00e9m\u00e9diablement l&rsquo;historique de ses transformations. Aucun observateur ext\u00e9rieur, ni m\u00eame l&rsquo;exp\u00e9rimentateur initial quelques mois plus tard, ne poss\u00e8de alors les moyens de reconstituer la trajectoire qui a men\u00e9 du relev\u00e9 d&rsquo;observation brut au tableau d&rsquo;analyse \u00e9pur\u00e9. Une telle opacit\u00e9 disqualifie d&#8217;embl\u00e9e la pr\u00e9tention scientifique de l&rsquo;\u00e9tude.<\/p>\n<p>\u00c0 l&rsquo;oppos\u00e9 de ces pratiques opaques, l&rsquo;usage de scripts R programmatiques et document\u00e9s dans le cadre d&rsquo;un flux de travail formalis\u00e9 garantit la tra\u00e7abilit\u00e9 compl\u00e8te de l&rsquo;\u00e9lagage des donn\u00e9es. Chaque ligne de commande devient un acte d&rsquo;exclusion consign\u00e9, dont les motivations peuvent \u00eatre adoss\u00e9es \u00e0 des commentaires explicatifs, des assertions logiques formelles ou des seuils statistiques justifi\u00e9s th\u00e9oriquement. Le script constitue alors le protocole d&rsquo;extraction ex\u00e9cutable, garantissant que n&rsquo;importe quel analyste disposant du jeu de donn\u00e9es brut original et de l&rsquo;environnement logiciel ad\u00e9quat parviendra exactement au m\u00eame r\u00e9sultat final, au bit pr\u00e8s. Cette tra\u00e7abilit\u00e9 favorise l&rsquo;examen par les pairs et autorise une r\u00e9\u00e9valuation continue des crit\u00e8res d&rsquo;exclusion retenus au fur et \u00e0 mesure que la mod\u00e9lisation progresse.<\/p>\n<p>Ce principe m\u00e9thodologique repose sur une r\u00e8gle absolue : la sacralisation des donn\u00e9es sources brutes. Les donn\u00e9es collect\u00e9es sur le terrain, export\u00e9es depuis des bases de donn\u00e9es de production ou captur\u00e9es par des instruments de mesure doivent \u00eatre trait\u00e9es comme des archives en lecture seule strictement immuables. L&rsquo;int\u00e9gralit\u00e9 du nettoyage, incluant l&rsquo;\u00e9limination des doublons, la purge des valeurs aberrantes et l&rsquo;exclusion des non-r\u00e9ponses, doit s&rsquo;ex\u00e9cuter en m\u00e9moire vive ou s&rsquo;exporter vers de nouveaux r\u00e9pertoires de travail clairement \u00e9tiquet\u00e9s comme d\u00e9riv\u00e9s. En adoptant les fonctions de transformation non destructives de <strong>dplyr<\/strong>, le statisticien s&rsquo;assure qu&rsquo;aucune instruction n&rsquo;\u00e9crase le fichier source, garantissant ainsi un retour permanent possible vers l&rsquo;\u00e9tat originel des observations pour fin de validation ou de recalibrage du protocole.<\/p>\n<h2>2. Configuration de l&rsquo;environnement de travail et jeu de donn\u00e9es mod\u00e8le<\/h2>\n<h3>2.1 Installation et chargement des biblioth\u00e8ques n\u00e9cessaires<\/h3>\n<p>Pour mettre en \u0153uvre les techniques d&rsquo;\u00e9puration tabulaire avec toute la rigueur requise, l&rsquo;installation pr\u00e9alable des biblioth\u00e8ques logicielles idoines constitue le premier jalon technique. Le composant central, <strong>dplyr<\/strong>, peut \u00eatre install\u00e9 individuellement depuis le Comprehensive R Archive Network (<a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/\">CRAN<\/a>) ou ing\u00e9r\u00e9 au sein du collectif plus vaste constitu\u00e9 par le m\u00e9ta-paquet <strong>tidyverse<\/strong>, lequel agr\u00e8ge harmonieusement les modules d\u00e9di\u00e9s \u00e0 l&rsquo;importation, \u00e0 la manipulation, au remodelage et \u00e0 la visualisation de donn\u00e9es. Il est vivement conseill\u00e9 de privil\u00e9gier cette seconde option afin de s&rsquo;assurer d&rsquo;une parfaite coh\u00e9rence de version entre les extensions interd\u00e9pendantes.<\/p>\n<p>L&rsquo;installation s&rsquo;op\u00e8re canoniquement par l&rsquo;instruction <code>install.packages(\"tidyverse\")<\/code> dans la console R. Une fois cette \u00e9tape accomplie, le chargement en session active est assur\u00e9 par l&rsquo;appel <code>library(tidyverse)<\/code> ou, de fa\u00e7on plus cibl\u00e9e, <code>library(dplyr)<\/code>. D\u00e8s cette invocation, l&rsquo;environnement R met en garde l&rsquo;utilisateur quant \u00e0 l&rsquo;apparition de conflits dans l&rsquo;espace de noms (<em>namespace masking<\/em>). En particulier, la fonction <code>filter()<\/code> de base R, issue du paquet <code>stats<\/code>, se trouve masqu\u00e9e par le verbe <code>filter()<\/code> introduit par <strong>dplyr<\/strong>. Cette collision lexicale peut engendrer des dysfonctionnements majeurs : si une fonction tierce attendait le comportement de filtrage temporel de <code>stats::filter()<\/code>, l&rsquo;application par inadvertance du verbe de sous-ensemble de <strong>dplyr<\/strong> d\u00e9clenchera une erreur fatale ou renverra un objet corrompu.<\/p>\n<p>Pour immuniser les scripts d&rsquo;analyse contre ce type de d\u00e9faillance silencieuse, l&rsquo;adoption de pratiques d\u00e9fensives de codage est requise. Lorsque l&rsquo;ambigu\u00eft\u00e9 est susceptible d&rsquo;\u00e9merger, notamment au sein de fonctions r\u00e9utilisables ou de paquets autonomes, il est imp\u00e9ratif de pr\u00e9fixer formellement les appels de fonctions par le nom de leur espace de noms au moyen de l&rsquo;op\u00e9rateur double deux-points, par exemple <code>dplyr::filter()<\/code>. Par ailleurs, la consignation explicite de la version d&rsquo;ex\u00e9cution via les fonctions <code>sessionInfo()<\/code> ou l&rsquo;int\u00e9gration d&rsquo;un gestionnaire d&rsquo;environnement d&rsquo;isolation logicielle tel que <code>renv<\/code> garantit la reproductibilit\u00e9 p\u00e9renne du code au fil des \u00e9volutions incr\u00e9mentales du langage R et des biblioth\u00e8ques associ\u00e9es.<\/p>\n<h3>2.2 Construction du jeu de donn\u00e9es synth\u00e9tique pour les d\u00e9monstrations<\/h3>\n<p>Afin de concr\u00e9tiser les manipulations et d&rsquo;offrir un terrain exp\u00e9rimental ma\u00eetris\u00e9, nous construisons une table de donn\u00e9es synth\u00e9tique contenant les pathologies empiriques les plus fr\u00e9quemment rencontr\u00e9es dans les jeux de donn\u00e9es r\u00e9els. Ce tableau matriciel de type <code>tibble<\/code> ou <code>data.frame<\/code> rassemble des variables h\u00e9t\u00e9rog\u00e8nes : des identifiants d&rsquo;\u00e9quipes sous forme de cha\u00eenes de caract\u00e8res, des scores quantitatifs continus ou discrets (points et passes d\u00e9cisives), ainsi que des indicateurs de statut de performance. Cette h\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9 structurelle permettra de tester la sensibilit\u00e9 des algorithmes d&rsquo;exclusion face \u00e0 des typologies de donn\u00e9es distinctes.<\/p>\n<p>L&rsquo;int\u00e9r\u00eat didactique de ce corpus d&rsquo;essai r\u00e9side dans l&rsquo;injection d\u00e9lib\u00e9r\u00e9e de plusieurs anomalies contr\u00f4l\u00e9es. Nous int\u00e9grons tout d&rsquo;abord des valeurs manquantes structurelles (repr\u00e9sent\u00e9es par la constante <code>NA<\/code>) r\u00e9parties asym\u00e9triquement : certaines lignes comporteront une lacune sur la variable <code>points<\/code>, d&rsquo;autres sur la variable <code>assists<\/code>, tandis que certaines pr\u00e9senteront une incompl\u00e9tude simultan\u00e9e sur les deux m\u00e9triques. Parall\u00e8lement, nous injectons sciemment des doublons parfaits \u2014 des r\u00e9plications exactes de tuples d&rsquo;observations sur l&rsquo;ensemble des colonnes \u2014 ainsi que des redondances partielles, o\u00f9 seul un sous-ensemble d&rsquo;attributs se trouve dupliqu\u00e9. Enfin, un spectre de valeurs quantitatives positives, nulles et n\u00e9gatives ainsi que des cha\u00eenes textuelles comportant des pr\u00e9fixes particuliers viendront compl\u00e9ter l&rsquo;\u00e9chantillon.<\/p>\n<p>L&rsquo;observation pr\u00e9alable de cet objet se concr\u00e9tise imm\u00e9diatement par l&rsquo;invocation de commandes d&rsquo;inspection structurelle telles que <code>str(df)<\/code> ou <code>glimpse(df)<\/code>. L&rsquo;affichage r\u00e9v\u00e8le une table comportant initialement une dizaine d&rsquo;enregistrements organis\u00e9s selon trois ou quatre variables fondamentales. En visualisant ce micro-\u00e9cosyst\u00e8me avant toute intervention, l&rsquo;analyste se dote d&rsquo;un point de r\u00e9f\u00e9rence stable permettant de v\u00e9rifier point par point l&rsquo;impact soustractif des fonctions appliqu\u00e9es, garantissant ainsi que chaque suppression de ligne est rigoureusement conforme aux attentes conceptuelles formul\u00e9es dans nos hypoth\u00e8ses d&rsquo;assainissement.<\/p>\n<h3>2.3 Compr\u00e9hension de l&rsquo;op\u00e9rateur de redirection (pipe)<\/h3>\n<p>L&rsquo;\u00e9l\u00e9gance architecturale et la fluidit\u00e9 cognitive des traitements r\u00e9alis\u00e9s sous <strong>dplyr<\/strong> reposent en grande partie sur l&rsquo;utilisation de l&rsquo;op\u00e9rateur de redirection, universellement d\u00e9sign\u00e9 sous le vocable anglais de <em>pipe<\/em>. Historiquement introduit dans l&rsquo;univers R par Stefan Milton Bache et Stefan Frache via le paquet <a rel=\"noopener noreferrer\" href=\"https:\/\/magrittr.tidyverse.org\/\">magrittr<\/a> sous la forme <code>%>%<\/code>, cet op\u00e9rateur arithm\u00e9tique a profond\u00e9ment red\u00e9fini l&rsquo;\u00e9criture du code statistique en favorisant une programmation d\u00e9clarative et s\u00e9quentielle. Son r\u00f4le m\u00e9canique est simple mais fondamental : il intercepte l&rsquo;objet r\u00e9sultant de l&rsquo;expression situ\u00e9e \u00e0 sa gauche pour l&rsquo;injecter imm\u00e9diatement comme premier argument positionnel de la fonction situ\u00e9e \u00e0 sa droite.<\/p>\n<p>Depuis la publication de la version 4.1.0 du noyau de base de R en mai 2021, le langage s&rsquo;est dot\u00e9 d&rsquo;un op\u00e9rateur de canalisation natif formalis\u00e9 par la s\u00e9quence de caract\u00e8res <code>|><\/code>. Cette adjonction au moteur de base pr\u00e9sente des avantages computationnels notables : elle dispense de d\u00e9pendances logicielles externes, s&rsquo;ex\u00e9cute directement au niveau de la syntaxe de l&rsquo;interpr\u00e9teur abstrait et minimise la surcharge (<em>overhead<\/em>) sur la pile d&rsquo;appels r\u00e9cursifs de fonctions. Bien que l&rsquo;op\u00e9rateur traditionnel de magrittr demeure omnipr\u00e9sent dans les d\u00e9p\u00f4ts historiques et conserve des options sp\u00e9cifiques de placement via le marqueur point (<code>.<\/code>), le pipe natif constitue d\u00e9sormais la recommandation stylistique privil\u00e9gi\u00e9e pour les projets contemporains ne n\u00e9cessitant pas de liaisons d&rsquo;arguments complexes hors de la premi\u00e8re position.<\/p>\n<p>Les gains cognitifs induits par cette \u00e9criture sont consid\u00e9rables pour l&rsquo;analyste. En lieu et place d&rsquo;imbrications illisibles de fonctions o\u00f9 la s\u00e9quence chronologique des op\u00e9rations est invers\u00e9e de l&rsquo;int\u00e9rieur vers l&rsquo;ext\u00e9rieur (ex. <code>filter(na.omit(mutate(...)))<\/code>) ou de cr\u00e9ations successives de structures interm\u00e9diaires \u00e9ph\u00e9m\u00e8res polluant l&rsquo;espace de travail (<code>df1<\/code>, <code>df2<\/code>, <code>df3<\/code>), le flux analytique se lit de gauche \u00e0 droite et de haut en bas, \u00e9pousant le cheminement naturel de la pens\u00e9e humaine. Chaque \u00e9tape d&rsquo;\u00e9viction de lignes s&rsquo;ins\u00e8re harmonieusement dans cette cha\u00eene lin\u00e9aire, transformant le script de nettoyage en un r\u00e9cit ordonn\u00e9 d&rsquo;op\u00e9rations \u00e9l\u00e9mentaires et auto-document\u00e9es.<\/p>\n<h2>3. Suppression universelle des valeurs manquantes avec na.omit()<\/h2>\n<h3>3.1 Fonctionnement et syntaxe de l&rsquo;exclusion globale des NA<\/h3>\n<p>L&rsquo;apparition de valeurs manquantes constitue l&rsquo;une des probl\u00e9matiques les plus ubiquitaires de l&rsquo;ing\u00e9nierie des donn\u00e9es empiriques. Dans le vocabulaire statistique de R, ces absences informationnelles sont d\u00e9sign\u00e9es par l&rsquo;entit\u00e9 atomique <code>NA<\/code> (<em>Not Available<\/em>), qui pr\u00e9serve le typage de la colonne sous-jacente tout en signalant l&rsquo;ind\u00e9termination de la mesure. Face \u00e0 un tableau parsem\u00e9 de telles absences, la strat\u00e9gie la plus exp\u00e9ditive consiste \u00e0 pratiquer une exclusion globale de tout individu ne poss\u00e9dant pas un profil complet. \u00c0 cette fin, la fonction primitive <code>na.omit()<\/code> issue de la biblioth\u00e8que <code>stats<\/code> s&rsquo;int\u00e8gre avec une fluidit\u00e9 remarquable au sein des pipelines <strong>dplyr<\/strong>.<\/p>\n<p>D&rsquo;un point de vue syntaxique, l&rsquo;int\u00e9gration prend la forme lin\u00e9aire <code>df %>% na.omit()<\/code> ou, dans le formalisme natif, <code>df |> na.omit()<\/code>. Le m\u00e9canisme ex\u00e9cutif sous-jacent parcourt la structure rectangulaire ligne par ligne. D\u00e8s lors qu&rsquo;une observation pr\u00e9sente ne serait-ce qu&rsquo;une seule composante ind\u00e9termin\u00e9e, ind\u00e9pendamment du fait que cette omission touche une variable pr\u00e9dictive centrale ou un attribut secondaire superflu, la ligne dans son int\u00e9gralit\u00e9 est instantan\u00e9ment bannie de l&rsquo;\u00e9chantillon sortant. Il convient de souligner l&rsquo;\u00e9quivalence fonctionnelle quasi parfaite entre cette instruction historique et la commande moderne <code>drop_na()<\/code> fournie par l&rsquo;extension <strong>tidyr<\/strong> lorsqu&rsquo;elle est ex\u00e9cut\u00e9e sans renseigner d&rsquo;attribut sp\u00e9cifique : dans les deux cas, le traitement applique le principe de cas complet (<em>complete case analysis<\/em>).<\/p>\n<p>Toutefois, sous cette apparente simplicit\u00e9 syntaxique r\u00e9side une asym\u00e9trie de traitement des objets structur\u00e9s. Tandis que <code>drop_na()<\/code> pr\u00e9serve scrupuleusement la classe native <code>tbl_df<\/code> sans surcharger l&rsquo;objet de m\u00e9tadonn\u00e9es accessoires, <code>na.omit()<\/code> convertit l&rsquo;objet selon les r\u00e8gles historiques de S3 en lui adjoignant un attribut particulier d\u00e9sign\u00e9 sous l&rsquo;\u00e9tiquette <code>na.action<\/code>. Cet attribut contient l&rsquo;\u00e9num\u00e9ration des indices scalaires des lignes \u00e9limin\u00e9es, typ\u00e9 sous la classe <code>omit<\/code>. Bien que cette trace m\u00e9moire puisse s&rsquo;av\u00e9rer utile pour auditer les omissions ult\u00e9rieures, elle peut induire des comportements inattendus lors de recombinaisons matricielles ou d&rsquo;op\u00e9rations d&rsquo;exportation vers des formats stricts.<\/p>\n<h3>3.2 Exemple pratique d&rsquo;application sur le tableau de donn\u00e9es<\/h3>\n<p>Consid\u00e9rons l&rsquo;application concr\u00e8te de cette m\u00e9thode sur notre jeu de donn\u00e9es exp\u00e9rimental. La structure initiale, avant toute \u00e9puration, se caract\u00e9rise par une dimension matricielle de huit lignes et trois colonnes. Deux de ces observations comportent une valeur <code>NA<\/code> localis\u00e9e au sein de la colonne des points, tandis qu&rsquo;une troisi\u00e8me pr\u00e9sente une omission positionn\u00e9e sur la variable mesurant les passes d\u00e9cisives. Une observation additionnelle cumule une double absence sur l&rsquo;ensemble des indicateurs num\u00e9riques. Lorsque le flux de traitement d\u00e9clenche l&rsquo;appel <code>donnees_epurees <- df %>% na.omit()<\/code>, la transformation s&rsquo;op\u00e8re instantan\u00e9ment \u00e0 travers la pile d&rsquo;ex\u00e9cution.<\/p>\n<p>L&rsquo;inspection des dimensions du tenseur de donn\u00e9es cons\u00e9cutivement \u00e0 cette purge met en \u00e9vidence un r\u00e9tr\u00e9cissement substantiel du champ d&rsquo;\u00e9tude : seules les lignes poss\u00e9dant une r\u00e9ponse valide sur l&rsquo;int\u00e9gralit\u00e9 de leurs dimensions attributaires subsistent dans <code>donnees_epurees<\/code>. Le d\u00e9nombrement r\u00e9sultant par <code>nrow(donnees_epurees)<\/code> indique une contraction s\u00e9v\u00e8re, l&rsquo;objet ne conservant plus que quatre unit\u00e9s statistiques compl\u00e8tes. Toutes les lignes affichant au moins un point d&rsquo;incompl\u00e9tude ont \u00e9t\u00e9 int\u00e9gralement dissoutes, sans \u00e9g\u00e9gard pour la richesse informationnelle que ces unit\u00e9s auraient pu continuer d&rsquo;offrir sur leurs autres attributs valides.<\/p>\n<p>Une analyse approfondie de l&rsquo;objet produit permet d&rsquo;explorer les attributs internes via l&rsquo;instruction <code>attr(donnees_epurees, \"na.action\")<\/code>. L&rsquo;analyste observe alors un vecteur d&rsquo;entiers pointant pr\u00e9cis\u00e9ment vers les lignes originales qui ont \u00e9t\u00e9 neutralis\u00e9es lors de la travers\u00e9e de la fonction. Cette persistance technique illustre la tension permanente entre la puret\u00e9 fonctionnelle souhait\u00e9e dans l&rsquo;approche du tidyverse \u2014 o\u00f9 les donn\u00e9es doivent id\u00e9alement demeurer libres de toute m\u00e9tadonn\u00e9e cach\u00e9e entravant la composabilit\u00e9 \u2014 et les imp\u00e9ratifs des algorithmes d&rsquo;estimation matricielle traditionnels de R qui s&rsquo;appuient sur ces attributs pour reconstituer les tableaux d&rsquo;ajustement r\u00e9siduel.<\/p>\n<h3>3.3 Limites m\u00e9thodologiques de l&rsquo;analyse des cas complets<\/h3>\n<p>Si la simplicit\u00e9 technique de l&rsquo;exclusion globale via <code>na.omit()<\/code> pr\u00e9sente un attrait ergonomique ind\u00e9niable, ses implications \u00e9pist\u00e9mologiques et statistiques s&rsquo;av\u00e8rent redoutables. En \u00e9pid\u00e9miologie, en sociologie quantitative et en \u00e9conom\u00e9trie appliqu\u00e9e, l&rsquo;analyse restreinte aux seuls cas complets ne peut \u00eatre th\u00e9oriquement justifi\u00e9e que sous l&rsquo;hypoth\u00e8se excessivement restrictive d&rsquo;une absence compl\u00e8te de corr\u00e9lation entre le m\u00e9canisme causant la lacune et les valeurs des variables elles-m\u00eames. Selon la typologie canonique formul\u00e9e par Donald Rubin, les donn\u00e9es doivent \u00eatre manquantes de fa\u00e7on totalement al\u00e9atoire (<em>Missing Completely at Random<\/em>, ou MCAR).<\/p>\n<p>Or, dans la quasi-totalit\u00e9 des configurations r\u00e9elles d&rsquo;observation, les donn\u00e9es rel\u00e8vent d&rsquo;un m\u00e9canisme manquant de fa\u00e7on al\u00e9atoire (MAR) conditionnellement \u00e0 d&rsquo;autres covariables, voire d&rsquo;un m\u00e9canisme non al\u00e9atoire (MNAR) o\u00f9 la probabilit\u00e9 qu&rsquo;une valeur soit manquante d\u00e9pend directement de la valeur non observ\u00e9e elle-m\u00eame (par exemple, les individus b\u00e9n\u00e9ficiant de revenus extr\u00eamement \u00e9lev\u00e9s ou tr\u00e8s faibles refusant syst\u00e9matiquement de d\u00e9voiler leur r\u00e9mun\u00e9ration). L&rsquo;omission m\u00e9canique de toute ligne incompl\u00e8te au sein de ces sch\u00e9mas engendre un biais d&rsquo;attrition syst\u00e9matique et irr\u00e9versible, faussant les estimations de moyennes, \u00e9crasant les covariances et projetant un tableau d\u00e9form\u00e9 de la population cible sous-jacente.<\/p>\n<p>\u00c0 ce pr\u00e9judice d&rsquo;exactitude s&rsquo;ajoute l&rsquo;effondrement m\u00e9canique de la taille de l&rsquo;\u00e9chantillon effectif. Dans les bases de donn\u00e9es multidimensionnelles contemporaines comprenant plusieurs centaines de variables, la probabilit\u00e9 cumul\u00e9e qu&rsquo;une observation pr\u00e9sente au moins une valeur ind\u00e9termin\u00e9e cro\u00eet de fa\u00e7on exponentielle avec le nombre de dimensions. Appliquer aveugl\u00e9ment <code>na.omit()<\/code> conduit fr\u00e9quemment \u00e0 \u00e9liminer plus de quatre-vingts pour cent des individus r\u00e9pertori\u00e9s, an\u00e9antissant la puissance des tests inf\u00e9rentiels. Face \u00e0 ce p\u00e9ril, le recours aux techniques modernes d&rsquo;imputation multiple par \u00e9quations cha\u00een\u00e9es (MICE) ou \u00e0 des algorithmes d&rsquo;apprentissage acceptant structurellement les valeurs manquantes s&rsquo;impose comme une alternative m\u00e9thodologique infiniment sup\u00e9rieure \u00e0 l&rsquo;amputation aveugle du corpus.<\/p>\n<h2>4. \u00c9limination cibl\u00e9e des valeurs manquantes par colonne sp\u00e9cifique<\/h2>\n<h3>4.1 Combinaison logique des pr\u00e9dicats !is.na() et filter()<\/h3>\n<p>Pour parer \u00e0 la destruction massive d&rsquo;informations induite par l&rsquo;analyse syst\u00e9matique des cas complets, la m\u00e9thode recommand\u00e9e consiste \u00e0 appliquer une politique d&rsquo;exclusion s\u00e9lective, restreinte exclusivement aux variables indispensables \u00e0 l&rsquo;hypoth\u00e8se de travail imm\u00e9diate. Au sein de <strong>dplyr<\/strong>, ce ciblage chirurgical se mat\u00e9rialise par l&rsquo;articulation du verbe <code>filter()<\/code> avec le pr\u00e9dicat vectoris\u00e9 universel <code>is.na()<\/code>, conjugu\u00e9 \u00e0 l&rsquo;op\u00e9rateur de n\u00e9gation unaire <code>!<\/code>. Cette construction synth\u00e9tique permet d&rsquo;isoler l&rsquo;impact du filtrage \u00e0 une dimension unique de l&rsquo;espace des donn\u00e9es.<\/p>\n<p>Le fonctionnement interne de cette formulation requiert une d\u00e9composition rigoureuse. La fonction <code>is.na(x)<\/code> analyse un vecteur de donn\u00e9es de taille <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span> et convertit chaque \u00e9l\u00e9ment scalaire en une valeur bool\u00e9enne : elle renvoie <code>TRUE<\/code> si l&rsquo;\u00e9l\u00e9ment consid\u00e9r\u00e9 est ind\u00e9termin\u00e9, et <code>FALSE<\/code> dans le cas contraire. Plac\u00e9e seule au sein de <code>filter()<\/code>, cette expression conserverait pr\u00e9cis\u00e9ment les anomalies que l&rsquo;on cherche \u00e0 bannir. C&rsquo;est ici qu&rsquo;intervient l&rsquo;op\u00e9rateur de n\u00e9gation logique point d&rsquo;exclamation, qui inverse instantan\u00e9ment le tenseur logique sous-jacent : chaque <code>TRUE<\/code> devient <code>FALSE<\/code>, et chaque <code>FALSE<\/code> se mue en <code>TRUE<\/code>. Le verbe <code>filter()<\/code>, n&rsquo;autorisant la persistance que des observations valid\u00e9es \u00e0 <code>TRUE<\/code>, \u00e9limine rigoureusement les lignes o\u00f9 la variable cible contenait une absence.<\/p>\n<p>La syntaxe canonique s&rsquo;exprime donc sous la forme \u00e9pur\u00e9e : <code>df %>% filter(!is.na(nom_de_colonne))<\/code>. L&rsquo;immense sup\u00e9riorit\u00e9 \u00e9pist\u00e9mique de ce canevas r\u00e9side dans sa neutralit\u00e9 \u00e0 l&rsquo;\u00e9gard du reste de l&rsquo;enregistrement : si une observation pr\u00e9sente des valeurs manquantes sur d&rsquo;autres m\u00e9triques non convoqu\u00e9es dans cette clause logique sp\u00e9cifique, ces derni\u00e8res ne seront nullement sacrifi\u00e9es. L&rsquo;analyste pr\u00e9serve ainsi l&rsquo;int\u00e9gralit\u00e9 du capital informationnel p\u00e9riph\u00e9rique tout en purgeant le syst\u00e8me des d\u00e9faillances localis\u00e9es sur le pr\u00e9dicteur critique en cours d&rsquo;\u00e9valuation.<\/p>\n<h3>4.2 Exemple empirique : ciblage d&rsquo;une variable critique<\/h3>\n<p>Pour appr\u00e9cier la granularit\u00e9 de ce filtrage cibl\u00e9, r\u00e9examinons notre jeu de donn\u00e9es synth\u00e9tique dans lequel des valeurs <code>NA<\/code> ont \u00e9t\u00e9 simultan\u00e9ment introduites au sein de la colonne <code>points<\/code> et de la colonne <code>assists<\/code>. Supposons une hypoth\u00e8se de recherche dont l&rsquo;objectif exclusif est de quantifier la dispersion param\u00e9trique de la marque offensive globale (mesur\u00e9e par la variable <code>points<\/code>), tandis que la m\u00e9trique de distribution de jeu (<code>assists<\/code>) demeure totalement accessoire \u00e0 ce stade de l&rsquo;investigation. L&rsquo;\u00e9limination aveugle de tous les <code>NA<\/code> par <code>na.omit()<\/code> priverait l&rsquo;analyste d&rsquo;observations dont la variable <code>points<\/code> est parfaitement document\u00e9e, au seul motif que leur variable <code>assists<\/code> est absente.<\/p>\n<p>En mobilisant la commande sp\u00e9cialis\u00e9e <code>df %>% filter(!is.na(points))<\/code>, l&rsquo;analyste applique un \u00e9lagage cibl\u00e9. Le moteur logique de <strong>dplyr<\/strong> examine la colonne <code>points<\/code> : les enregistrements pr\u00e9sentant une lacune sont expuls\u00e9s de la structure de sortie, mais les lignes conservant un score valide de points subsistent sans alt\u00e9ration, m\u00eame si leur valeur d&rsquo;assistance est marqu\u00e9e du sceau <code>NA<\/code>. L&rsquo;op\u00e9ration garantit la pr\u00e9servation maximale du sous-\u00e9chantillon d&rsquo;int\u00e9r\u00eat pour la t\u00e2che analytique consid\u00e9r\u00e9e.<\/p>\n<p>La validation empirique de cette persistance diff\u00e9rentielle s&rsquo;effectue imm\u00e9diatement en inspectant les effectifs au moyen du verbe <code>count()<\/code> ou de la primitive <code>nrow()<\/code>. On constate alors que la dimension de l&rsquo;\u00e9chantillon retenu est strictement sup\u00e9rieure \u00e0 celle observ\u00e9e lors de l&rsquo;application indiscrimin\u00e9e de <code>na.omit()<\/code>. Les observations partiellement document\u00e9es ont \u00e9t\u00e9 sauv\u00e9es de l&rsquo;\u00e9limination pr\u00e9matur\u00e9e, permettant ainsi d&rsquo;optimiser l&rsquo;efficacit\u00e9 asymptotique des calculs de moments statistiques d&rsquo;ordre un et deux (moyenne et variance empiriques) sur la variable focale <code>points<\/code>.<\/p>\n<h3>4.3 Traitement de variables multiples et alternatives tidyr<\/h3>\n<p>Lorsque la structure du protocole empirique exige de garantir la compl\u00e9tude non pas sur une seule colonne, mais sur un sous-ensemble fini de variables cardinales (par exemple, un r\u00e9sultat clinique et un facteur d&rsquo;exposition majeur), l&rsquo;expression logique peut \u00eatre \u00e9tendue au sein du verbe <code>filter()<\/code> en encha\u00eenant plusieurs pr\u00e9dicats conjonctifs. Deux syntaxes \u00e9quivalentes sont admises : la s\u00e9paration explicite par l&rsquo;op\u00e9rateur bool\u00e9en ET (<code>&<\/code>), ou l&rsquo;usage de la virgule comme s\u00e9parateur d&rsquo;arguments, selon la formulation : <code>df %>% filter(!is.na(points), !is.na(assists))<\/code>. Dans cette configuration, une observation n&rsquo;est maintenue que si elle pr\u00e9sente simultan\u00e9ment une valeur valide sur chacun des deux attributs sollicit\u00e9s.<\/p>\n<p>N\u00e9anmoins, lorsque le nombre de variables \u00e0 assainir cro\u00eet, cette \u00e9criture r\u00e9p\u00e9titive peut alourdir inutilement le script et accro\u00eetre la probabilit\u00e9 d&rsquo;erreurs typographiques. C&rsquo;est \u00e0 cette fin que l&rsquo;\u00e9cosyst\u00e8me <strong>tidyverse<\/strong> propose une alternative d\u00e9di\u00e9e au sein de la biblioth\u00e8que <strong>tidyr<\/strong> \u00e0 travers le verbe <code>drop_na()<\/code>. Cette fonction combine l&rsquo;expressivit\u00e9 de <code>filter()<\/code> et la compacit\u00e9 fonctionnelle : en \u00e9crivant <code>df %>% drop_na(points, assists)<\/code>, l&rsquo;utilisateur obtient rigoureusement le m\u00eame sous-ensemble de donn\u00e9es \u00e9pur\u00e9 sans devoir r\u00e9p\u00e9ter fastidieusement l&rsquo;op\u00e9rateur <code>!is.na()<\/code>.<\/p>\n<p>Le choix entre ces deux approches proc\u00e8de d&rsquo;un arbitrage m\u00e9thodologique et contextuel bien \u00e9tabli :<\/p>\n<ul>\n<li>L&rsquo;usage de <code>drop_na()<\/code> s&rsquo;impose par son ergonomie sup\u00e9rieure lorsqu&rsquo;il s&rsquo;agit d&rsquo;\u00e9liminer des lignes sur la seule base de la vacuit\u00e9 d&rsquo;un groupe arbitraire de variables, d&rsquo;autant que cette fonction autorise l&rsquo;usage des s\u00e9lecteurs contextuels de <strong>tidyselect<\/strong> tels que <code>drop_na(starts_with(\"score_\"))<\/code>.<\/li>\n<li>Le recours \u00e0 <code>filter(!is.na(...))<\/code> demeure irrempla\u00e7able lorsque la condition d&rsquo;\u00e9limination de la valeur manquante est structurellement articul\u00e9e avec d&rsquo;autres pr\u00e9dicats logiques alternatifs ou disjonctifs (par exemple, exclure les <code>NA<\/code> uniquement si une troisi\u00e8me variable prend une modalit\u00e9 particuli\u00e8re).<\/li>\n<\/ul>\n<h2>5. Suppression des observations dupliqu\u00e9es \u00e0 l&rsquo;aide de distinct()<\/h2>\n<h3>5.1 M\u00e9canisme de d\u00e9duplication des enregistrements<\/h3>\n<p>La pr\u00e9sence d&rsquo;enregistrements dupliqu\u00e9s au sein d&rsquo;une table d&rsquo;observation constitue une pathologie structurelle fr\u00e9quente, g\u00e9n\u00e9r\u00e9e par des dysfonctionnements lors de la concat\u00e9nation de fichiers, des boucles de collecte automatis\u00e9es redondantes ou des jointures relationnelles mal conditionn\u00e9es cr\u00e9ant des produits cart\u00e9siens involontaires. L&rsquo;impact de tels doublons sur l&rsquo;analyse statistique est direct : ils faussent la pond\u00e9ration des individus au sein de l&rsquo;\u00e9chantillon, g\u00e9n\u00e8rent une inflation artificielle de la significativit\u00e9 statistique en biaisant vers le bas l&rsquo;estimation de la variance r\u00e9siduelle, et violent de front le postulat central d&rsquo;ind\u00e9pendance et d&rsquo;identique distribution des erreurs (<span class=\"arabpsy-math-inline\" data-latex=\"i.i.d.\">$i.i.d.$<\/span>).<\/p>\n<p>Pour assainir ce type de distorsion, <strong>dplyr<\/strong> met \u00e0 la disposition du praticien le verbe <code>distinct()<\/code>. Ce verbe a \u00e9t\u00e9 con\u00e7u sp\u00e9cifiquement pour identifier les redondances observationnelles et ne conserver qu&rsquo;une seule occurrence pour chaque motif unique d\u00e9tect\u00e9. Il convient d&rsquo;op\u00e9rer une distinction s\u00e9mantique claire entre le doublon parfait et la redondance partielle. Un doublon parfait se d\u00e9finit comme une r\u00e9plication strictement conforme d&rsquo;un tuple complet d&rsquo;observations : chaque case de la ligne <span class=\"arabpsy-math-inline\" data-latex=\"i\">$i$<\/span> est rigoureusement identique \u00e0 la case homologue de la ligne <span class=\"arabpsy-math-inline\" data-latex=\"j\">$j$<\/span>, pour l&rsquo;ensemble des colonnes formant l&rsquo;espace des attributs du tableau. La redondance partielle, quant \u00e0 elle, ne concerne qu&rsquo;un sous-ensemble d\u00e9sign\u00e9 de cl\u00e9s primaires.<\/p>\n<p>Le m\u00e9canisme computationnel de <code>distinct()<\/code> repose sur le hachage rapide des lignes vectorielles. Les signatures calcul\u00e9es permettent de classer les observations dans des tables de correspondance internes en temps lin\u00e9aire ou quasi lin\u00e9aire, garantissant une d\u00e9tection des doublons bien plus v\u00e9loce que les comparaisons crois\u00e9es matricielles d&rsquo;ordre <span class=\"arabpsy-math-inline\" data-latex=\"O(N^2)\">$O(N^2)$<\/span> issues des algorithmes na\u00effs. Par d\u00e9faut, lorsqu&rsquo;aucune variable n&rsquo;est express\u00e9ment pass\u00e9e en param\u00e8tre, <code>distinct()<\/code> inspecte l&rsquo;int\u00e9gralit\u00e9 du tenseur de donn\u00e9es et op\u00e8re une d\u00e9duplication int\u00e9grale de la structure, tout en pr\u00e9servant scrupuleusement l&rsquo;ordonnancement s\u00e9quentiel originel des premi\u00e8res occurrences identifi\u00e9es.<\/p>\n<h3>5.2 Exemple pratique de d\u00e9duplication compl\u00e8te<\/h3>\n<p>Mettons \u00e0 l&rsquo;\u00e9preuve ce m\u00e9canisme sur notre jeu de donn\u00e9es exp\u00e9rimental. Au sein de ce dernier, l&rsquo;observation relative \u00e0 l&rsquo;\u00e9quipe &lsquo;C&rsquo;, associ\u00e9e \u00e0 un total de huit points et quatre passes d\u00e9cisives, a \u00e9t\u00e9 ins\u00e9r\u00e9e de fa\u00e7on r\u00e9p\u00e9t\u00e9e \u00e0 deux positions disjointes dans le tableau brut d&rsquo;origine. Cette r\u00e9plication sym\u00e9trique symbolise un incident typique de double transmission de paquets d&rsquo;informations au sein d&rsquo;un pipeline de collecte en continu. Si ce tableau est directement inject\u00e9 dans un mod\u00e8le d&rsquo;inf\u00e9rence, le groupe &lsquo;C&rsquo; p\u00e8sera d&rsquo;un poids statistique double sans aucune justification empirique valable.<\/p>\n<p>L&rsquo;application de la commande \u00e9pur\u00e9e <code>df_unique <- df %>% distinct()<\/code> d\u00e9clenche la scrutation exhaustive de la table. Chaque tuple de donn\u00e9es est compar\u00e9 \u00e0 l&rsquo;ensemble des tuples d\u00e9j\u00e0 rencontr\u00e9s. Lors du traitement de la seconde occurrence de la ligne relative \u00e0 l&rsquo;\u00e9quipe &lsquo;C&rsquo;, le processeur d\u00e9tecte une parfaite identit\u00e9 de signature avec l&rsquo;enregistrement ant\u00e9rieur. En cons\u00e9quence, cette seconde observation est instantan\u00e9ment \u00e9vinc\u00e9e du flux de sortie. L&rsquo;op\u00e9ration est totalement transparente et ne requiert aucune sp\u00e9cification alg\u00e9brique lourde de la part de l&rsquo;utilisateur.<\/p>\n<p>L&rsquo;\u00e9valuation de l&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle post-traitement atteste du r\u00e9tablissement d&rsquo;une structure saine : la table r\u00e9sultante voit son nombre de lignes r\u00e9duit exactement du montant des redondances absolues, tandis que le contenu informatif intrins\u00e8que de chaque variable demeure intact pour les occurrences uniques. On soulignera en outre que <code>distinct()<\/code> traite les valeurs <code>NA<\/code> de fa\u00e7on coh\u00e9rente avec la norme relationnelle SQL : deux lignes contenant des <code>NA<\/code> sur les m\u00eames colonnes sont consid\u00e9r\u00e9es comme \u00e9quivalentes et d\u00e9dupliqu\u00e9es en une seule occurrence, \u00e9vitant ainsi la prolif\u00e9ration de lignes d&rsquo;ind\u00e9termination identiques.<\/p>\n<h3>5.3 D\u00e9duplication s\u00e9lective bas\u00e9e sur des cl\u00e9s primaires partielles<\/h3>\n<p>Dans de nombreux contextes analytiques, les observations ne sont pas des doublons stricts sur l&rsquo;ensemble de leurs dimensions, mais partagent un identifiant commun (tel qu&rsquo;un num\u00e9ro de sujet, un identifiant de capteur ou une r\u00e9f\u00e9rence transactionnelle) alors que d&rsquo;autres variables p\u00e9riph\u00e9riques divergent sous l&rsquo;effet de bruits de mesure ou d&rsquo;horodatages h\u00e9t\u00e9rog\u00e8nes. Dans ce cas, la conservation d&rsquo;une seule observation par unit\u00e9 n\u00e9cessite de fonder la d\u00e9duplication sur un sous-ensemble d\u00e9fini d&rsquo;attributs fonctionnant comme cl\u00e9s primaires logiques.<\/p>\n<p>Le verbe <code>distinct()<\/code> autorise cette s\u00e9lection cibl\u00e9e par le passage explicite du nom des variables directrices en argument, selon la forme <code>df %>% distinct(team)<\/code>. Cependant, par construction \u00e9l\u00e9mentaire, cette commande renvoie une projection orthogonale ne contenant <em>que<\/em> la colonne mentionn\u00e9e, \u00e9ludant ainsi toutes les autres variables du tableau original. Pour contourner cette troncature dimensionnelle et pr\u00e9server l&rsquo;ensemble des colonnes associ\u00e9es \u00e0 l&rsquo;observation retenue, l&rsquo;adjonction de l&rsquo;argument bool\u00e9en <code>.keep_all = TRUE<\/code> s&rsquo;av\u00e8re indispensable : <code>df %>% distinct(team, .keep_all = TRUE)<\/code>.<\/p>\n<p>Le comportement d\u00e9cisionnel de cet algorithme ob\u00e9it \u00e0 une r\u00e8gle purement d\u00e9terministe bas\u00e9e sur l&rsquo;ordre de travers\u00e9e des donn\u00e9es :<\/p>\n<ul>\n<li>Pour chaque modalit\u00e9 unique de la cl\u00e9 primaire identifi\u00e9e, la fonction conserve invariablement la <em>toute premi\u00e8re<\/em> ligne rencontr\u00e9e dans le flux d&rsquo;entr\u00e9e.<\/li>\n<li>Toutes les occurrences ult\u00e9rieures associ\u00e9es \u00e0 cette m\u00eame cl\u00e9 sont impitoyablement supprim\u00e9es, ind\u00e9pendamment de la pertinence ou de la qualit\u00e9 relative de leurs attributs secondaires.<\/li>\n<\/ul>\n<p>Cette sp\u00e9cificit\u00e9 impose une vigilance m\u00e9thodologique extr\u00eame : si l&rsquo;analyste souhaite conserver non pas la premi\u00e8re occurrence chronologique accidentelle, mais l&rsquo;observation la plus r\u00e9cente ou celle affichant la m\u00e9trique de qualit\u00e9 la plus \u00e9lev\u00e9e, il est imp\u00e9ratif d&rsquo;intercaler une op\u00e9ration de tri explicite via le verbe <code>arrange()<\/code> pr\u00e9alablement \u00e0 l&rsquo;appel de <code>distinct()<\/code>.<\/p>\n<h2>6. Filtrage et exclusion de lignes par position d&rsquo;indexation num\u00e9rique<\/h2>\n<h3>6.1 Exploitation de la fonction utilitaire row_number()<\/h3>\n<p>Il est des sc\u00e9narios d&rsquo;ing\u00e9nierie statistique o\u00f9 l&rsquo;exclusion d&rsquo;enregistrements ne r\u00e9pond pas \u00e0 des crit\u00e8res substantiels port\u00e9s par les valeurs des variables, mais d\u00e9coule de consid\u00e9rations positionnelles strictes. C&rsquo;est le cas lors de l&rsquo;\u00e9limination de lignes d&rsquo;en-t\u00eate parasites mal interpr\u00e9t\u00e9es lors de la conversion de fichiers tabulaires d\u00e9limit\u00e9s, ou de la purge de segments temporels situ\u00e9s \u00e0 des positions calendaires fixes. Pour accomplir ces retranchements \u00e0 l&rsquo;int\u00e9rieur du paradigme d\u00e9claratif de <strong>dplyr<\/strong>, la fonction utilitaire <code>row_number()<\/code> d\u00e9ploie des capacit\u00e9s de ciblage positionnel remarquables.<\/p>\n<p>La fonction <code>row_number()<\/code> op\u00e8re sans argument au sein des verbes de transformation et g\u00e9n\u00e8re dynamiquement un vecteur d&rsquo;entiers s\u00e9quentiels (<span class=\"arabpsy-math-inline\" data-latex=\"1, 2, dots, n\">$1, 2, dots, n$<\/span>) indexant l&rsquo;ordre de disposition relatif des lignes dans la structure courante. Combin\u00e9e harmonieusement au verbe <code>filter()<\/code>, elle permet de construire des pr\u00e9dicats d&rsquo;exclusion positionnels d&rsquo;une grande rigueur formelle. Ainsi, l&rsquo;expression <code>df %>% filter(!row_number() %in% c(1, 2, 4))<\/code> soumet chaque enregistrement \u00e0 un test d&rsquo;appartenance : si l&rsquo;index courant de la ligne est intercept\u00e9 au sein du vecteur d&rsquo;entiers d\u00e9sign\u00e9s, la n\u00e9gation logique transforme l&rsquo;\u00e9valuation en <code>FALSE<\/code>, entra\u00eenant l&rsquo;exclusion imm\u00e9diate de l&rsquo;observation.<\/p>\n<p>Il est imp\u00e9ratif d&rsquo;insister sur la distinction conceptuelle majeure existant entre une indexation positionnelle absolue et une indexation contextuelle. La position d&rsquo;une ligne dans une table R n&rsquo;est jamais une propri\u00e9t\u00e9 intrins\u00e8que de l&rsquo;observation, mais un \u00e9tat \u00e9ph\u00e9m\u00e8re li\u00e9 \u00e0 la disposition physique de la m\u00e9moire \u00e0 un instant <span class=\"arabpsy-math-inline\" data-latex=\"t\">$t$<\/span>. Toute permutation, r\u00e9organisation ou filtrage ant\u00e9rieur modifie irr\u00e9m\u00e9diablement le rang num\u00e9rique des enregistrements subs\u00e9quents. Par cons\u00e9quent, l&rsquo;utilisation de <code>row_number()<\/code> pour exclure des observations doit \u00eatre mani\u00e9e avec une pr\u00e9caution rigoureuse, id\u00e9alement r\u00e9serv\u00e9e aux phases initiales d&rsquo;ingestion o\u00f9 l&rsquo;architecture du fichier brut garantit une invariance topologique des donn\u00e9es parasites.<\/p>\n<h3>6.2 Mise en \u0153uvre concr\u00e8te sur le tableau d&rsquo;exemple<\/h3>\n<p>Illustrons empiriquement la mise en \u0153uvre de cette exclusion positionnelle en ciblant des enregistrements d\u00e9sign\u00e9s de notre matrice synth\u00e9tique. Imaginons un protocole d&rsquo;assurance qualit\u00e9 ayant formellement identifi\u00e9 que les observations occupant les positions scalaires $1$, $2$ et $4$ de la base brute r\u00e9sultent d&rsquo;un \u00e9talonnage d\u00e9ficient de la cha\u00eene de saisie. L&rsquo;analyste se trouve dans l&rsquo;obligation fonctionnelle d&rsquo;expurger pr\u00e9cis\u00e9ment ces trois entit\u00e9s sans toucher aux observations adjacentes.<\/p>\n<p>En ex\u00e9cutant le pipeline d\u00e9claratif <code>df_elague <- df %>% filter(!row_number() %in% c(1, 2, 4))<\/code>, l&rsquo;action est men\u00e9e avec une pr\u00e9cision chirurgicale. Le moteur parcourt la collection s\u00e9quentielle : les rangs un et deux sont court-circuit\u00e9s et rejet\u00e9s, le rang trois franchit le sas de validation, le rang quatre est banni \u00e0 son tour, et l&rsquo;int\u00e9gralit\u00e9 des rangs subs\u00e9quents ($5$ \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span>) est valid\u00e9e. Le tableau r\u00e9sultant pr\u00e9sente une r\u00e9organisation imm\u00e9diate de ses dimensions, amput\u00e9 de ces trois corps statistiques sp\u00e9cifiques.<\/p>\n<p>D&rsquo;un point de vue comparatif, cette formulation s&rsquo;inscrit en continuit\u00e9 avec les m\u00e9canismes classiques de l&rsquo;indexation matricielle de base R, mat\u00e9rialis\u00e9s traditionnellement par l&rsquo;op\u00e9rateur de crochet n\u00e9gatif <code>df[-c(1, 2, 4), ]<\/code>. Toutefois, l&rsquo;int\u00e9gration de <code>row_number()<\/code> au sein de <code>filter()<\/code> conf\u00e8re une coh\u00e9rence stylistique inestimable au sein d&rsquo;une s\u00e9quence de transformations cha\u00een\u00e9es par le pipe, \u00e9vitant de devoir interrompre le flux conceptuel pour r\u00e9assigner des structures interm\u00e9diaires par extraction matricielle directe.<\/p>\n<h3>6.3 Utilisation de la fonction slice() et de ses variantes modernes<\/h3>\n<p>Bien que la combinaison de <code>filter()<\/code> et de <code>row_number()<\/code> soit conceptuellement irr\u00e9prochable, l&rsquo;\u00e9cosyst\u00e8me <strong>dplyr<\/strong> fournit une famille de fonctions sp\u00e9cifiquement forg\u00e9e pour l&rsquo;\u00e9chantillonnage et la soustraction par rang num\u00e9rique : la famille <code>slice()<\/code>. Cette suite de verbes sp\u00e9cialis\u00e9s simplifie drastiquement la manipulation des positions ordinales et optimise les calculs sous-jacents en s&rsquo;affranchissant de l&rsquo;\u00e9valuation symbolique g\u00e9n\u00e9rale requise par <code>filter()<\/code>.<\/p>\n<p>Pour \u00e9liminer directement des lignes selon leurs coordonn\u00e9es, la fonction <code>slice()<\/code> adopte nativement la convention des entiers n\u00e9gatifs de base R : l&rsquo;instruction <code>df %>% slice(-c(1, 2, 4))<\/code> intime l&rsquo;ordre sans \u00e9quivoque d&rsquo;omettre les observations occupant les rangs un, deux et quatre. L&rsquo;\u00e9conomie syntaxique est appr\u00e9ciable et la lisibilit\u00e9 algorithmique optimale. De surcro\u00eet, le paquet propose un ensemble de d\u00e9clinaisons s\u00e9mantiques raffin\u00e9es pour traiter les segments extr\u00eames ou al\u00e9atoires d&rsquo;une distribution :<\/p>\n<ul>\n<li><code>slice_head(n = k)<\/code> et <code>slice_tail(n = k)<\/code> : permettent d&rsquo;isoler ou, par inversion de param\u00e8tre, de tronquer les premi\u00e8res ou derni\u00e8res observations d&rsquo;une s\u00e9rie.<\/li>\n<li><code>slice_min()<\/code> et <code>slice_max()<\/code> : \u00e9liminent les lignes en fonction du classement d&rsquo;une variable num\u00e9rique donn\u00e9e, g\u00e9rant automatiquement les ex \u00e6quo (<em>ties<\/em>) de fa\u00e7on rigoureuse.<\/li>\n<li><code>slice_sample(n = k, prop = p)<\/code> : orchestre un sous-\u00e9chantillonnage al\u00e9atoire d&rsquo;observations, constituant l&rsquo;outil id\u00e9al pour extraire des cohortes de validation ou all\u00e9ger stochastiquement des tables volumineuses.<\/li>\n<\/ul>\n<p>Le tableau suivant met en lumi\u00e8re les caract\u00e9ristiques fondamentales et les divergences d&rsquo;usage associ\u00e9es aux fonctions de partitionnement positionnel :<\/p>\n<table border=\"1\" cellpadding=\"6\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%; margin-top: 15px; margin-bottom: 15px;\">\n<thead>\n<tr style=\"background-color: #f2f2f2; text-align: left;\">\n<th>Fonction<\/th>\n<th>M\u00e9canisme de suppression<\/th>\n<th>Cas d&rsquo;usage privil\u00e9gi\u00e9<\/th>\n<th>Comportement face aux regroupements<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>filter(!row_number() %in% ...)<\/code><\/td>\n<td>\u00c9valuation d&rsquo;un pr\u00e9dicat logique s\u00e9quentiel<\/td>\n<td>Conditions complexes m\u00ealant index positionnel et valeurs<\/td>\n<td>R\u00e9initialise l&rsquo;indexation s\u00e9quentielle au sein de chaque groupe<\/td>\n<\/tr>\n<tr>\n<td><code>slice(-c(...))<\/code><\/td>\n<td>Indexation directe par coordonn\u00e9es d&rsquo;entiers n\u00e9gatifs<\/td>\n<td>Suppression purement positionnelle d&rsquo;enregistrements connus<\/td>\n<td>\u00c9limine les rangs d\u00e9sign\u00e9s localement dans chaque groupe<\/td>\n<\/tr>\n<tr>\n<td><code>slice_head() \/ slice_tail()<\/code><\/td>\n<td>Troncature des bornes ordinales extr\u00eames<\/td>\n<td>Ablation de lignes de pr\u00e9ambule ou de cl\u00f4ture parasites<\/td>\n<td>Op\u00e8re ind\u00e9pendamment sur les bornes de chaque strate<\/td>\n<\/tr>\n<tr>\n<td><code>slice_min() \/ slice_max()<\/code><\/td>\n<td>Tri scalaire implicite et extraction par quantile ordinal<\/td>\n<td>\u00c9lagage des queues de distribution empirique<\/td>\n<td>S\u00e9lectionne les extrema locaux groupe par groupe<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>7. Suppression conditionnelle simple bas\u00e9e sur des pr\u00e9dicats logiques<\/h2>\n<h3>7.1 Principes des op\u00e9rateurs de comparaison arithm\u00e9tique<\/h3>\n<p>L&rsquo;\u00e9puration des donn\u00e9es empiriques requiert tr\u00e8s fr\u00e9quemment la formulation de r\u00e8gles d&rsquo;exclusion s&rsquo;appuyant sur la valeur intrins\u00e8que port\u00e9e par les variables. Au fondement de ces d\u00e9cisions se trouvent les comparateurs arithm\u00e9tiques et relationnels classiques standardis\u00e9s dans la syntaxe R : l&rsquo;\u00e9galit\u00e9 stricte (<code>==<\/code>), la non-\u00e9galit\u00e9 (<code>!=<\/code>), la stricte sup\u00e9riorit\u00e9 (<code>><\/code>), l&rsquo;inf\u00e9riorit\u00e9 stricte (<code><<\/code>), ainsi que les in\u00e9galit\u00e9s larges (<code>>=<\/code> et <code><=<\/code>). Ces op\u00e9rateurs agissent comme des fonctions vectoris\u00e9es recevant un vecteur de mesures, le confrontant \u00e0 une r\u00e9f\u00e9rence scalaire ou vectorielle, et renvoyant en sortie un vecteur de valeurs logiques conformes.<\/p>\n<p>Dans la grammaire de <strong>dplyr<\/strong>, l'exclusion d'observations ind\u00e9sirables s'obtient conceptuellement en \u00e9non\u00e7ant la condition logique de r\u00e9tention compl\u00e9mentaire. Par exemple, si le protocole exige le rejet absolu des enregistrements o\u00f9 une mesure quantitative est inf\u00e9rieure \u00e0 un seuil critique <span class=\"arabpsy-math-inline\" data-latex=\"\\theta\">$\\theta$<\/span>, l'analyste sp\u00e9cifiera au sein du verbe de s\u00e9lection l'assertion inverse stricte : <code>filter(mesure >= theta)<\/code>. Cette formulation positive de la conservation requiert une gymnastique intellectuelle constante afin de ne pas inverser par inadvertance les fronti\u00e8res de d\u00e9cision, particuli\u00e8rement lors de la gestion des in\u00e9galit\u00e9s strictes versus larges \u00e0 la fronti\u00e8re du seuil.<\/p>\n<p>Une vigilance particuli\u00e8re doit \u00eatre port\u00e9e au typage des donn\u00e9es sous-jacentes. L'\u00e9valuation de l'\u00e9galit\u00e9 via <code>==<\/code> sur des nombres en virgule flottante (type <code>double<\/code>) expose l'analyste \u00e0 des d\u00e9convenues majeures en raison de l'impr\u00e9cision inh\u00e9rente \u00e0 l'arithm\u00e9tique binaire standard (IEEE 754). Deux calculs cens\u00e9s converger vers la m\u00eame grandeur th\u00e9orique peuvent diff\u00e9rer \u00e0 la seizi\u00e8me d\u00e9cimale, rendant le test <code>x == y<\/code> faux de fa\u00e7on totalement inattendue. Pour les variables continues, les conditions d'exclusion par \u00e9galit\u00e9 exacte doivent \u00eatre formellement proscrites au profit d'in\u00e9galit\u00e9s d'encadrement ou de l'usage de la fonction d'approximation <code>near()<\/code> mise \u00e0 disposition par <strong>dplyr<\/strong>.<\/p>\n<h3>7.2 Exemple d'exclusion sur variable cat\u00e9gorielle<\/h3>\n<p>Consid\u00e9rons l'application de ces principes au retranchement d'une modalit\u00e9 sp\u00e9cifique au sein d'une variable qualitative nominale. Dans notre base de d\u00e9monstration, la colonne <code>team<\/code> enregistre l'affiliation des individus \u00e0 des sous-ensembles \u00e9tiquet\u00e9s 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\u00e9gralit\u00e9 des observations associ\u00e9es au groupe 'A'. L'analyste se propose de purger la table de toute contamination par cette strate sp\u00e9cifique.<\/p>\n<p>La transcription en syntaxe <strong>dplyr<\/strong> s'articule directement par l'application de l'in\u00e9galit\u00e9 stricte : <code>df_sans_A <- df %>% filter(team != \"A\")<\/code>. Lors de l'\u00e9valuation s\u00e9quentielle, le moteur logicomath\u00e9matique teste chaque cha\u00eene textuelle. Pour l'ensemble des tuples dont l'attribut d'\u00e9quipe \u00e9quivaut lexicalement \u00e0 \"A\", l'\u00e9galit\u00e9 renvoie <code>TRUE<\/code>, laquelle est instantan\u00e9ment invers\u00e9e par l'in\u00e9galit\u00e9 en <code>FALSE<\/code>, condamnant l'enregistrement \u00e0 l'omission. Inversement, toute modalit\u00e9 distincte ('B', 'C', etc.) valide la clause \u00e0 <code>TRUE<\/code> et franchit victorieusement le filtre.<\/p>\n<p>Le contr\u00f4le m\u00e9thodologique post-filtrage constitue une \u00e9tape non n\u00e9gociable de la d\u00e9marche qualit\u00e9. L'analyste diligent confirmera la disparition absolue de l'entit\u00e9 rejet\u00e9e en mobilisant par exemple la commande <code>df_sans_A %>% count(team)<\/code> ou <code>unique(df_sans_A$team)<\/code>. On observera alors que la distribution des modalit\u00e9s restantes est scrupuleusement pr\u00e9serv\u00e9e, sans modification de leur fr\u00e9quence absolue respective, attestant du caract\u00e8re strictement orthogonal de l'op\u00e9ration d'\u00e9viction par rapport aux donn\u00e9es conformes.<\/p>\n<h3>7.3 Exemple d'exclusion sur variable num\u00e9rique continue<\/h3>\n<p>L'\u00e9limination conditionnelle s'illustre avec une \u00e9gale acuit\u00e9 lors de la r\u00e9gulation de seuils sur des m\u00e9triques d'\u00e9chelle continues ou discr\u00e8tes. Prenons le cas d'une \u00e9tude d'efficience sportive o\u00f9 l'on d\u00e9cr\u00e8te arbitrairement qu'un score inf\u00e9rieur ou \u00e9gal \u00e0 sept unit\u00e9s sur la variable <code>points<\/code> traduit une contre-performance non exploitable pour l'\u00e9talonnage d'un mod\u00e8le d'\u00e9lite. L'objectif analytique consiste donc \u00e0 supprimer syst\u00e9matiquement toutes les lignes affichant <code>points <= 7<\/code>.<\/p>\n<p>Formulant la condition de pr\u00e9servation sous forme compl\u00e9mentaire, l'analyste \u00e9crit : <code>df_performants <- df %>% filter(points > 7)<\/code>. L'\u00e9valuation s'ex\u00e9cute le long du vecteur num\u00e9rique. Les lignes affichant des valeurs comme six ou sept sont \u00e9vinc\u00e9es, tandis que celles pointant \u00e0 huit ou au-del\u00e0 sont pr\u00e9serv\u00e9es. Cette syntaxe offre une clart\u00e9 visuelle ind\u00e9niable qui documente directement le seuil d'inclusion choisi pour le design exp\u00e9rimental.<\/p>\n<p>N\u00e9anmoins, une propri\u00e9t\u00e9 fondamentale du moteur de <code>filter()<\/code> doit imp\u00e9rativement \u00eatre comprise lors de l'ex\u00e9cution de comparaisons scalaires sur des colonnes contenant des donn\u00e9es incompl\u00e8tes : le traitement automatique des valeurs manquantes. Si la colonne <code>points<\/code> d'un individu contient <code>NA<\/code>, l'\u00e9valuation arithm\u00e9tique <code>NA > 7<\/code> ne renvoie ni <code>TRUE<\/code>, ni <code>FALSE<\/code>, mais la valeur ind\u00e9termin\u00e9e <code>NA<\/code>. Par construction, comme nous l'avons soulign\u00e9 au chapitre introductif, <code>filter()<\/code> \u00e9carte sans sommation toute observation dont l'\u00e9valuation produit un r\u00e9sultat ind\u00e9termin\u00e9. D\u00e8s lors, le filtre quantitatif <code>points > 7<\/code> op\u00e8re une double suppression implicite : il \u00e9limine \u00e0 la fois les valeurs num\u00e9riques inf\u00e9rieures ou \u00e9gales \u00e0 sept, mais \u00e9galement l'int\u00e9gralit\u00e9 des observations dont le score de points est manquant.<\/p>\n<h2>8. Filtrage conditionnel complexe avec op\u00e9rateurs bool\u00e9ens multiples<\/h2>\n<h3>8.1 Combinaison logique par conjonction et disjonction<\/h3>\n<p>La r\u00e9alit\u00e9 des \u00e9tudes scientifiques impose fr\u00e9quemment la formulation de crit\u00e8res de tri d'une complexit\u00e9 sup\u00e9rieure \u00e0 de simples seuils univari\u00e9s. Les protocoles exp\u00e9rimentaux r\u00e9clament l'entrelacement de multiples pr\u00e9dicats au moyen des connecteurs cardinaux de l'alg\u00e8bre de Boole : l'op\u00e9rateur de conjonction logique ET, mat\u00e9rialis\u00e9 par le symbole esperluette (<code>&<\/code>), et l'op\u00e9rateur de disjonction inclusive OU, transcrit par la barre verticale (<code>|<\/code>). La ma\u00eetrise de ces op\u00e9rateurs au sein de <code>filter()<\/code> conditionne la finesse de l'extraction des donn\u00e9es.<\/p>\n<p>L'alg\u00e8bre bool\u00e9enne r\u00e9pond \u00e0 des tables de v\u00e9rit\u00e9 universelles que l'analyste doit garder constamment \u00e0 l'esprit. L'expression conjonctive <code>Condition_1 & Condition_2<\/code> n'\u00e9value \u00e0 <code>TRUE<\/code> que dans l'unique configuration o\u00f9 l'ensemble des propositions composantes est simultan\u00e9ment v\u00e9rifi\u00e9. \u00c0 la moindre d\u00e9faillance de l'une d'elles, l'enregistrement est \u00e9cart\u00e9. \u00c0 l'oppos\u00e9, l'expression disjonctive <code>Condition_1 | Condition_2<\/code> accorde la validation d\u00e8s lors qu'au moins l'une des deux conditions est satisfaite, n'excluant la ligne que dans le cas d'une invalidation totale conjointe.<\/p>\n<p>L'\u00e9cueil pr\u00e9pond\u00e9rant dans l'ordonnancement de pr\u00e9dicats multiples r\u00e9side dans la m\u00e9connaissance des r\u00e8gles de pr\u00e9s\u00e9ance des op\u00e9rateurs arithm\u00e9tiques et logiques. En langage R, l'op\u00e9rateur <code>&<\/code> poss\u00e8de une priorit\u00e9 syntaxique sup\u00e9rieure \u00e0 l'op\u00e9rateur <code>|<\/code>. En cons\u00e9quence, une instruction formul\u00e9e telle que <code>filter(cond1 | cond2 & cond3)<\/code> sera m\u00e9caniquement interpr\u00e9t\u00e9e par l'interpr\u00e9teur comme <code>filter(cond1 | (cond2 & cond3))<\/code>, ce qui peut diverger radicalement de la logique intentionnelle du chercheur qui envisageait <code>filter((cond1 | cond2) & cond3)<\/code>. Le recours scrupuleux et syst\u00e9matique au parenth\u00e9sage formel constitue le seul rempart m\u00e9thodologique garantissant l'int\u00e9grit\u00e9 de l'\u00e9valuation lors d'assemblages logiques composites.<\/p>\n<h3>8.2 Exemple pratique : filter(column1 == 'A' | column2 > 8)<\/h3>\n<p>Examinons pas \u00e0 pas la dynamique op\u00e9ratoire d'une assertion disjonctive complexe en soumettant notre jeu de donn\u00e9es exp\u00e9rimental \u00e0 la commande suivante : <code>df_complexe <- df %>% filter(team == 'A' | points > 8)<\/code>. Dans cette configuration, l'intention de l'analyste est de pr\u00e9server une observation si elle remplit au moins l'une de ces deux conditions : appartenir formellement \u00e0 l'\u00e9quipe 'A' OU avoir cumul\u00e9 un score strictement sup\u00e9rieur \u00e0 huit points. L'exclusion frappera donc uniquement les observations ne satisfaisant ni \u00e0 l'un, ni \u00e0 l'autre de ces crit\u00e8res.<\/p>\n<p>Le traitement ligne par ligne s'effectue selon la s\u00e9quence logique suivante :<\/p>\n<ul>\n<li>Une ligne rattach\u00e9e \u00e0 l'\u00e9quipe 'A' affichant un score modeste de six points est formellement valid\u00e9e, car le premier pr\u00e9dicat est <code>TRUE<\/code>, rendant l'\u00e9tat du second indiff\u00e9rent \u00e0 la validation finale.<\/li>\n<li>Une ligne appartenant \u00e0 l'\u00e9quipe 'B' mais affichant un score remarquable de dix points est \u00e9galement retenue, le second terme validant la disjonction.<\/li>\n<li>Une ligne affili\u00e9e \u00e0 l'\u00e9quipe 'C' dot\u00e9e de seulement cinq points voit ses deux pr\u00e9dicats s'effondrer \u00e0 <code>FALSE<\/code> ; elle est en cons\u00e9quence expuls\u00e9e de la table r\u00e9sultante.<\/li>\n<\/ul>\n<p>Toutefois, la pr\u00e9sence de valeurs <code>NA<\/code> vient compliquer l'\u00e9valuation logique en vertu des principes de la logique ternaire de Kleene. Si une observation de l'\u00e9quipe 'B' pr\u00e9sente un score <code>NA<\/code> sur la variable <code>points<\/code>, l'expression globale se d\u00e9compose ainsi : <code>FALSE | NA<\/code>, ce qui s'\u00e9value irr\u00e9m\u00e9diablement en <code>NA<\/code>. La ligne est donc supprim\u00e9e par le filtre. En revanche, si une observation rattach\u00e9e \u00e0 l'\u00e9quipe 'A' affiche un score <code>NA<\/code>, l'expression devient : <code>TRUE | NA<\/code>. Dans la logique de R, la certitude que le premier terme est vrai suffit \u00e0 rendre l'expression globale universellement vraie, quelle que soit la valeur th\u00e9orique cach\u00e9e derri\u00e8re le <code>NA<\/code>. En cons\u00e9quence, cette ligne sp\u00e9cifique est retenue, illustrant la subtilit\u00e9 chirurgicale avec laquelle <code>filter()<\/code> r\u00e9sout les \u00e9quations logiques partielles.<\/p>\n<h3>8.3 Filtrage d'appartenance \u00e0 un ensemble avec l'op\u00e9rateur %in%<\/h3>\n<p>Il est fr\u00e9quent de devoir conditionner l'exclusion ou la conservation de lignes sur la base d'une \u00e9num\u00e9ration \u00e9tendue de crit\u00e8res discrets. Par exemple, si l'on souhaite \u00e9liminer les observations issues des \u00e9quipes 'A', 'C', 'E' et 'G', l'\u00e9criture s\u00e9quentielle de disjonctions d'\u00e9galit\u00e9s sous la forme <code>team == 'A' | team == 'C' | team == 'E' | ...<\/code> s'av\u00e8re non seulement fastidieuse, mais hautement propice aux erreurs de frappe et difficilement g\u00e9n\u00e9ralisable au sein d'un pipeline d'automatisation.<\/p>\n<p>L'op\u00e9rateur d'appartenance vectorielle <code>%in%<\/code> r\u00e9sout ce probl\u00e8me d'\u00e9l\u00e9gance syntaxique et de puissance d'\u00e9valuation. Cet op\u00e9rateur confronte chaque \u00e9l\u00e9ment du vecteur de gauche \u00e0 l'ensemble constitu\u00e9 par le vecteur de droite, renvoyant <code>TRUE<\/code> en cas d'intersection av\u00e9r\u00e9e. Pour convertir cette appartenance en crit\u00e8re d'exclusion, il suffit d'adjoindre l'op\u00e9rateur de n\u00e9gation logique unaire plac\u00e9 en pr\u00e9ambule de la proposition. L'instruction prend ainsi la forme canonique : <code>df %>% filter(!team %in% c('A', 'C'))<\/code>.<\/p>\n<p>Outre sa sup\u00e9riorit\u00e9 \u00e9vidente en mati\u00e8re de concision d'\u00e9criture, l'op\u00e9rateur <code>%in%<\/code> pr\u00e9sente un avantage majeur dans le traitement des incertitudes : contrairement \u00e0 l'op\u00e9rateur d'\u00e9galit\u00e9 stricte <code>==<\/code>, <code>%in%<\/code> ne renvoie jamais <code>NA<\/code> lorsqu'il rencontre une valeur manquante. Si la colonne examin\u00e9e comporte une entr\u00e9e <code>NA<\/code>, celle-ci est test\u00e9e contre l'ensemble cible. Si le vecteur cible ne contient pas explicitement <code>NA<\/code>, le test renvoie sagement <code>FALSE<\/code>. D\u00e8s lors, son inversion logique par <code>!<\/code> produira un <code>TRUE<\/code> robuste, garantissant que les lignes poss\u00e9dant des valeurs manquantes ne seront pas \u00e9ject\u00e9es accidentellement par un effet de bord du test d'appartenance cat\u00e9gorielle.<\/p>\n<h2>9. Suppression de lignes par correspondance textuelle et motifs regex<\/h2>\n<h3>9.1 Int\u00e9gration des fonctions stringr dans filter()<\/h3>\n<p>L'\u00e9puration des donn\u00e9es textuelles non structur\u00e9es ou semi-structur\u00e9es requiert des outils d'extraction d'une flexibilit\u00e9 sup\u00e9rieure aux comparaisons scalaires directes. Au sein du tidyverse, l'extension sp\u00e9cialis\u00e9e <a rel=\"noopener noreferrer\" href=\"https:\/\/stringr.tidyverse.org\/\">stringr<\/a> s'interface avec une coh\u00e9rence remarquable au sein du verbe <code>filter()<\/code> de <strong>dplyr<\/strong> pour ex\u00e9cuter des suppressions d'observations fond\u00e9es sur la reconnaissance de motifs linguistiques ou lexicaux. Cette int\u00e9gration conf\u00e8re aux pipelines R la puissance d'analyse textuelle indispensable aux \u00e9tudes contemporaines.<\/p>\n<p>Le pivot de cette synergie r\u00e9side dans la fonction <code>str_detect()<\/code>. Cette derni\u00e8re accepte en entr\u00e9e un vecteur de cha\u00eenes de caract\u00e8res ainsi qu'un motif de recherche (<em>pattern<\/em>), puis renvoie un vecteur logique de m\u00eame longueur indiquant par <code>TRUE<\/code> la pr\u00e9sence du motif au sein de la cha\u00eene consid\u00e9r\u00e9e, et par <code>FALSE<\/code> son absence. D\u00e8s lors, pour op\u00e9rer l'\u00e9viction syst\u00e9matique de lignes renfermant une sous-cha\u00eene proscrite, il suffit d'inverser la r\u00e9ponse bool\u00e9enne de <code>str_detect()<\/code> au moyen de la n\u00e9gation logique : <code>df %>% filter(!str_detect(variable_texte, \"motif_a_exclure\"))<\/code>.<\/p>\n<p>Cette approche fonctionnelle d\u00e9passe les anciennes routines issues du langage R de base telles que <code>grepl()<\/code>. Non seulement la famille <code>str_*<\/code> garantit une homog\u00e9n\u00e9it\u00e9 stricte des signatures d'arguments (le vecteur analys\u00e9 occupant invariablement le premier param\u00e8tre positionnel), mais elle assure une prise en charge native et s\u00e9curis\u00e9e de l'encodage universel UTF-8 ainsi qu'un comportement pr\u00e9visible face aux valeurs ind\u00e9termin\u00e9es. Lorsqu'une case textuelle contient un <code>NA<\/code>, <code>str_detect()<\/code> renvoie un <code>NA<\/code> formel, assurant sa neutralisation s\u00e9curis\u00e9e dans le filtre sans risque de conversion silencieuse en cha\u00eene de caract\u00e8res litt\u00e9rale <code>\"NA\"<\/code>.<\/p>\n<h3>9.2 Applications pratiques sur des variables de type caract\u00e8re<\/h3>\n<p>Les champs d'application de cette technique d'\u00e9limination textuelle sont particuli\u00e8rement vastes dans le traitement quotidien des bases de donn\u00e9es de recherche. Prenons le cas d'un identifiant patient ou participant issu d'une \u00e9tude observationnelle dans laquelle des enregistrements temporaires, identifi\u00e9s par le pr\u00e9fixe \"TEST_\" ou le suffixe \"_DRAFT\", ont \u00e9t\u00e9 malencontreusement conserv\u00e9s dans les tables de production. L'objectif est d'\u00e9liminer toutes les lignes d'observations contenant ces marqueurs de d\u00e9veloppement.<\/p>\n<p>La formulation de la commande d'exclusion s'exprime ainsi : <code>df_nettoye <- df %>% filter(!str_detect(identifiant, \"^TEST_\"))<\/code>. L'utilisation du m\u00e9tacaract\u00e8re accent circonflexe ancre la d\u00e9tection au d\u00e9but exact de la cha\u00eene, garantissant qu'un enregistrement valide qui contiendrait malencontreusement la sous-cha\u00eene \"TEST\" en milieu de mot ne soit pas \u00e9vinc\u00e9 ind\u00fbment. De mani\u00e8re sym\u00e9trique, le filtrage des suffixes parasites recourt \u00e0 l'ancre dollar, mat\u00e9rialisant la terminaison formelle de l'attribut textuel : <code>filter(!str_detect(identifiant, \"_DRAFT$\"))<\/code>.<\/p>\n<p>Un autre cas d'usage r\u00e9current concerne le nettoyage des espaces blancs r\u00e9siduels et des cha\u00eenes compos\u00e9es exclusivement de caract\u00e8res invisibles (tabulations, sauts de ligne, espaces ins\u00e9cables). Ces entr\u00e9es corrompues ne sont pas formellement des <code>NA<\/code> au sens informatique, mais repr\u00e9sentent un vide informationnel \u00e9quivalent. En associant <code>str_trim()<\/code> \u00e0 la d\u00e9tection de vacuit\u00e9, l'analyste peut formuler un filtre d'assainissement radical tel que <code>filter(str_trim(commentaire) != \"\")<\/code>, \u00e9jectant ainsi d'un seul bloc toutes les lignes o\u00f9 la variable ne contient aucune information textuelle utile.<\/p>\n<h3>9.3 Filtrage avanc\u00e9 par expressions r\u00e9guli\u00e8res<\/h3>\n<p>Lorsque les crit\u00e8res de non-conformit\u00e9 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\u00e9guli\u00e8res compl\u00e8tes (<em>regex<\/em>) devient incontournable. Les expressions r\u00e9guli\u00e8res constituent un m\u00e9talangage de description formelle de structures textuelles, mobilisant des classes de caract\u00e8res, des quantificateurs et des assertions d'encadrement.<\/p>\n<p>Supposons que notre table de donn\u00e9es comporte une colonne d\u00e9di\u00e9e \u00e0 l'enregistrement d'un code d'identification normalis\u00e9, lequel doit rigoureusement ob\u00e9ir \u00e0 la composition suivante : deux lettres alphab\u00e9tiques majuscules, suivies d'un tiret d'union, suivi de quatre chiffres d\u00e9cimaux (ex. \"AB-1234\"). Tout enregistrement d\u00e9rogeant \u00e0 cette structure rigoureuse r\u00e9sulte d'une corruption de saisie et doit \u00eatre supprim\u00e9 de l'espace analytique. L'invalidation se traduit en syntaxe dplyr par la validation positive du motif r\u00e9gulier conforme :<\/p>\n<p><code>df_valide <- df %>% filter(str_detect(code_patient, \"^[A-Z]{2}-[0-9]{4}$\"))<\/code><\/p>\n<p>L'observation du comportement computationnel de ce type de filtre appelle \u00e0 des pr\u00e9cautions m\u00e9thodologiques d'importance quant \u00e0 la complexit\u00e9 algorithmique. Les moteurs d'expressions r\u00e9guli\u00e8res (fond\u00e9s sur la biblioth\u00e8que open-source ICU sous <strong>stringr<\/strong>) mobilisent des automates finis non d\u00e9terministes. Bien que remarquablement performants sur des jeux de donn\u00e9es d'\u00e9chelle courante, des motifs regex excessivement complexes comportant des quantificateurs imbriqu\u00e9s non possessifs peuvent induire un ph\u00e9nom\u00e8ne catastrophique de r\u00e9trogradation exponentielle (<em>catastrophic backtracking<\/em>). Sur des corpus massifs de plusieurs millions de lignes, l'analyste veillera \u00e0 formuler des regex d\u00e9terministes d'une parcimonie maximale ou \u00e0 d\u00e9composer ses filtres en \u00e9tapes bool\u00e9ennes \u00e9l\u00e9mentaires pour pr\u00e9server l'efficience du temps de calcul.<\/p>\n<h2>10. Suppression conditionnelle au niveau group\u00e9 avec group_by()<\/h2>\n<h3>10.1 Concept de filtrage contextuel par groupe<\/h3>\n<p>L'une des innovations majeures introduite par <strong>dplyr<\/strong> r\u00e9side dans sa capacit\u00e9 \u00e0 partitionner virtuellement une structure rectangulaire au moyen du verbe <code>group_by()<\/code> afin de modifier le contexte d'\u00e9valuation de toutes les fonctions ult\u00e9rieures. Lorsqu'un tableau subit un groupement, les op\u00e9rations ne sont plus appliqu\u00e9es \u00e0 l'\u00e9chelle globale de la population statistique, mais s'ex\u00e9cutent de fa\u00e7on \u00e9tanche et autonome au sein de chaque strate d\u00e9finie par les variables de regroupement.<\/p>\n<p>L'application du verbe <code>filter()<\/code> \u00e0 une structure group\u00e9e alt\u00e8re profond\u00e9ment la s\u00e9mantique de l'\u00e9valuation logique. Au lieu de confronter les donn\u00e9es d'une ligne \u00e0 une constante scalaire universelle ou \u00e0 un vecteur global, <code>filter()<\/code> r\u00e9sout les assertions logiques par rapport aux moments statistiques locaux propres \u00e0 la strate \u00e0 laquelle appartient chaque ligne. Il devient ainsi possible d'\u00e9crire <code>df %>% group_by(team) %>% filter(points > mean(points, na.rm = TRUE))<\/code>. Dans cette configuration, le seuil d'inclusion n'est pas fig\u00e9 : une ligne n'est conserv\u00e9e que si son score de points surpasse la moyenne sp\u00e9cifique de sa propre \u00e9quipe.<\/p>\n<p>Cette distinction entre filtres au niveau de l'individu isol\u00e9 et filtres au niveau de la population group\u00e9e introduit un saut qualitatif dans l'analyse de donn\u00e9es. Elle permet d'\u00e9liminer des lignes non pas sur la base de crit\u00e8res absolus arbitraires, mais en fonction de leur position relative au sein de leur propre sous-population de r\u00e9f\u00e9rence. Cette approche contextualis\u00e9e \u00e9vite de biaiser l'\u00e9chantillon en \u00e9liminant pr\u00e9f\u00e9rentiellement des individus appartenant \u00e0 des sous-groupes structurellement caract\u00e9ris\u00e9s par des moyennes globales inf\u00e9rieures.<\/p>\n<h3>10.2 Exemples d'\u00e9limination de strates enti\u00e8res d'observations<\/h3>\n<p>Une modalit\u00e9 fondamentale du filtrage group\u00e9 r\u00e9side dans la capacit\u00e9 \u00e0 \u00e9liminer d'un seul bloc des strates compl\u00e8tes d'observations d\u00e8s lors que la sous-population concern\u00e9e ne satisfait pas \u00e0 un cahier des charges statistique pr\u00e9d\u00e9fini. L'analyste ne filtre plus des individus isol\u00e9s, mais utilise la taille ou les propri\u00e9t\u00e9s d'agr\u00e9gation du groupe pour autoriser ou interdire la persistance de l'ensemble de ses composantes.<\/p>\n<p>Un cas de figure canonique concerne l'exclusion syst\u00e9matique des strates sous-repr\u00e9sent\u00e9es. Dans de nombreux protocoles cliniques ou sociologiques, un groupe dont l'effectif d'\u00e9chantillonnage (<span class=\"arabpsy-math-inline\" data-latex=\"n\">$n$<\/span>) est trop exigu ne permet pas d'estimer valablement la variance intra-groupe et menace la convergence des mod\u00e8les multiniveaux. Pour \u00e9vincer tous les groupes comptant moins de trois individus, la formulation <strong>dplyr<\/strong> s'av\u00e8re d'une concision exemplaire :<\/p>\n<p><code>df_filtre <- df %>% group_by(team) %>% filter(n() >= 3) %>% ungroup()<\/code><\/p>\n<p>Dans ce segment de code, la fonction utilitaire <code>n()<\/code> calcule dynamiquement l'effectif associ\u00e9 \u00e0 chaque modalit\u00e9 d'\u00e9quipe. Si une \u00e9quipe ne r\u00e9unit qu'une ou deux observations, l'assertion \u00e9value \u00e0 <code>FALSE<\/code> pour l'int\u00e9gralit\u00e9 des membres de cette \u00e9quipe, ce qui provoque la disparition compl\u00e8te de la strate dans le tableau \u00e9pur\u00e9.<\/p>\n<p>Il est imp\u00e9ratif de souligner l'obligation m\u00e9thodologique absolue de clore syst\u00e9matiquement toute s\u00e9quence de traitement group\u00e9 par l'appel explicite au verbe <code>ungroup()<\/code>. Omettre ce d\u00e9groupement final laisse la table dans un \u00e9tat partitionn\u00e9 invisible en m\u00e9moire. Toutes les transformations, s\u00e9lections ou calculs statistiques subs\u00e9quents conduits ult\u00e9rieurement par d'autres fonctions continueront alors de s'ex\u00e9cuter strate par strate, ce qui peut engendrer des ralentissements algorithmiques massifs et des erreurs d'interpr\u00e9tation critiques lors d'estimations globales.<\/p>\n<h3>10.3 Applications empiriques aux s\u00e9ries temporelles et mesures r\u00e9p\u00e9t\u00e9es<\/h3>\n<p>Dans les dispositifs longitudinaux, les essais randomis\u00e9s contr\u00f4l\u00e9s \u00e0 mesures r\u00e9p\u00e9t\u00e9es et les s\u00e9ries temporelles en panel, l'unit\u00e9 d'analyse statistique n'est plus l'observation instantan\u00e9e, mais la trajectoire temporelle globale du participant ou de l'entit\u00e9 suivie. L'un des imp\u00e9ratifs du nettoyage de telles structures consiste \u00e0 supprimer l'int\u00e9gralit\u00e9 des enregistrements temporels d'un sujet d\u00e8s lors que son suivi longitudinal pr\u00e9sente des ruptures de protocole ou une incompl\u00e9tude r\u00e9dhibitoire.<\/p>\n<p>Supposons un protocole d'observation s'\u00e9tendant formellement sur quatre vagues s\u00e9quentielles (temps <span class=\"arabpsy-math-inline\" data-latex=\"T_1\">$T_1$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"T_2\">$T_2$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"T_3\">$T_3$<\/span>, <span class=\"arabpsy-math-inline\" data-latex=\"T_4\">$T_4$<\/span>). Si un participant a manqu\u00e9 l'une des vagues d'\u00e9valuation interm\u00e9diaire, son profil longitudinal est incomplet et l'estimation de son mod\u00e8le de croissance individuel se trouve compromise. Pour purger la base de donn\u00e9es de tous les participants n'ayant pas honor\u00e9 l'int\u00e9gralit\u00e9 des quatre temps de recueil, l'analyste formule le filtre contextuel suivant :<\/p>\n<p><code>df_longitudinal <- df_panel %>% group_by(sujet_id) %>% filter(n_distinct(temps_mesure) == 4) %>% ungroup()<\/code><\/p>\n<p>Par cette instruction, le nombre de temps de mesure distincts est calcul\u00e9 \u00e0 l'int\u00e9rieur de chaque profil individuel. Les participants pr\u00e9sentant un historique tronqu\u00e9 (trois mesures ou moins) sont int\u00e9gralement retranch\u00e9s de la cohorte d'analyse, \u00e9liminant ainsi le risque d'introduire des s\u00e9ries temporelles d\u00e9s\u00e9quilibr\u00e9es dans les estimations \u00e9conom\u00e9triques sans devoir proc\u00e9der \u00e0 des ajustements matriciels manuels laborieux.<\/p>\n<h2>11. Bonnes pratiques, performance algorithmique et erreurs courantes<\/h2>\n<h3>11.1 Le pi\u00e8ge triadique des valeurs manquantes dans les tests logiques<\/h3>\n<p>La source d'erreurs la plus pernicieuse lors de la suppression de lignes avec <strong>dplyr<\/strong> d\u00e9coule directement de la confrontation entre les comparateurs relationnels et la logique triadique (ou ternaire) inh\u00e9rente au traitement des valeurs ind\u00e9termin\u00e9es en R. Dans le mod\u00e8le formel de Kleene, une assertion logique confront\u00e9e \u00e0 une absence d'information ne produit pas un \u00e9tat binaire vrai ou faux, mais un troisi\u00e8me \u00e9tat ind\u00e9termin\u00e9 mat\u00e9rialis\u00e9 par la constante <code>NA<\/code>. La proposition formelle <code>NA == 5<\/code> ne renvoie pas <code>FALSE<\/code>, elle renvoie rigoureusement <code>NA<\/code>, car il est logiquement impossible d'affirmer la fausset\u00e9 d'une \u00e9galit\u00e9 dont l'un des termes est inconnu.<\/p>\n<p>Ce postulat \u00e9pist\u00e9mique engendre un pi\u00e8ge critique lorsque l'analyste recourt au pr\u00e9dicat d'exclusion standard <code>filter(variable != \"Valeur\")<\/code>. L'intuition commune conduit \u00e0 supposer que cette commande pr\u00e9serve toutes les lignes dont la variable n'est pas \u00e9gale \u00e0 la modalit\u00e9 d\u00e9sign\u00e9e. Or, pour toute observation o\u00f9 la variable est cod\u00e9e <code>NA<\/code>, le test <code>NA != \"Valeur\"<\/code> se r\u00e9sout en <code>NA<\/code>. Puisque <code>filter()<\/code> applique le principe conservateur d'\u00e9carter syst\u00e9matiquement tout enregistrement non express\u00e9ment valid\u00e9 \u00e0 <code>TRUE<\/code>, <strong>toutes les lignes comportant des valeurs manquantes sont \u00e9limin\u00e9es silencieusement<\/strong>. L'analyste se trouve alors avoir supprim\u00e9 des donn\u00e9es sans en avoir formul\u00e9 l'intention explicite.<\/p>\n<p>Pour neutraliser ce pi\u00e8ge fondamental et immuniser le pipeline contre ces ablations clandestines, deux strat\u00e9gies syntaxiques d\u00e9fensives doivent \u00eatre adopt\u00e9es :<\/p>\n<ul>\n<li>Formuler explicitement la clause de tol\u00e9rance des valeurs manquantes au moyen d'une disjonction inclusive : <code>filter(variable != \"Valeur\" | is.na(variable))<\/code>.<\/li>\n<li>Mobiliser la fonction utilitaire <code>coalesce()<\/code> issue de <strong>dplyr<\/strong> pour remplacer dynamiquement, au moment strict de l'\u00e9valuation logique, les ind\u00e9terminations par une modalit\u00e9 neutre qui ne perturbe pas le test relationnel.<\/li>\n<\/ul>\n<h3>11.2 Optimisation computationnelle pour les volum\u00e9tries massives<\/h3>\n<p>Lorsque le volume de donn\u00e9es franchit l'\u00e9chelle des dizaines de millions d'enregistrements (<em>Big Data<\/em>), l'efficience algorithmique des op\u00e9rations d'\u00e9viction de lignes devient une pr\u00e9occupation architecturale majeure. Bien que les routines C++ de <strong>dplyr<\/strong> soient remarquablement optimis\u00e9es, des disparit\u00e9s de performances consid\u00e9rables peuvent survenir selon la mani\u00e8re dont les pr\u00e9dicats de filtrage sont agenc\u00e9s et ex\u00e9cut\u00e9s en m\u00e9moire vive.<\/p>\n<p>Une premi\u00e8re r\u00e8gle d'optimisation fondamentale concerne l'ordre d'\u00e9valuation des pr\u00e9dicats multiples au sein de <code>filter()<\/code>. Le moteur sous-jacent applique le principe de l'\u00e9valuation court-circuit (<em>short-circuit evaluation<\/em>) : dans une suite d'arguments conjonctifs s\u00e9par\u00e9s par des virgules, l'\u00e9valuation s'interrompt d\u00e8s qu'un pr\u00e9dicat renvoie <code>FALSE<\/code>. Par cons\u00e9quent, il est strat\u00e9giquement imp\u00e9ratif de placer en premi\u00e8re position les pr\u00e9dicats logiques les plus s\u00e9lectifs (ceux qui \u00e9liminent la fraction la plus importante du tableau) et les moins co\u00fbteux en temps CPU (comme les comparaisons scalaires directes), et de rel\u00e9guer en queue de cha\u00eene les expressions computationnellement on\u00e9reuses, telles que les d\u00e9tections de motifs par expressions r\u00e9guli\u00e8res ou les fonctions statistiques fen\u00eatr\u00e9es.<\/p>\n<p>Pour les contextes o\u00f9 l'empreinte m\u00e9moire d'un <code>data.frame<\/code> d\u00e9passe les capacit\u00e9s de l'interpr\u00e9teur R standard, l'int\u00e9gration du paquet <strong>dtplyr<\/strong> repr\u00e9sente une solution technique de premier plan. <strong>dtplyr<\/strong> fournit une interface transparente permettant d'\u00e9crire du code <strong>dplyr<\/strong> canonique tout en traduisant automatiquement les expressions sous forme d'instructions compil\u00e9es \u00e0 destination de l'architecture ultra-v\u00e9loce de <a rel=\"noopener noreferrer\" href=\"https:\/\/rdatatable.gitlab.io\/data.table\/\">data.table<\/a>. Cette hybridation garantit des vitesses de filtrage multi-c\u0153urs quasi instantan\u00e9es et des modifications en m\u00e9moire par r\u00e9f\u00e9rence sans copie superficielle de structure (<em>copy-on-modify<\/em>), alliant l'ergonomie s\u00e9mantique du tidyverse \u00e0 la puissance brute du calcul vectoriel compil\u00e9.<\/p>\n<h3>11.3 Validation et auditabilit\u00e9 du processus de suppression<\/h3>\n<p>L'assainissement statistique d'une matrice empirique ne saurait \u00eatre consid\u00e9r\u00e9 comme complet sans la mise en place d'un protocole formel de validation et d'auditabilit\u00e9. Chaque transformation soustractive appliqu\u00e9e au corpus doit pouvoir \u00eatre mesur\u00e9e, document\u00e9e et adoss\u00e9e \u00e0 des indicateurs de d\u00e9perdition d'effectifs v\u00e9rifiables. Cette exigence de rigueur r\u00e9pond directement aux standards de publication acad\u00e9mique internationaux, \u00e0 l'image des c\u00e9l\u00e8bres diagrammes de flux d'inclusion pr\u00e9conis\u00e9s par les directives CONSORT dans le domaine biom\u00e9dical.<\/p>\n<p>Pour mat\u00e9rialiser cet audit au fil de l'eau, il est vivement recommand\u00e9 d'encadrer les pipelines d'\u00e9puration par des points de contr\u00f4le quantitatifs. L'adjonction de messages d'information calculant la diff\u00e9rence absolue et relative d'individus apr\u00e8s chaque \u00e9tape critique permet d'alerter instantan\u00e9ment l'analyste en cas d'effondrement anormal de la taille de l'\u00e9chantillon. L'usage de structures d'enregistrement d'\u00e9tats interm\u00e9diaires permet ainsi d'extraire automatiquement des m\u00e9tadonn\u00e9es de tra\u00e7abilit\u00e9 d\u00e9crivant avec exactitude le nombre d'observations retranch\u00e9es pour chaque crit\u00e8re d'exclusion sp\u00e9cifique (doublons, seuils quantitatifs, incompl\u00e9tude).<\/p>\n<p>Enfin, la fiabilisation industrielle du pipeline de donn\u00e9es exige l'int\u00e9gration de tests unitaires automatis\u00e9s mobilisant des extensions sp\u00e9cialis\u00e9es telles que <a rel=\"noopener noreferrer\" href=\"https:\/\/testthat.r-lib.org\/\">testthat<\/a>. En formulant des assertions syst\u00e9matiques sur le r\u00e9sultat final \u2014 certifiant par exemple que <code>nrow(df_propre) > 0<\/code>, que <code>anyDuplicated(df_propre) == 0<\/code> ou qu'aucune valeur de la variable cible ne viole le domaine de d\u00e9finition th\u00e9orique admis \u2014, l'analyste \u00e9rige des barri\u00e8res \u00e9tanches contre la propagation silencieuse d'anomalies de traitement, garantissant une robustesse m\u00e9thodologique irr\u00e9prochable.<\/p>\n<h2>12. \u00c9tude de cas int\u00e9gr\u00e9e : protocole complet de nettoyage d'un jeu de donn\u00e9es<\/h2>\n<h3>12.1 Pr\u00e9sentation du cas d'\u00e9tude et formalisation du probl\u00e8me<\/h3>\n<p>Afin de synth\u00e9tiser l'ensemble des concepts, fonctions et strat\u00e9gies explor\u00e9s au cours de ce trait\u00e9, nous d\u00e9ployons une \u00e9tude de cas int\u00e9gr\u00e9e mod\u00e9lisant un protocole complet de nettoyage de donn\u00e9es. Consid\u00e9rons un jeu de donn\u00e9es brut issu d'une enqu\u00eate comportementale multicentrique mesurant les performances cognitives d'individus soumis \u00e0 diff\u00e9rents stimuli exp\u00e9rimentaux. Ce fichier source, caract\u00e9ris\u00e9 par un volume initial de dix mille enregistrements ventil\u00e9s sur six variables fondamentales, pr\u00e9sente l'int\u00e9gralit\u00e9 des pathologies couramment diss\u00e9min\u00e9es dans les environnements de production r\u00e9els.<\/p>\n<p>L'audit pr\u00e9liminaire du corpus brut met en lumi\u00e8re une s\u00e9rie de d\u00e9faillances structurelles majeures qu'il convient de r\u00e9sorber m\u00e9thodiquement :<\/p>\n<ul>\n<li>Des dysfonctionnements de transfert r\u00e9seau ont provoqu\u00e9 l'insertion d'un nombre cons\u00e9quent de doublons parfaits r\u00e9partis de fa\u00e7on al\u00e9atoire dans la base.<\/li>\n<li>Des sessions d'\u00e9valuation interrompues ont g\u00e9n\u00e9r\u00e9 des valeurs manquantes massives (<code>NA<\/code>) sur la variable d'\u00e9valuation principale (<code>score_cognitif<\/code>) ainsi que sur les indicateurs physiologiques annexes.<\/li>\n<li>Des erreurs de saisie manuelle ont introduit des scores aberrants irr\u00e9alistes (valeurs n\u00e9gatives ou d\u00e9passant les bornes maximales th\u00e9oriques de l'\u00e9chelle d'\u00e9valuation fix\u00e9e \u00e0 cent points).<\/li>\n<li>La pr\u00e9sence d'identifiants de participants non conformes comportant des mentions de test interne ou des anomalies typographiques alt\u00e8re la variable d'identification.<\/li>\n<li>Certains centres exp\u00e9rimentaux n'ont recrut\u00e9 qu'une poign\u00e9e marginale de participants, interdisant toute mod\u00e9lisation multi-niveaux fiable \u00e0 l'\u00e9chelle du centre en raison d'un manque d'effectif critique.<\/li>\n<\/ul>\n<p>Le cahier des charges m\u00e9thodologique est formellement arr\u00eat\u00e9 : il s'agit d'\u00e9laborer un pipeline s\u00e9quentiel continu, articul\u00e9 autour des verbes cardinaux de <strong>dplyr<\/strong>, capable de purger rigoureusement l'int\u00e9gralit\u00e9 de ces scories sans jamais d\u00e9naturer la coh\u00e9rence globale des observations valides, tout en assurant une tra\u00e7abilit\u00e9 int\u00e9grale de la d\u00e9perdition d'\u00e9chantillon.<\/p>\n<h3>12.2 Mise en \u0153uvre s\u00e9quentielle du pipeline dplyr complet<\/h3>\n<p>La transcription de ce protocole en syntaxe d\u00e9clarative prend la forme d'une s\u00e9quence ininterrompue d'op\u00e9rations cha\u00een\u00e9es par l'op\u00e9rateur de canalisation. Chaque \u00e9tape r\u00e9pond \u00e0 un objectif pr\u00e9cis d'assainissement et met en \u0153uvre l'un des m\u00e9canismes fondamentaux \u00e9tudi\u00e9s dans les sections pr\u00e9c\u00e9dentes :<\/p>\n<p><code># Pipeline s\u00e9quentiel d'\u00e9puration compl\u00e8te des donn\u00e9es d'\u00e9valuation comportementale<br \/>\ndonnees_finales <- donnees_brutes |><br \/>\n&nbsp;&nbsp;# \u00c9tape 1 : \u00c9limination int\u00e9grale des doublons parfaits d'enregistrement<br \/>\n&nbsp;&nbsp;distinct() |><br \/>\n&nbsp;&nbsp;# \u00c9tape 2 : Purge cibl\u00e9e des identifiants non conformes ou de test technique<br \/>\n&nbsp;&nbsp;filter(!str_detect(participant_id, \"^TEST_|_DEV$\")) |><br \/>\n&nbsp;&nbsp;# \u00c9tape 3 : Suppression des observations incompl\u00e8tes sur la m\u00e9trique focale<br \/>\n&nbsp;&nbsp;filter(!is.na(score_cognitif)) |><br \/>\n&nbsp;&nbsp;# \u00c9tape 4 : \u00c9viction des valeurs aberrantes hors bornes th\u00e9oriques de l'instrument<br \/>\n&nbsp;&nbsp;filter(score_cognitif >= 0 & score_cognitif <= 100) |><br \/>\n&nbsp;&nbsp;# \u00c9tape 5 : Filtrage group\u00e9 pour \u00e9liminer les centres \u00e0 trop faible effectif de recrutement<br \/>\n&nbsp;&nbsp;group_by(centre_id) |><br \/>\n&nbsp;&nbsp;filter(n() >= 10) |><br \/>\n&nbsp;&nbsp;ungroup()<\/code><\/p>\n<p>L'ex\u00e9cution de cette suite logique de transformations s'op\u00e8re avec une fluidit\u00e9 totale. La table brute traverse successivement le filtre de d\u00e9duplication hach\u00e9, l'\u00e9valuation par expression r\u00e9guli\u00e8re textuelle, l'exclusion cibl\u00e9e de la vacuit\u00e9 informationnelle, la normalisation param\u00e9trique par encadrement arithm\u00e9tique, et enfin le tamisage contextuel au niveau group\u00e9. L'analyste s'assure par l'appel final \u00e0 <code>ungroup()<\/code> que la structure matricielle de sortie est imm\u00e9diatement disponible pour l'estimation de mod\u00e8les lin\u00e9aires g\u00e9n\u00e9ralis\u00e9s ou de visualisations sous <strong>ggplot2<\/strong>, sans persistance d'\u00e9tats d'agr\u00e9gation r\u00e9siduels.<\/p>\n<p>L'\u00e9valuation des effectifs post-nettoyage au moyen des commandes de d\u00e9nombrement rapide comme <code>tally()<\/code> d\u00e9montre que la base a \u00e9t\u00e9 all\u00e9g\u00e9e d'environ vingt-cinq pour cent de son volume brut initial. Loin d'\u00eatre un pr\u00e9judice, cet \u00e9mondage s\u00e9lectif a \u00e9limin\u00e9 les biais de mesure les plus s\u00e9v\u00e8res, harmonis\u00e9 les variances intra-centres et restaur\u00e9 la validit\u00e9 interne des estimations statistiques futures.<\/p>\n<h3>12.3 Synth\u00e8se comparative des commandes dplyr de suppression de lignes<\/h3>\n<p>Pour parachever ce tour d'horizon complet et guider le praticien dans l'arbitrage quotidien de ses choix syntaxiques, le tableau synoptique suivant r\u00e9capitule de mani\u00e8re exhaustive l'arsenal des commandes disponibles au sein de <strong>dplyr<\/strong> et du <strong>tidyverse<\/strong> pour l'\u00e9viction d'observations, en sp\u00e9cifiant pour chacune son domaine de pr\u00e9dilection et ses comportements caract\u00e9ristiques face \u00e0 l'ind\u00e9termination informationnelle :<\/p>\n<table border=\"1\" cellpadding=\"6\" cellspacing=\"0\" style=\"border-collapse: collapse; width: 100%; margin-top: 15px; margin-bottom: 15px;\">\n<thead>\n<tr style=\"background-color: #f2f2f2; text-align: left;\">\n<th>Fonction \/ Syntaxe<\/th>\n<th>Objectif premier<\/th>\n<th>Sensibilit\u00e9 aux valeurs NA<\/th>\n<th>Co\u00fbt computationnel<\/th>\n<th>Alternative privil\u00e9gi\u00e9e<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>na.omit()<\/code><\/td>\n<td>Suppression universelle des lignes incompl\u00e8tes<\/td>\n<td>\u00c9limine la ligne si un seul NA est d\u00e9tect\u00e9<\/td>\n<td>Faible (routine C optimis\u00e9e)<\/td>\n<td><code>tidyr::drop_na()<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>filter(!is.na(col))<\/code><\/td>\n<td>Suppression cibl\u00e9e des NA sur une colonne donn\u00e9e<\/td>\n<td>Cible exclusivement la variable sp\u00e9cifi\u00e9e<\/td>\n<td>Tr\u00e8s faible (\u00e9valuation vectorielle directe)<\/td>\n<td><code>tidyr::drop_na(col)<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>distinct()<\/code><\/td>\n<td>Suppression des redondances et doublons<\/td>\n<td>Consid\u00e8re deux NA comme des valeurs \u00e9quivalentes<\/td>\n<td>Mod\u00e9r\u00e9 \u00e0 \u00e9lev\u00e9 (table de hachage en m\u00e9moire)<\/td>\n<td><code>unique()<\/code> (base R)<\/td>\n<\/tr>\n<tr>\n<td><code>slice(-c(...))<\/code><\/td>\n<td>Suppression directe par position ordinale<\/td>\n<td>Totalement insensible au contenu des cellules<\/td>\n<td>Extr\u00eamement faible (acc\u00e8s direct par index)<\/td>\n<td>Indexation matricielle <code>[-i, ]<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>filter(predicat)<\/code><\/td>\n<td>Suppression conditionnelle selon crit\u00e8res de valeur<\/td>\n<td>Supprime syst\u00e9matiquement les NA (sauf pr\u00e9caution)<\/td>\n<td>Variable selon la complexit\u00e9 des pr\u00e9dicats<\/td>\n<td><code>subset()<\/code> (base R)<\/td>\n<\/tr>\n<tr>\n<td><code>group_by() %>% filter()<\/code><\/td>\n<td>Suppression conditionnelle \u00e0 l'\u00e9chelle d'une strate<\/td>\n<td>D\u00e9pend de la gestion des NA dans les agr\u00e9gats<\/td>\n<td>\u00c9lev\u00e9 (partitionnement et calculs locaux)<\/td>\n<td>Agr\u00e9gation puis jointure de filtrage<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Au terme de cette exploration syst\u00e9matique, il appara\u00eet avec \u00e9vidence que la suppression de lignes dans l'environnement R ne rel\u00e8ve pas d'une simple routine d'ex\u00e9cution m\u00e9canique, mais constitue un pan fondamental de la m\u00e9thodologie statistique. La richesse, la flexibilit\u00e9 et la rigueur conceptuelle des fonctions fournies par <strong>dplyr<\/strong> conf\u00e8rent \u00e0 l'analyste les leviers indispensables pour manipuler ses donn\u00e9es empiriques avec un niveau d'exactitude, de transparence et d'\u00e9l\u00e9gance syntaxique conforme aux exigences les plus strictes de la science contemporaine.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Bache, S. M., &amp; Wickham, H. (2022). <em>magrittr: A Forward-Pipe Operator for R<\/em> (R package version 2.0.3). <a rel=\"noopener noreferrer\" href=\"https:\/\/CRAN.R-project.org\/package=magrittr\">https:\/\/CRAN.R-project.org\/package=magrittr<\/a><\/li>\n<li>Dowle, M., &amp; Srinivasan, A. (2023). <em>data.table: Extension of `data.frame`<\/em> (R package version 1.14.8). <a rel=\"noopener noreferrer\" href=\"https:\/\/CRAN.R-project.org\/package=data.table\">https:\/\/CRAN.R-project.org\/package=data.table<\/a><\/li>\n<li>Little, R. J. A., &amp; Rubin, D. B. (2019). <em>Statistical Analysis with Missing Data<\/em> (3rd ed.). John Wiley &amp; Sons. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1002\/9781119482260\">https:\/\/doi.org\/10.1002\/9781119482260<\/a><\/li>\n<li>R Core Team. (2023). <em>R: A Language and Environment for Statistical Computing<\/em>. R Foundation for Statistical Computing, Vienna, Austria. <a rel=\"noopener noreferrer\" href=\"https:\/\/www.R-project.org\/\">https:\/\/www.R-project.org\/<\/a><\/li>\n<li>van Buuren, S. (2018). <em>Flexible Imputation of Missing Data<\/em> (2nd ed.). Chapman and Hall\/CRC. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1201\/9780429492259\">https:\/\/doi.org\/10.1201\/9780429492259<\/a><\/li>\n<li>Wickham, H. (2019). <em>Advanced R<\/em> (2nd ed.). Chapman and Hall\/CRC. <a rel=\"noopener noreferrer\" href=\"https:\/\/adv-r.hadley.nz\/\">https:\/\/adv-r.hadley.nz\/<\/a><\/li>\n<li>Wickham, H., Averick, M., Bryan, J., Chang, W., McGowan, L. D., Fran\u00e7ois, R., Grolemund, G., Hayes, A., Henry, L., Hester, J., Kuhn, M., Pedersen, T. L., Miller, E., Bache, S. M., M\u00fcller, K., Ooms, J., Robinson, D., Seidel, D. P., Spinu, V., Takahashi, K., Vaughan, D., Wilke, C., Woo, K., &amp; Yutani, H. (2019). Welcome to the Tidyverse. <em>Journal of Open Source Software<\/em>, 4(43), 1686. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.21105\/joss.01686\">https:\/\/doi.org\/10.21105\/joss.01686<\/a><\/li>\n<li>Wickham, H., \u00c7etinkaya-Rundel, M., &amp; Grolemund, G. (2023). <em>R for Data Science: Import, Tidy, Transform, Visualize, and Model Data<\/em> (2nd ed.). O'Reilly Media. <a rel=\"noopener noreferrer\" href=\"https:\/\/r4ds.hadley.nz\/\">https:\/\/r4ds.hadley.nz\/<\/a><\/li>\n<li>Wickham, H., Fran\u00e7ois, R., Henry, L., M\u00fcller, K., &amp; Vaughan, D. (2023). <em>dplyr: A Grammar of Data Manipulation<\/em> (R package version 1.1.4). <a rel=\"noopener noreferrer\" href=\"https:\/\/CRAN.R-project.org\/package=dplyr\">https:\/\/CRAN.R-project.org\/package=dplyr<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour apprendre \u00e0 supprimer des lignes d&rsquo;un jeu de donn\u00e9es sous R avec dplyr : valeurs manquantes, doublons, index et filtres logiques.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[1829,2193,2464],"tags":[2690,5591,3002,2658,6089],"class_list":["post-4123","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-statistique","category-programmation-r","category-science-des-donnees","tag-dplyr","tag-filter","tag-nettoyage-de-donnees","tag-r","tag-suppression-de-lignes"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4123","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat"}],"about":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/types\/psych_stat"}],"author":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=4123"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4123\/revisions"}],"predecessor-version":[{"id":16594,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4123\/revisions\/16594"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4123"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4123"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4123"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}