{"id":3569,"date":"2026-09-10T22:33:06","date_gmt":"2026-09-10T22:33:06","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-supprimer-lignes-na-r\/"},"modified":"2026-09-10T22:33:06","modified_gmt":"2026-09-10T22:33:06","slug":"comment-supprimer-lignes-na-r","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-supprimer-lignes-na-r","title":{"rendered":"Comment supprimer les lignes avec certaines ou toutes les valeurs NA dans R"},"content":{"rendered":"<p>Dans le domaine de l&rsquo;ing\u00e9nierie des donn\u00e9es et de la recherche empirique contemporaine, l&rsquo;int\u00e9grit\u00e9 structurelle des bases de donn\u00e9es constitue le socle fondamental sur lequel reposent la validit\u00e9 interne et la reproductibilit\u00e9 des inf\u00e9rences statistiques. D\u00e8s lors qu&rsquo;un analyste proc\u00e8de \u00e0 l&rsquo;acquisition, \u00e0 l&rsquo;agr\u00e9gation ou \u00e0 l&rsquo;harmonisation de corpus observationnels ou exp\u00e9rimentaux, la survenue de donn\u00e9es incompl\u00e8tes se manifeste non pas comme une anomalie marginale, mais comme une propri\u00e9t\u00e9 quasi inh\u00e9rente aux syst\u00e8mes de collecte du monde r\u00e9el. Qu&rsquo;il s&rsquo;agisse de d\u00e9faillances de capteurs t\u00e9l\u00e9m\u00e9triques, d&rsquo;abandons progressifs de participants dans le cadre de protocoles d&rsquo;essais cliniques longitudinaux ou d&rsquo;omissions volontaires au sein de questionnaires psychom\u00e9triques d&rsquo;auto-\u00e9valuation, l&rsquo;absence de valeurs alt\u00e8re la continuit\u00e9 des matrices d&rsquo;observation et introduit un niveau d&rsquo;entropie qui complique substantiellement l&rsquo;ex\u00e9cution des algorithmes d&rsquo;apprentissage automatique et des mod\u00e8les lin\u00e9aires g\u00e9n\u00e9ralis\u00e9s.<\/p>\n<p>Le langage de programmation statistique R, fond\u00e9 sur l&rsquo;h\u00e9ritage du syst\u00e8me S et orient\u00e9 nativement vers la mod\u00e9lisation math\u00e9matique rigoureuse, propose une architecture s\u00e9mantique particuli\u00e8rement \u00e9labor\u00e9e pour d\u00e9signer, propager et traiter ces discontinuit\u00e9s de mesure. Contrairement \u00e0 des environnements de programmation g\u00e9n\u00e9ralistes o\u00f9 le vide informationnel est fr\u00e9quemment assimil\u00e9 \u00e0 un pointeur nul ou \u00e0 une valeur sentinelle arbitraire comme le z\u00e9ro, R int\u00e8gre les valeurs manquantes au c\u0153ur m\u00eame de son syst\u00e8me de typage \u00e9l\u00e9mentaire via l&rsquo;objet logique sp\u00e9cifique intitul\u00e9 <em>NA<\/em> (pour <em>Not Available<\/em>). Cette reconnaissance explicite conf\u00e8re au langage une capacit\u00e9 native \u00e0 propager l&rsquo;incertitude \u00e9pist\u00e9mique \u00e0 travers les cha\u00eenes de calcul vectoriel, \u00e9vitant ainsi l&rsquo;introduction silencieuse de distorsions num\u00e9riques, tout en imposant au praticien une vigilance m\u00e9thodologique constante lors de la phase de pr\u00e9traitement.<\/p>\n<p>Le traitement des lignes contenant des donn\u00e9es manquantes, qu&rsquo;il s&rsquo;agisse de purger les observations partiellement renseign\u00e9es ou d&rsquo;\u00e9liminer les enregistrements enti\u00e8rement vides, transcende la simple commodit\u00e9 syntaxique pour engager directement la responsabilit\u00e9 scientifique de l&rsquo;analyste. L&rsquo;\u00e9lagage m\u00e9canique des donn\u00e9es sans discernement algorithmique ni consid\u00e9ration des m\u00e9canismes g\u00e9n\u00e9rateurs sous-jacents expose les \u00e9tudes \u00e0 des pertes drastiques de puissance statistique, voire \u00e0 des biais de s\u00e9lection syst\u00e9matiques susceptibles de vicier les conclusions. Ce guide exhaustif a pour vocation d&rsquo;analyser en profondeur les principes th\u00e9oriques, les m\u00e9canismes computationnels et les impl\u00e9mentations pratiques permettant de supprimer les lignes comportant des valeurs manquantes dans l&rsquo;environnement R. En explorant tant les primitives historiques du socle <em>Base R<\/em> que les grammaires d\u00e9claratives modernes du <em>Tidyverse<\/em> et les architectures vectoris\u00e9es ultra-performantes de <em>data.table<\/em>, cet article fournit aux biostatisticiens, data scientists et chercheurs quantitatifs les cl\u00e9s d&rsquo;une manipulation de donn\u00e9es rigoureuse, \u00e9l\u00e9gante et parfaitement reproductible.<\/p>\n<h2>1. Introduction th\u00e9orique et typologie des valeurs manquantes dans l&rsquo;environnement R<\/h2>\n<h3>1.1 D\u00e9finition et repr\u00e9sentation s\u00e9mantique de l&rsquo;objet NA dans le langage R<\/h3>\n<p>Au sein de la machine virtuelle du langage R, l&rsquo;entit\u00e9 <em>NA<\/em> incarne une constante logique r\u00e9serv\u00e9e signalant l&rsquo;absence substantielle d&rsquo;une mesure statistique. Du point de vue de la th\u00e9orie de la mesure, cette abstraction mod\u00e9lise une grandeur existante dans le continuum du monde r\u00e9el mais demeur\u00e9e inaccessible \u00e0 l&rsquo;instrument d&rsquo;observation lors de l&rsquo;enregistrement de l&rsquo;\u00e9v\u00e9nement empirique. Afin de manipuler cette ind\u00e9termination sans compromettre l&rsquo;architecture du typage vectoriel, R impl\u00e9mente une d\u00e9clinaison polymorphe stricte de la constante manquante au niveau de sa couche bas niveau en langage C. Ainsi, il existe des constantes internes distinctes : <em>NA_integer_<\/em> pour les s\u00e9ries d&rsquo;entiers, <em>NA_real_<\/em> pour les vecteurs \u00e0 virgule flottante double pr\u00e9cision, <em>NA_character_<\/em> pour les cha\u00eenes textuelles, et <em>NA_complex_<\/em> pour les structures scalaires complexes. Bien que la fonction g\u00e9n\u00e9rique d&rsquo;assignation permette d&rsquo;utiliser le symbole universel <em>NA<\/em>, l&rsquo;interpr\u00e9teur proc\u00e8de en m\u00e9moire \u00e0 une coercition transparente vers le sous-type requis afin de pr\u00e9server l&rsquo;homog\u00e9n\u00e9it\u00e9 stricte des vecteurs atomiques primitifs.<\/p>\n<p>Il importe d&rsquo;op\u00e9rer une dissociation conceptuelle et formelle absolue entre l&rsquo;objet <em>NA<\/em> et d&rsquo;autres abstractions num\u00e9riques ou informatiques fr\u00e9quemment rencontr\u00e9es dans l&rsquo;\u00e9cosyst\u00e8me R. L&rsquo;entit\u00e9 <em>NaN<\/em> (pour <em>Not a Number<\/em>), d\u00e9finie formellement par le standard international <a rel=\"noopener noreferrer\" href=\"https:\/\/standards.ieee.org\/ieee\/754\/6269\/\">IEEE 754<\/a> r\u00e9gissant le calcul arithm\u00e9tique en virgule flottante, traduit une impossibilit\u00e9 math\u00e9matique cons\u00e9cutive \u00e0 une op\u00e9ration ind\u00e9finie, telle qu&rsquo;une division de z\u00e9ro par z\u00e9ro ou le calcul de la racine carr\u00e9e d&rsquo;un nombre n\u00e9gatif dans le corps des r\u00e9els. Bien que la fonction de test logique <em>is.na()<\/em> renvoie la valeur <em>TRUE<\/em> lorsqu&rsquo;elle est confront\u00e9e \u00e0 un <em>NaN<\/em>, l&rsquo;inverse n&rsquo;est pas v\u00e9rifi\u00e9 par la fonction <em>is.nan()<\/em>, soulignant le fait que toute incoh\u00e9rence computationnelle constitue une donn\u00e9e manquante, mais que toute donn\u00e9e manquante n&rsquo;est pas une ind\u00e9termination num\u00e9rique. Parall\u00e8lement, l&rsquo;objet <em>NULL<\/em> repr\u00e9sente la liste vide ou l&rsquo;absence totale d&rsquo;objet au sens de la structure de donn\u00e9es ; il ne poss\u00e8de pas d&rsquo;allocation d&rsquo;\u00e9l\u00e9ments dans un vecteur et sa longueur est rigoureusement \u00e9gale \u00e0 z\u00e9ro. Enfin, les entit\u00e9s <em>Inf<\/em> et <em>-Inf<\/em> d\u00e9signent les infinis math\u00e9matiques r\u00e9sultant de divergences asymptotiques, comme la division d&rsquo;un r\u00e9el non nul par z\u00e9ro, et conservent un statut de valeurs num\u00e9riques pleinement d\u00e9termin\u00e9es, non assimilables \u00e0 des <em>NA<\/em>.<\/p>\n<p>L&rsquo;une des manifestations les plus profondes de cette s\u00e9mantique r\u00e9side dans le comportement de propagation des valeurs manquantes au sein des op\u00e9rations logiques et arithm\u00e9tiques, r\u00e9gi par les principes d&rsquo;une logique trivalente inspir\u00e9e des travaux de Stephen Cole Kleene. Lorsqu&rsquo;une op\u00e9ration d&rsquo;addition ou de multiplication incorpore un terme ind\u00e9fini, R postule qu&rsquo;en l&rsquo;absence de certitude sur l&rsquo;op\u00e9rande, le r\u00e9sultat demeure fondamentalement ind\u00e9cidable ; par cons\u00e9quent, l&rsquo;expression renvoie syst\u00e9matiquement <em>NA<\/em>. Sur le plan de la logique bool\u00e9enne, l&rsquo;interpr\u00e9teur applique rigoureusement les lois de d\u00e9duction partielle : la disjonction entre <em>TRUE<\/em> et <em>NA<\/em> g\u00e9n\u00e8re <em>TRUE<\/em> car la pr\u00e9sence d&rsquo;une composante vraie suffit structurellement \u00e0 satisfaire l&rsquo;op\u00e9rateur, ind\u00e9pendamment de la valeur inconnue. En revanche, la conjonction entre <em>TRUE<\/em> et <em>NA<\/em> aboutit \u00e0 <em>NA<\/em>, car l&rsquo;issue finale d\u00e9pend enti\u00e8rement de l&rsquo;\u00e9tat latent de la variable manquante. Ce comportement garantit qu&rsquo;aucune hypoth\u00e8se implicite erron\u00e9e ne s&rsquo;immisce \u00e0 l&rsquo;insu de l&rsquo;exp\u00e9rimentateur au cours des calculs s\u00e9quentiels.<\/p>\n<h3>1.2 M\u00e9canismes psychom\u00e9triques de gen\u00e8se des donn\u00e9es manquantes : MCAR, MAR et MNAR<\/h3>\n<p>L&rsquo;\u00e9limination aveugle d&rsquo;enregistrements lacunaires suppose implicitement que le sous-ensemble de donn\u00e9es \u00e9pur\u00e9 demeure un estimateur sans biais des param\u00e8tres de la population parente. Or, la validit\u00e9 de cette hypoth\u00e8se d\u00e9pend directement du m\u00e9canisme stochastique r\u00e9gissant la disparition des observations, th\u00e9oris\u00e9 par Donald Rubin dans son mod\u00e8le s\u00e9minal publi\u00e9 en 1976. Rubin classifie ces perturbations selon trois r\u00e9gimes probabilistes distincts dont la formalisation conditionne toute d\u00e9cision d&rsquo;amputation m\u00e9thodologique : le m\u00e9canisme des donn\u00e9es manquantes de mani\u00e8re totalement al\u00e9atoire (<em>Missing Completely at Random<\/em> ou <strong>MCAR<\/strong>), le m\u00e9canisme des donn\u00e9es manquantes de mani\u00e8re al\u00e9atoire (<em>Missing at Random<\/em> ou <strong>MAR<\/strong>), et le m\u00e9canisme des donn\u00e9es manquantes de mani\u00e8re non al\u00e9atoire (<em>Missing Not at Random<\/em> ou <strong>MNAR<\/strong>).<\/p>\n<p>Dans la configuration <strong>MCAR<\/strong>, la probabilit\u00e9 qu&rsquo;une valeur soit absente est totalement ind\u00e9pendante \u00e0 la fois des valeurs observ\u00e9es sur d&rsquo;autres variables et de la valeur latente de la variable manquante elle-m\u00eame. Formellement, la distribution conjointe d&rsquo;absence ne d\u00e9pend d&rsquo;aucun facteur d\u00e9celable dans l&rsquo;espace des donn\u00e9es. Ce cas de figure survient typiquement lors d&rsquo;accidents de manipulation technique, tels que le bris inopin\u00e9 d&rsquo;\u00e9prouvettes en laboratoire ou l&rsquo;interruption fortuite de connexions r\u00e9seau lors de transferts t\u00e9l\u00e9m\u00e9triques. Lorsque le r\u00e9gime MCAR est rigoureusement av\u00e9r\u00e9, la suppression compl\u00e8te des lignes incompl\u00e8tes pr\u00e9serve l&rsquo;absence de biais des estimateurs ponctuels, tels que les moyennes ou les coefficients de r\u00e9gression. Toutefois, cette approche entra\u00eene une r\u00e9duction m\u00e9canique de la taille d&rsquo;\u00e9chantillon effective, provoquant un \u00e9largissement des erreurs types et une perte directe de puissance statistique lors des tests d&rsquo;hypoth\u00e8ses formels.<\/p>\n<p>Le r\u00e9gime <strong>MAR<\/strong> d\u00e9crit une d\u00e9pendance conditionnelle : la probabilit\u00e9 de non-r\u00e9ponse sur une variable cible est corr\u00e9l\u00e9e \u00e0 d&rsquo;autres variables observ\u00e9es au sein du jeu de donn\u00e9es, mais demeure ind\u00e9pendante de la valeur manquante sous-jacente une fois que ces covariables sont prises en compte dans le mod\u00e8le. Dans le cadre de recherches \u00e9pid\u00e9miologiques ou sociologiques, un exemple classique r\u00e9side dans la propension diff\u00e9rentielle des hommes et des femmes \u00e0 divulguer leur niveau d&rsquo;anxi\u00e9t\u00e9 ; si les hommes omettent plus fr\u00e9quemment de remplir cette \u00e9chelle, mais que cette omission est constante pour un niveau d&rsquo;anxi\u00e9t\u00e9 donn\u00e9 au sein de la strate masculine, le m\u00e9canisme rel\u00e8ve du cadre MAR. L&rsquo;\u00e9lagage direct des lignes pr\u00e9sentant des valeurs manquantes sous cette hypoth\u00e8se engendre des distorsions math\u00e9matiques majeures, dans la mesure o\u00f9 l&rsquo;\u00e9chantillon filtr\u00e9 surrepr\u00e9sente artificiellement les strates les plus compl\u00e8tes, introduisant ainsi un biais d&rsquo;\u00e9chantillonnage substantiel dans l&rsquo;estimation des distributions marginales.<\/p>\n<p>Enfin, le r\u00e9gime <strong>MNAR<\/strong>, fr\u00e9quemment rencontr\u00e9 dans les protocoles d&rsquo;\u00e9valuations psychologiques autod\u00e9clar\u00e9es ou les \u00e9tudes toxicologiques, stipule que la probabilit\u00e9 d&rsquo;absence d\u00e9pend directement de la valeur non mesur\u00e9e elle-m\u00eame. \u00c0 titre d&rsquo;illustration, des participants pr\u00e9sentant une consommation pathologique d&rsquo;alcool ou des revenus financiers exceptionnellement \u00e9lev\u00e9s choisissent fr\u00e9quemment de ne pas r\u00e9pondre aux items correspondants en raison de biais de d\u00e9sirabilit\u00e9 sociale ou de craintes relatives \u00e0 la confidentialit\u00e9. Sous ce r\u00e9gime, la suppression syst\u00e9matique des lignes incompl\u00e8tes tronque de facto les distributions r\u00e9elles des variables d&rsquo;int\u00e9r\u00eat en censurant de fa\u00e7on cibl\u00e9e les valeurs extr\u00eames de la population. Une telle op\u00e9ration compromet irr\u00e9m\u00e9diablement l&rsquo;inf\u00e9rence statistique, fausse l&rsquo;\u00e9valuation des \u00e9carts types et d\u00e9truit la repr\u00e9sentativit\u00e9 externe de l&rsquo;\u00e9chantillon, sans qu&rsquo;aucun r\u00e9ajustement d&rsquo;ordre purement g\u00e9om\u00e9trique sur les lignes ne puisse restaurer l&rsquo;int\u00e9grit\u00e9 informationnelle perdue.<\/p>\n<h3>1.3 Cadre conceptuel : suppression partielle versus suppression totale de lignes<\/h3>\n<p>Face \u00e0 une matrice de donn\u00e9es incompl\u00e8te, l&rsquo;analyste se trouve confront\u00e9 \u00e0 un arbitrage structural : doit-on tol\u00e9rer une proportion d\u00e9termin\u00e9e de valeurs non renseign\u00e9es au sein d&rsquo;une unit\u00e9 statistique, ou convient-il d&rsquo;exiger une exhaustivit\u00e9 absolue de l&rsquo;ensemble du profil d&rsquo;observation ? La gestion de l&rsquo;attrition des donn\u00e9es, c&rsquo;est-\u00e0-dire l&rsquo;amenuisement progressif de la cohorte d&rsquo;observations au fil du temps ou au gr\u00e9 de la concat\u00e9nation de protocoles exp\u00e9rimentaux, impose de distinguer fondamentalement la non-r\u00e9ponse totale de la non-r\u00e9ponse partielle. Une non-r\u00e9ponse totale se mat\u00e9rialise par une ligne enti\u00e8rement d\u00e9pourvue de contenu informatif sur les axes analytiques consid\u00e9r\u00e9s, correspondant par exemple \u00e0 un sujet qui, bien qu&rsquo;inscrit formellement dans le registre exp\u00e9rimental, n&rsquo;a particip\u00e9 \u00e0 aucune session de mesure. L&rsquo;\u00e9limination de ces profils vides ne modifie en rien la structure informative de l&rsquo;espace empirique et s&rsquo;impose comme une n\u00e9cessit\u00e9 technique triviale de nettoyage pr\u00e9alable.<\/p>\n<p>\u00c0 l&rsquo;inverse, l&rsquo;existence d&rsquo;une non-r\u00e9ponse partielle implique qu&rsquo;un vecteur d&rsquo;observation conserve des informations valides sur un sous-ensemble d\u00e9termin\u00e9 d&rsquo;attributs tout en pr\u00e9sentant des d\u00e9faillances ponctuelles sur d&rsquo;autres colonnes. D\u00e8s lors, la d\u00e9cision d&rsquo;exclure int\u00e9gralement une unit\u00e9 statistique ne peut reposer uniquement sur la pr\u00e9sence d&rsquo;un <em>NA<\/em> isol\u00e9. L&rsquo;analyste doit d\u00e9terminer si la variable d\u00e9faillante pr\u00e9sente un statut de covariable obligatoire ou optionnelle dans les mod\u00e9lisations pr\u00e9vues. Dans les protocoles factoriels confirmatoires ou les analyses en composantes principales, l&rsquo;inclusion de lignes incompl\u00e8tes est formellement prohib\u00e9e par les algorithmes de calcul matriciel de covariance standard, ce qui contraint l&rsquo;op\u00e9rateur soit \u00e0 purger totalement l&rsquo;observation, soit \u00e0 proc\u00e9der \u00e0 des imputations stochastiques pr\u00e9alables. En revanche, dans le cadre de mod\u00e8les mixtes \u00e0 effets al\u00e9atoires appliqu\u00e9s \u00e0 des s\u00e9ries temporelles longitudinales, les structures math\u00e9matiques sous-jacentes tol\u00e8rent parfaitement des d\u00e9s\u00e9quilibres dans la matrice de plan sans exiger l&rsquo;\u00e9viction des sujets incompl\u00e8tement suivis.<\/p>\n<p>Sur le plan pratique au sein du moteur de R, l&rsquo;identification de ces \u00e9tats repose historiquement sur des fonctions primitives hautement optimis\u00e9es \u00e9crites en C. La fonction vectoris\u00e9e <em>is.na()<\/em> examine chaque cellule d&rsquo;un objet et retourne un bool\u00e9en indiquant la pr\u00e9sence ou l&rsquo;absence de donn\u00e9es. Lorsqu&rsquo;elle est appliqu\u00e9e de mani\u00e8re holistique \u00e0 un tableau, elle g\u00e9n\u00e8re un calque logique matriciel de dimensions parfaitement sym\u00e9triques \u00e0 l&rsquo;objet source. Pour synth\u00e9tiser cette information \u00e0 l&rsquo;\u00e9chelle des lignes, la fonction de base <em>complete.cases()<\/em> \u00e9value chaque observation horizontale et d\u00e9livre un vecteur logique unidimensionnel de longueur \u00e9gale au nombre total d&rsquo;observations, assignant <em>TRUE<\/em> exclusivement aux entit\u00e9s ne pr\u00e9sentant absolument aucun <em>NA<\/em> sur l&rsquo;ensemble de leurs dimensions. Ces deux outils primitifs constituent les fondations algorithmiques indispensables sur lesquelles s&rsquo;\u00e9laborent les diff\u00e9rentes strat\u00e9gies de filtration programm\u00e9e.<\/p>\n<h2>2. Pr\u00e9paration et inspection du jeu de donn\u00e9es exp\u00e9rimental<\/h2>\n<h3>2.1 Cr\u00e9ation du data frame de d\u00e9monstration<\/h3>\n<p>Pour fonder les d\u00e9monstrations techniques \u00e0 venir sur une base empirique reproductible et repr\u00e9sentative de sc\u00e9narios r\u00e9els, nous construisons un tableau de donn\u00e9es mod\u00e9lisant les performances sportives d&rsquo;athl\u00e8tes professionnels sur une saison de comp\u00e9tition. Ce jeu de donn\u00e9es synth\u00e9tique int\u00e8gre trois variables quantitatives continues et discr\u00e8tes fr\u00e9quemment analys\u00e9es dans le cadre de mod\u00e8les de r\u00e9gression multivari\u00e9e : le nombre de points marqu\u00e9s (<em>points<\/em>), le nombre de passes d\u00e9cisives distribu\u00e9es (<em>assists<\/em>) et le volume de rebonds capt\u00e9s (<em>rebounds<\/em>). La structure g\u00e9n\u00e9r\u00e9e comprend d\u00e9lib\u00e9r\u00e9ment une diversit\u00e9 de configurations d&rsquo;absence : des cas d&rsquo;exhaustivit\u00e9 parfaite, des profils affect\u00e9s par des donn\u00e9es manquantes sur une seule variable, des observations pr\u00e9sentant de multiples absences partielles, et une ligne enti\u00e8rement compos\u00e9e de valeurs manquantes afin d&rsquo;illustrer la vacuit\u00e9 totale.<\/p>\n<p>L&rsquo;instanciation de ce tableau est r\u00e9alis\u00e9e au moyen de la structure native <em>data.frame<\/em>, en veillant \u00e0 d\u00e9sactiver la conversion automatique des vecteurs de caract\u00e8res en facteurs via les conventions standard de R. L&rsquo;architecture du tableau est d\u00e9finie comme suit :<\/p>\n<p>Le tableau comporte sept observations indic\u00e9es de 1 \u00e0 7. La premi\u00e8re ligne correspond \u00e0 un athl\u00e8te ayant cumul\u00e9 25 points, 5 passes d\u00e9cisives et 10 rebonds, incarnant un profil d&rsquo;observation complet. La deuxi\u00e8me observation pr\u00e9sente 20 points, une absence de mesure sur les passes d\u00e9cisives mat\u00e9rialis\u00e9e par <em>NA<\/em>, et 8 rebonds. La troisi\u00e8me ligne int\u00e8gre 15 points, 7 passes d\u00e9cisives mais une absence de donn\u00e9es sur les rebonds. La quatri\u00e8me ligne mod\u00e9lise une situation d&rsquo;amputation plus s\u00e9v\u00e8re avec un nombre de points ind\u00e9fini (<em>NA<\/em>), 3 passes d\u00e9cisives et un autre <em>NA<\/em> sur les rebonds. La cinqui\u00e8me ligne repr\u00e9sente une observation enti\u00e8rement vierge, o\u00f9 l&rsquo;ensemble des trois variables est syst\u00e9matiquement instanci\u00e9 \u00e0 <em>NA<\/em>. Enfin, les sixi\u00e8me et septi\u00e8me lignes compl\u00e8tent la distribution avec respectivement 30 points, 10 passes et 12 rebonds pour le sixi\u00e8me joueur, et un <em>NA<\/em> sur les points coupl\u00e9 \u00e0 4 passes et 9 rebonds pour le septi\u00e8me enregistrement.<\/p>\n<p>L&rsquo;interrogation de la structure de l&rsquo;objet via la commande <em>str(df)<\/em> permet de certifier que chaque colonne a bien \u00e9t\u00e9 typ\u00e9e sous la forme d&rsquo;un vecteur de r\u00e9els ou d&rsquo;entiers, tout en confirmant la coexistence de valeurs num\u00e9riques standard et de constantes de type <em>NA_real_<\/em>. L&rsquo;ex\u00e9cution de la commande <em>summary(df)<\/em> g\u00e9n\u00e8re un r\u00e9capitulatif descriptif qui met en exergue non seulement les quartiles, moyennes et m\u00e9dianes de chaque variable empirique, mais quantifie \u00e9galement en derni\u00e8re ligne le nombre d&rsquo;occurrences de <em>NA<\/em> sp\u00e9cifiques \u00e0 chaque dimension. Enfin, l&rsquo;\u00e9valuation des dimensions primitives \u00e0 l&rsquo;aide de <em>dim(df)<\/em> confirme formellement une topologie initiale comprenant exactement 7 lignes et 3 colonnes, mesurable isol\u00e9ment par <em>nrow(df)<\/em> qui renvoie 7. Cette v\u00e9rification dimensionnelle constitue le jalon de contr\u00f4le m\u00e9thodologique permettant de valider l&rsquo;impact num\u00e9rique des filtres s\u00e9quentiels appliqu\u00e9s ult\u00e9rieurement.<\/p>\n<h3>2.2 Diagnostic exploratoire des motifs d&rsquo;absence<\/h3>\n<p>Avant d&rsquo;op\u00e9rer la moindre suppression d&rsquo;enregistrements, la d\u00e9ontologie du traitement de donn\u00e9es commande d&rsquo;\u00e9tablir une cartographie exhaustive de la structure des motifs d&rsquo;absence. L&rsquo;\u00e9valuation directe de la commande <em>is.na(df)<\/em> g\u00e9n\u00e8re une matrice logique bool\u00e9enne de dimensions strictement identiques \u00e0 celles du tableau d&rsquo;origine. Chaque cellule de cette matrice prend la valeur <em>TRUE<\/em> si l&rsquo;intersection de la ligne et de la colonne correspondante est occup\u00e9e par un indicateur d&rsquo;absence, et <em>FALSE<\/em> dans l&rsquo;\u00e9ventualit\u00e9 contraire. Bien que cette repr\u00e9sentation matricielle brute soit imm\u00e9diatement accessible pour des corpus de dimensions microscopiques, elle s&rsquo;av\u00e8re cognitivement inexploitable sur des volumes massifs, n\u00e9cessitant le recours \u00e0 des op\u00e9rations d&rsquo;agr\u00e9gation marginale vectoris\u00e9e.<\/p>\n<p>Le calcul du volume d&rsquo;absence global au sein du tableau s&rsquo;obtient simplement par l&rsquo;op\u00e9ration <em>sum(is.na(df))<\/em>. Dans l&rsquo;\u00e9cosyst\u00e8me R, cette syntaxe exploite la coercition implicite des types fondamentaux : le vecteur logique est automatiquement promu en vecteur d&rsquo;entiers o\u00f9 <em>TRUE<\/em> \u00e9quivaut arithm\u00e9tiquement \u00e0 1 et <em>FALSE<\/em> \u00e0 0. Pour affiner l&rsquo;analyse \u00e0 l&rsquo;\u00e9chelle des unit\u00e9s statistiques individuelles, le calcul de la somme marginale par ligne s&rsquo;av\u00e8re indispensable. L&rsquo;instruction <em>rowSums(is.na(df))<\/em> produit un vecteur d&rsquo;entiers dont chaque composante quantifie pr\u00e9cis\u00e9ment le nombre de champs non renseign\u00e9s pour l&rsquo;observation correspondante. Dans le cadre de notre jeu de donn\u00e9es exp\u00e9rimental, cette commande d\u00e9livre la s\u00e9quence vectorielle : 0, 1, 1, 2, 3, 0, 1. Cette distribution indique sans ambigu\u00eft\u00e9 que les lignes 1 et 6 sont d&rsquo;une compl\u00e9tude parfaite (0 NA), que les lignes 2, 3 et 7 souffrent d&rsquo;une perte d&rsquo;information univari\u00e9e (1 NA), que la ligne 4 subit une d\u00e9gradation bivari\u00e9e (2 NA), et que la ligne 5 est caract\u00e9ris\u00e9e par une vacuit\u00e9 absolue correspondant \u00e0 la totalit\u00e9 de ses 3 colonnes.<\/p>\n<p>L&rsquo;exploration peut \u00eatre formalis\u00e9e \u00e0 un niveau sup\u00e9rieur en projetant ces r\u00e9sultats au sein d&rsquo;une table de contingence logique \u00e0 l&rsquo;aide de la syntaxe <em>table(rowSums(is.na(df)))<\/em>. Cette commande synth\u00e9tise la fr\u00e9quence empirique des diff\u00e9rents degr\u00e9s d&rsquo;incompl\u00e9tude pr\u00e9sents dans l&rsquo;\u00e9chantillon. L&rsquo;analyste identifie ainsi instantan\u00e9ment la proportion relative d&rsquo;observations compl\u00e8tes, mod\u00e9r\u00e9ment d\u00e9t\u00e9rior\u00e9es ou totalement absentes. L&rsquo;\u00e9tablissement syst\u00e9matique de ce diagnostic d&rsquo;incompl\u00e9tude en amont de toute manipulation structurelle garantit une tra\u00e7abilit\u00e9 totale des transformations apport\u00e9es au fichier de recherche et pr\u00e9vient l&rsquo;effacement accidentel de volumes de donn\u00e9es disproportionn\u00e9s qui compromettraient la reproductibilit\u00e9 de l&rsquo;\u00e9tude.<\/p>\n<h2>3. Suppression des lignes avec au moins une valeur NA via Base R<\/h2>\n<h3>3.1 L&rsquo;approche fondamentale avec la fonction complete.cases()<\/h3>\n<p>La m\u00e9thode la plus canonique, directe et universellement employ\u00e9e au sein du socle <em>Base R<\/em> pour instaurer un filtrage strict fond\u00e9 sur l&rsquo;exhaustivit\u00e9 totale des mesures repose sur l&rsquo;exploitation de la fonction vectorielle <em>complete.cases()<\/em>. Cette primitive logicielle inspecte s\u00e9quentiellement chaque ligne du tableau de donn\u00e9es fourni en argument et produit en sortie un vecteur logique unidimensionnel dont la taille co\u00efncide rigoureusement avec le nombre d&rsquo;enregistrements du tableau d&rsquo;origine. La valeur logique <em>TRUE<\/em> n&rsquo;est allou\u00e9e \u00e0 un indice de ligne que si et seulement si l&rsquo;int\u00e9gralit\u00e9 des cellules situ\u00e9es sur cette coordonn\u00e9e horizontale abrite des valeurs valides et d\u00e9termin\u00e9es. Si une seule cellule pr\u00e9sente un marqueur d&rsquo;absence, l&rsquo;indice entier bascule vers la valeur <em>FALSE<\/em>.<\/p>\n<p>L&rsquo;extraction op\u00e9rationnelle du sous-ensemble \u00e9pur\u00e9 s&rsquo;effectue au moyen de l&rsquo;op\u00e9rateur d&rsquo;indexation matricielle \u00e0 crochets, en positionnant le pr\u00e9dicat logique en lieu et place du s\u00e9lecteur de lignes, tout en laissant l&#8217;emplacement d\u00e9di\u00e9 aux colonnes d\u00e9lib\u00e9r\u00e9ment vide afin de pr\u00e9server l&rsquo;int\u00e9gralit\u00e9 des dimensions transversales : <em>df_complet &lt;- df[complete.cases(df), ]<\/em>. Lors de l&rsquo;\u00e9valuation de cette expression sur notre tableau d&rsquo;apprentissage, le filtre bool\u00e9en retient exclusivement la premi\u00e8re et la sixi\u00e8me observation. L&rsquo;ex\u00e9cution de la commande <em>nrow(df_complet)<\/em> atteste d&rsquo;une r\u00e9duction drastique de la taille de l&rsquo;\u00e9chantillon, qui passe instantan\u00e9ment de 7 \u00e0 seulement 2 unit\u00e9s d&rsquo;analyse effectives. Cette approche correspond math\u00e9matiquement \u00e0 l&rsquo;impl\u00e9mentation stricte de la suppression par liste (ou <em>listwise deletion<\/em>), technique d&rsquo;une intransigeance absolue qui sacrifie l&rsquo;ensemble des informations valides port\u00e9es par les variables secondaires d&rsquo;une ligne d\u00e8s lors qu&rsquo;un seul d\u00e9faut de mesure est d\u00e9cel\u00e9 sur un attribut quelconque.<\/p>\n<p>Un effet secondaire technique majeur li\u00e9 \u00e0 l&#8217;emploi de cette indexation par crochets r\u00e9side dans la pr\u00e9servation rigide des identifiants d&rsquo;indices originaux au sein des m\u00e9tadonn\u00e9es de l&rsquo;objet r\u00e9sultant. Si l&rsquo;on inspecte le tableau nettoy\u00e9 <em>df_complet<\/em>, les lignes conservent formellement leurs \u00e9tiquettes d&rsquo;origine, \u00e0 savoir 1 et 6, cr\u00e9ant ainsi une discontinuit\u00e9 num\u00e9rique manifeste susceptible de provoquer des comportements anormaux lors de boucles it\u00e9ratives ult\u00e9rieures ou d&rsquo;op\u00e9rations d&rsquo;affichage tabulaire. Pour r\u00e9tablir une s\u00e9quence ordonn\u00e9e continue d\u00e9butant de 1 jusqu&rsquo;au nouveau nombre de lignes sans perturber les pointeurs internes, la convention idiomatique en vigueur dans le langage R consiste \u00e0 r\u00e9initialiser explicitement les attributs de noms de lignes en leur assignant la valeur nulle via la commande : <em>row.names(df_complet) &lt;- NULL<\/em>. Cette instruction force l&rsquo;interpr\u00e9teur \u00e0 r\u00e9g\u00e9n\u00e9rer une num\u00e9rotation s\u00e9quentielle standardis\u00e9e conforme aux sp\u00e9cifications canoniques des structures matricielles.<\/p>\n<h3>3.2 Utilisation de la fonction na.omit() et ses sp\u00e9cificit\u00e9s d&rsquo;attributs<\/h3>\n<p>Parall\u00e8lement \u00e0 l&#8217;emploi explicite de <em>complete.cases()<\/em>, le socle natif de R fournit une fonction g\u00e9n\u00e9rique de tr\u00e8s haut niveau sp\u00e9cifiquement d\u00e9volue \u00e0 l&rsquo;\u00e9viction par liste : <em>na.omit()<\/em>. En soumettant le tableau exp\u00e9rimental \u00e0 l&rsquo;\u00e9valuation <em>df_omit &lt;- na.omit(df)<\/em>, l&rsquo;interpr\u00e9teur effectue un filtrage dont le r\u00e9sultat g\u00e9om\u00e9trique imm\u00e9diat s&rsquo;av\u00e8re parfaitement superposable \u00e0 celui obtenu par l&rsquo;indexation matricielle pr\u00e9c\u00e9dente. Seules les lignes 1 et 6 subsistent au sein de l&rsquo;espace tabulaire observable. Cependant, l&rsquo;examen attentif des m\u00e9tadonn\u00e9es internes de l&rsquo;objet \u00e0 l&rsquo;aide de la fonction d&rsquo;inspection <em>attributes(df_omit)<\/em> met en lumi\u00e8re une diff\u00e9renciation structurelle cruciale qui distingue fondamentalement <em>na.omit()<\/em> des simples proc\u00e9dures de sous-ensemblement vectoriel.<\/p>\n<p>L&rsquo;ex\u00e9cution de <em>na.omit()<\/em> ne se contente pas d&rsquo;\u00e9laguer les observations lacunaires ; elle greffe formellement sur le tableau r\u00e9sultant un attribut syst\u00e8me nomm\u00e9 <em>na.action<\/em>, dot\u00e9 de la classe sp\u00e9cialis\u00e9e <em>omit<\/em>. Cet attribut conserve sous la forme d&rsquo;un vecteur d&rsquo;entiers indic\u00e9s l&rsquo;ensemble exact des coordonn\u00e9es de lignes qui ont \u00e9t\u00e9 expurg\u00e9es lors de la phase de nettoyage (dans notre cas, les lignes 2, 3, 4, 5 et 7), tout en consignant leurs \u00e9tiquettes d&rsquo;origine. La vocation de cette surcharge de m\u00e9tadonn\u00e9es est \u00e9minemment fonctionnelle au sein de l&rsquo;\u00e9cosyst\u00e8me de mod\u00e9lisation statistique de R. Lorsque des fonctions d&rsquo;estimation comme <em>lm()<\/em> ou <em>glm()<\/em> exploitent des formules symboliques appliqu\u00e9es \u00e0 des donn\u00e9es partiellement manquantes, le moteur algorithmique recourt en interne \u00e0 <em>na.omit()<\/em> et utilise l&rsquo;attribut <em>na.action<\/em> afin de recalculer dynamiquement la taille exacte des r\u00e9sidus, de restaurer les pr\u00e9dictions align\u00e9es sur la dimension originelle du jeu de donn\u00e9es via <em>napredict()<\/em>, ou d&rsquo;ajuster les degr\u00e9s de libert\u00e9 r\u00e9siduels lors de l&rsquo;\u00e9tablissement des tables de variance.<\/p>\n<p>N\u00e9anmoins, la persistance de cet attribut peut s&rsquo;av\u00e9rer probl\u00e9matique lorsque l&rsquo;analyste souhaite exporter un tableau rigoureusement purifi\u00e9 vers des biblioth\u00e8ques externes ou des bases de donn\u00e9es relationnelles qui interpr\u00e8tent mal ces m\u00e9tadonn\u00e9es sp\u00e9cialis\u00e9es. De surcro\u00eet, certains algorithmes de calcul matriciel direct peuvent lever des avertissements ou modifier leur comportement d&rsquo;inf\u00e9rence en pr\u00e9sence d&rsquo;une classe <em>omit<\/em> non d\u00e9sir\u00e9e. D\u00e8s lors, lorsque la puret\u00e9 vectorielle absolue est requise, il devient n\u00e9cessaire de neutraliser manuellement cette charge d&rsquo;attributs en r\u00e9initialisant le champ d\u00e9di\u00e9 par l&rsquo;affectation explicite : <em>attr(df_omit, \u00ab\u00a0na.action\u00a0\u00bb) &lt;- NULL<\/em>. Cette op\u00e9ration d\u00e9choit l&rsquo;objet de ses propri\u00e9t\u00e9s sp\u00e9cifiques de mod\u00e9lisation pour le ramener au rang de simple structure de donn\u00e9es matricielle d\u00e9pourvue de toute r\u00e9manence de son \u00e9tat d&rsquo;incompl\u00e9tude ant\u00e9rieur.<\/p>\n<h3>3.3 Combinaison logique avec is.na() et rowSums()<\/h3>\n<p>Une troisi\u00e8me strat\u00e9gie computationnelle au sein du socle <em>Base R<\/em> consiste \u00e0 exploiter conjointement la fonction matricielle <em>is.na()<\/em> et l&rsquo;op\u00e9rateur d&rsquo;agr\u00e9gation horizontal <em>rowSums()<\/em> pour \u00e9laborer un pr\u00e9dicat de filtrage arithm\u00e9tique. Cette d\u00e9marche repose sur une traduction purement math\u00e9matique du crit\u00e8re de compl\u00e9tude : une unit\u00e9 statistique est r\u00e9put\u00e9e exhaustive si et seulement si la somme de ses \u00e9l\u00e9ments manquants est strictement \u00e9gale \u00e0 z\u00e9ro. La syntaxe op\u00e9rationnelle s&rsquo;articule autour de l&rsquo;instruction d&rsquo;indexation : <em>df_sum_clean &lt;- df[rowSums(is.na(df)) == 0, ]<\/em>. \u00c0 l&rsquo;inverse, l&rsquo;expression compl\u00e9mentaire <em>rowSums(is.na(df)) &gt; 0<\/em> permet d&rsquo;isoler avec une pr\u00e9cision absolue la cohorte des observations d\u00e9t\u00e9rior\u00e9es en vue d&rsquo;audits statistiques d&rsquo;attrition.<\/p>\n<p>Cette m\u00e9thodologie matricielle pr\u00e9sente un avantage substantiel sur le plan computationnel lorsqu&rsquo;elle est confront\u00e9e \u00e0 de vastes structures homog\u00e8nes. Alors que les fonctions g\u00e9n\u00e9riques comme <em>na.omit()<\/em> invoquent des routines d&rsquo;inspection d&rsquo;attributs et des v\u00e9rifications de classes d&rsquo;objets au niveau S3 qui induisent une surcharge temporelle (<em>overhead<\/em>) non n\u00e9gligeable lors d&rsquo;appels r\u00e9currents, l&rsquo;encha\u00eenement <em>rowSums(is.na())<\/em> op\u00e8re directement au moyen de boucles compil\u00e9es en langage C hautement optimis\u00e9es pour le calcul vectoriel. La transformation pr\u00e9alable de donn\u00e9es en matrices num\u00e9riques pures permet d&rsquo;acc\u00e9l\u00e9rer drastiquement les cadences d&rsquo;ex\u00e9cution sur des millions d&rsquo;it\u00e9rations, surpassant r\u00e9guli\u00e8rement les m\u00e9thodes de filtrage g\u00e9n\u00e9riques en termes de consommation brute de cycles processeur.<\/p>\n<p>De surcro\u00eet, cette approche arithm\u00e9tique s&rsquo;applique de mani\u00e8re native aux matrices math\u00e9matiques r\u00e9guli\u00e8res (de classe <em>matrix<\/em>) sans exiger leur conversion pr\u00e9alable vers la classe plus lourde et plus complexe de <em>data.frame<\/em>. L&rsquo;alg\u00e8bre matricielle sous R interdisant la disparit\u00e9 des types, l&rsquo;ex\u00e9cution directe de <em>complete.cases()<\/em> ou de combinaisons matricielles arithm\u00e9tiques garantit la pr\u00e9servation stricte de la m\u00e9moire vectorielle contigu\u00eb allou\u00e9e par le syst\u00e8me. Cette sp\u00e9cificit\u00e9 technique s&rsquo;av\u00e8re particuli\u00e8rement d\u00e9terminante lors de calculs d&rsquo;alg\u00e8bre lin\u00e9aire haute dimension, tels que la diagonalisation de matrices de dispersion ou la d\u00e9composition en valeurs singuli\u00e8res, o\u00f9 la moindre instanciation superflue de m\u00e9tadonn\u00e9es de data frame d\u00e9grade consid\u00e9rablement les performances de la m\u00e9moire vive.<\/p>\n<h2>4. Suppression des lignes enti\u00e8rement compos\u00e9es de valeurs NA via Base R<\/h2>\n<h3>4.1 Identification math\u00e9matique des lignes compl\u00e8tement vides<\/h3>\n<p>L&rsquo;amputation de donn\u00e9es enti\u00e8rement absentes rel\u00e8ve d&rsquo;une logique m\u00e9thodologique radicalement distincte de celle qui sous-tend la suppression par liste. Dans de multiples architectures d&rsquo;int\u00e9gration de donn\u00e9es, des lignes d&rsquo;une vacuit\u00e9 absolue s&rsquo;ins\u00e8rent subrepticieusement dans les tables \u00e0 la suite d&rsquo;erreurs d&rsquo;incr\u00e9mentation de compteurs SQL, d&rsquo;anomalies de parsing de fichiers d\u00e9limit\u00e9s par des virgules (CSV) comportant des retours \u00e0 la ligne superflus, ou de fusions relationnelles externes non concordantes. Conserver de telles entit\u00e9s pollue inutilement la structure de donn\u00e9es ; \u00e0 l&rsquo;inverse, \u00e9liminer les lignes incompl\u00e8tes qui poss\u00e8dent n\u00e9anmoins des fragments d&rsquo;information exploitables constitue un gaspillage analytique souvent intol\u00e9rable. D\u00e8s lors, l&rsquo;objectif algorithmique consiste \u00e0 purger exclusivement les lignes dont l&rsquo;int\u00e9gralit\u00e9 des dimensions correspond \u00e0 des valeurs manquantes, tout en sanctuarisant les observations partiellement compl\u00e9t\u00e9es.<\/p>\n<p>Sur le plan math\u00e9matique formel, une ligne indic\u00e9e <em>i<\/em> d&rsquo;un tableau comportant <em>P<\/em> colonnes est d\u00e9clar\u00e9e int\u00e9gralement vide si et seulement si la somme de ses \u00e9l\u00e9ments manquants est rigoureusement \u00e9gale \u00e0 <em>P<\/em>, ce qui s&rsquo;exprime par la condition logique : <em>rowSums(is.na(df)) == ncol(df)<\/em>. Pour conserver toutes les observations pr\u00e9sentant un contenu informatif au moins minimal, il convient d&rsquo;inverser ce pr\u00e9dicat par n\u00e9gation logique ou par l&rsquo;expression de la stricte inf\u00e9riorit\u00e9 arithm\u00e9tique : la somme des <em>NA<\/em> horizontaux doit demeurer strictement inf\u00e9rieure au nombre total de colonnes disponibles dans le r\u00e9f\u00e9rentiel d&rsquo;analyse. L&rsquo;impl\u00e9mentation op\u00e9rationnelle sous Base R s&rsquo;\u00e9nonce selon la syntaxe suivante :<\/p>\n<p><em>df_non_vides &lt;- df[rowSums(is.na(df)) &lt; ncol(df), ]<\/em><\/p>\n<p>Appliqu\u00e9 \u00e0 notre tableau exp\u00e9rimental de sept observations, ce filtre \u00e9limine de fa\u00e7on chirurgicale la cinqui\u00e8me ligne, qui constituait l&rsquo;unique cas de vacuit\u00e9 absolue (points, passes et rebonds \u00e9tant tous simultan\u00e9ment fix\u00e9s \u00e0 <em>NA<\/em>). Les observations 2, 3, 4 et 7, qui pr\u00e9sentent toutes un \u00e0 deux champs manquants mais conservent au moins une valeur num\u00e9rique r\u00e9elle et valide, sont scrupuleusement maintenues au sein du jeu de donn\u00e9es, au m\u00eame titre que les observations parfaites 1 et 6. La dimension finale de l&rsquo;objet s&rsquo;\u00e9tablit exactement \u00e0 6 lignes, accomplissant ainsi l&rsquo;assainissement structural sans perte d&rsquo;information partielle.<\/p>\n<h3>4.2 Application de la fonction apply() avec des pr\u00e9dicats personnalis\u00e9s<\/h3>\n<p>Une d\u00e9marche alternative pour discriminer et \u00e9liminer les vecteurs d&rsquo;observation totalement vides consiste \u00e0 utiliser la fonction d&rsquo;ordre sup\u00e9rieur <em>apply()<\/em>, con\u00e7ue pour it\u00e9rer des fonctions personnalis\u00e9es le long des marges d&rsquo;une structure matricielle ou d&rsquo;un tableau de donn\u00e9es. Pour scruter horizontalement le tableau, l&rsquo;analyste sp\u00e9cifie la marge 1 (repr\u00e9sentant la dimension des lignes) et transmet une fonction anonyme charg\u00e9e de d\u00e9terminer si l&rsquo;int\u00e9gralit\u00e9 des \u00e9l\u00e9ments du vecteur d&rsquo;observation satisfait au pr\u00e9dicat de vacuit\u00e9. L&rsquo;instruction s&rsquo;articule comme suit :<\/p>\n<p><em>df_filtre_apply &lt;- df[!apply(df, 1, function(x) all(is.na(x))), ]<\/em><\/p>\n<p>Dans cette formulation, l&rsquo;op\u00e9rateur d&rsquo;agr\u00e9gation logique <em>all()<\/em> analyse le vecteur bool\u00e9en renvoy\u00e9 par <em>is.na(x)<\/em> pour chaque ligne successive. Si chaque coordonn\u00e9e sans exception prend la valeur <em>TRUE<\/em>, la fonction renvoie <em>TRUE<\/em> pour l&rsquo;observation globale. L&rsquo;application de l&rsquo;op\u00e9rateur de n\u00e9gation logique unitaire point d&rsquo;exclamation (<em>!<\/em>) en amont de la commande inverse l&rsquo;\u00e9valuation bool\u00e9enne, assurant ainsi l&rsquo;extraction s\u00e9lective des seules lignes ne v\u00e9rifiant pas cette condition de vacuit\u00e9 exhaustive. Le r\u00e9sultat empirique est strictement \u00e9quivalent \u00e0 celui g\u00e9n\u00e9r\u00e9 par l&rsquo;in\u00e9quation sur <em>rowSums()<\/em>, la ligne 5 \u00e9tant syst\u00e9matiquement \u00e9cart\u00e9e.<\/p>\n<p>Cependant, sur le plan de l&rsquo;architecture logicielle et de l&rsquo;efficience algorithmique, le recours \u00e0 la fonction <em>apply()<\/em> pour cette t\u00e2che pr\u00e9cise comporte des limitations s\u00e9v\u00e8res qu&rsquo;un analyste rigoureux doit imp\u00e9rativement appr\u00e9hender. Premi\u00e8rement, <em>apply()<\/em> convertit implicitement le <em>data.frame<\/em> d&rsquo;entr\u00e9e en une matrice classique avant d&rsquo;entamer l&rsquo;it\u00e9ration. Si le tableau d&rsquo;origine h\u00e9berge des variables de classes h\u00e9t\u00e9rog\u00e8nes (combinant par exemple des valeurs num\u00e9riques, des dates, des cha\u00eenes textuelles et des facteurs cat\u00e9goriels), cette coercition force l&rsquo;ensemble des \u00e9l\u00e9ments \u00e0 s&rsquo;aligner sur le type le plus g\u00e9n\u00e9ral \u2014 le plus souvent la cha\u00eene de caract\u00e8res (<em>character<\/em>) \u2014, ce qui g\u00e9n\u00e8re une allocation m\u00e9moire massive et totalement redondante. Deuxi\u00e8mement, l&rsquo;it\u00e9ration marginale de <em>apply()<\/em> n&rsquo;exploite pas la vectorisation interne compil\u00e9e en C mais proc\u00e8de par une boucle interpr\u00e9t\u00e9e au niveau de l&rsquo;environnement R. Sur des corpus exc\u00e9dant plusieurs centaines de milliers d&rsquo;enregistrements, cette m\u00e9thode engendre un effondrement dramatique des performances temporelles par rapport \u00e0 l&rsquo;approche purement vectoris\u00e9e de <em>rowSums(is.na(df)) &lt; ncol(df)<\/em>, qui doit toujours lui \u00eatre pr\u00e9f\u00e9r\u00e9e en contexte de production.<\/p>\n<h2>5. Filtrage conditionnel ciblant des colonnes sp\u00e9cifiques avec Base R<\/h2>\n<h3>5.1 Suppression bas\u00e9e sur une colonne critique unique<\/h3>\n<p>Dans une pluralit\u00e9 de protocoles de recherche appliqu\u00e9e, l&rsquo;exigence d&rsquo;exhaustivit\u00e9 ne s&rsquo;\u00e9tend pas uniform\u00e9ment \u00e0 l&rsquo;ensemble du faisceau de variables mesur\u00e9es, mais se focalise de mani\u00e8re prioritaire sur un attribut pivot qui conditionne la faisabilit\u00e9 m\u00eame de l&rsquo;inf\u00e9rence. Ce cas de figure se mat\u00e9rialise typiquement lorsqu&rsquo;une variable d\u00e9pendante (ou crit\u00e8re de r\u00e9ponse principal) doit \u00eatre imp\u00e9rativement renseign\u00e9e pour tester l&rsquo;effet d&rsquo;un traitement dans un essai contr\u00f4l\u00e9, tandis que certaines covariables secondaires peuvent tol\u00e9rer des lacunes temporaires ou faire l&rsquo;objet de proc\u00e9dures de contr\u00f4le ult\u00e9rieures. En pareille circonstance, l&rsquo;\u00e9lagage indiscrimin\u00e9 de toutes les lignes incompl\u00e8tes s&rsquo;av\u00e8re m\u00e9thodologiquement fautif : l&rsquo;intervention d&rsquo;assainissement doit cibler chirurgicalement la colonne indispensable en ignorant souverainement le statut d&rsquo;incompl\u00e9tude des autres champs.<\/p>\n<p>L&rsquo;impl\u00e9mentation de ce filtrage s\u00e9lectif au sein de l&rsquo;environnement <em>Base R<\/em> s&rsquo;op\u00e8re par l&rsquo;extraction vectorielle directe combin\u00e9e au test de vacuit\u00e9 unaire <em>!is.na()<\/em>. Si nous postulons, dans le cadre de notre jeu de donn\u00e9es exp\u00e9rimental, que la colonne <em>points<\/em> constitue l&rsquo;indicateur d&rsquo;\u00e9valuation fondamental, la commande d&rsquo;extraction s&rsquo;\u00e9nonce comme suit :<\/p>\n<p><em>df_points_valides &lt;- df[!is.na(df$points), ]<\/em><\/p>\n<p>Cette syntaxe isole le vecteur atomique des points via l&rsquo;op\u00e9rateur dollar, en \u00e9value la validit\u00e9 \u00e9l\u00e9ment par \u00e9l\u00e9ment, et injecte le vecteur logique r\u00e9sultant au niveau de l&rsquo;indice de ligne des crochets d&rsquo;indexation. Lors de l&rsquo;\u00e9valuation, les observations 4 et 7 \u2014 qui affichent formellement la constante <em>NA<\/em> sur leur variable de points \u2014 sont imm\u00e9diatement purg\u00e9es du tableau, tout comme la ligne 5 dont l&rsquo;int\u00e9gralit\u00e9 des champs \u00e9tait vide. En revanche, les observations 2 et 3, bien que porteuses de donn\u00e9es manquantes sur les passes d\u00e9cisives et les rebonds, sont strictement conserv\u00e9es puisque leur score de points est parfaitement document\u00e9 (respectivement 20 et 15). Le tableau final stabilise son effectif \u00e0 4 observations valides.<\/p>\n<p>Il importe de souligner les pr\u00e9cautions m\u00e9thodologiques relatives aux types sous-jacents de la colonne de r\u00e9f\u00e9rence. Si la variable cible est de classe textuelle (<em>character<\/em>) ou factorielle (<em>factor<\/em>), des artefacts de saisie de donn\u00e9es peuvent introduire des cha\u00eenes de caract\u00e8res vides sans caract\u00e8res (<em>\u00ab\u00a0\u00a0\u00bb<\/em>) ou de simples espaces d&rsquo;espacement (<em>\u00a0\u00bb \u00ab\u00a0<\/em>). Pour le moteur R, ces s\u00e9quences textuelles constituent des cha\u00eenes parfaitement valides et non des objets logiques <em>NA<\/em>. Par cons\u00e9quent, l&rsquo;instruction <em>!is.na()<\/em> \u00e9valuera ces cellules comme <em>TRUE<\/em>, maintenant ainsi au sein du corpus des observations pourtant factuellement d\u00e9nu\u00e9es de signification. Un nettoyage pr\u00e9liminaire harmonisant les cha\u00eenes vides sous la forme explicite de <em>NA<\/em> s&rsquo;impose donc syst\u00e9matiquement avant d&rsquo;invoquer ce filtre univari\u00e9.<\/p>\n<h3>5.2 Filtrage multicrit\u00e8re sur un sous-ensemble de variables<\/h3>\n<p>L&rsquo;analyse statistique contemporaine exige fr\u00e9quemment de conditionner l&rsquo;inclusion des observations \u00e0 la compl\u00e9tude simultan\u00e9e d&rsquo;un sous-groupe pr\u00e9d\u00e9termin\u00e9 de descripteurs, par exemple un couple indissociable compos\u00e9 d&rsquo;une variable ind\u00e9pendante et d&rsquo;un mod\u00e9rateur th\u00e9orique, tout en autorisant des absences de mesure sur les variables exploratoires p\u00e9riph\u00e9riques. Pour circonscrire le filtrage \u00e0 une s\u00e9lection arbitraire de colonnes au sein du socle <em>Base R<\/em>, l&rsquo;analyste dispose de deux approches fondamentales : l&#8217;emploi restreint de la primitive <em>complete.cases()<\/em> ou la combinaison matricielle d&rsquo;op\u00e9rateurs bool\u00e9ens logiques \u00e9l\u00e9mentaires.<\/p>\n<p>La premi\u00e8re strat\u00e9gie tire parti de la flexibilit\u00e9 de la fonction <em>complete.cases()<\/em>, laquelle accepte en argument des sous-ensembles projet\u00e9s de donn\u00e9es. Ainsi, si notre mod\u00e8le analytique n\u00e9cessite imp\u00e9rativement la pr\u00e9sence simultan\u00e9e des mesures de points et de passes d\u00e9cisives, mais peut s&rsquo;accommoder de l&rsquo;absence intermittente des rebonds, la commande d&rsquo;extraction s&rsquo;\u00e9labore en ciblant explicitement ces deux vecteurs dans l&rsquo;argument de la primitive :<\/p>\n<p><em>df_sous_ensemble &lt;- df[complete.cases(df[, c(\u00ab\u00a0points\u00a0\u00bb, \u00ab\u00a0assists\u00a0\u00bb)]), ]<\/em><\/p>\n<p>Sous cette instruction, l&rsquo;interpr\u00e9teur extrait une vue matricielle virtuelle restreinte aux deux colonnes mentionn\u00e9es, \u00e9value l&rsquo;exhaustivit\u00e9 horizontale exclusive de ce bin\u00f4me, et applique le filtre logique r\u00e9sultant au tableau ma\u00eetre. D\u00e8s lors, l&rsquo;observation 3 \u2014 qui pr\u00e9sentait une valeur <em>NA<\/em> sur la variable <em>rebounds<\/em> \u2014 survit pleinement au processus de s\u00e9lection, car ses composantes <em>points<\/em> (15) et <em>assists<\/em> (7) sont irr\u00e9prochables. \u00c0 l&rsquo;inverse, l&rsquo;observation 2 est impitoyablement \u00e9vinc\u00e9e en raison de la carence mesur\u00e9e sur son attribut de passes d\u00e9cisives, tout comme les lignes 4, 5 et 7 qui d\u00e9faillent sur l&rsquo;un ou l&rsquo;autre des attributs cardinaux.<\/p>\n<p>La seconde approche repose sur la composition explicite des pr\u00e9dicats logiques \u00e0 l&rsquo;aide de l&rsquo;op\u00e9rateur unaire <strong>ET<\/strong> vectoriel (symbolis\u00e9 par l&rsquo;esperluette <em>&amp;<\/em>) ou de l&rsquo;op\u00e9rateur unaire <strong>OU<\/strong> vectoriel (repr\u00e9sent\u00e9 par la barre verticale <em>|<\/em>). Ainsi, l&rsquo;instruction <em>df[!is.na(df<span class=\"arabpsy-math-inline\" data-latex=\"points) &amp;a\\mp; !is.na(df\">$points) &#038;a\\mp; !is.na(df$<\/span>assists), ]<\/em> aboutit \u00e0 un r\u00e9sultat strictement identique \u00e0 la commande pr\u00e9c\u00e9dente. Cependant, la syntaxe bool\u00e9enne offre une libert\u00e9 combinatoire sup\u00e9rieure en autorisant des topologies de filtrage disjonctives. Par exemple, si l&rsquo;on souhaite retenir les athl\u00e8tes ayant valid\u00e9 au moins leur \u00e9valuation aux points OU leur \u00e9valuation aux passes, la syntaxe <em>df[!is.na(df<span class=\"arabpsy-math-inline\" data-latex=\"points) | !is.na(df\">$points) | !is.na(df$<\/span>assists), ]<\/em> s&rsquo;impose imm\u00e9diatement avec une lisibilit\u00e9 conceptuelle directe, pr\u00e9servant ainsi les observations 2 et 4 qui auraient \u00e9t\u00e9 irr\u00e9m\u00e9diablement perdues sous un r\u00e9gime d&rsquo;intersection stricte.<\/p>\n<h3>5.3 Algorithme de suppression bas\u00e9 sur un seuil de tol\u00e9rance de NA<\/h3>\n<p>Dans les disciplines quantitatives exploitant des batteries de tests composites ou des inventaires psychom\u00e9triques comptant des dizaines, voire des centaines d&rsquo;items scalaires, l&rsquo;application d&rsquo;une suppression stricte par liste est susceptible d&rsquo;an\u00e9antir jusqu&rsquo;\u00e0 80 % d&rsquo;une cohorte exp\u00e9rimentale sans justification statistique r\u00e9elle. Pour endiguer cette \u00e9vaporation massive de puissance m\u00e9thodologique, les chercheurs appliquent usuellement la \u00ab r\u00e8gle empirique des 20 % \u00bb (ou seuil de tol\u00e9rance proportionnel). Ce paradigme stipule qu&rsquo;une observation individuelle est consid\u00e9r\u00e9e comme analytiquement recevable si la proportion de ses valeurs non renseign\u00e9es n&rsquo;exc\u00e8de pas un plafond critique pr\u00e9d\u00e9fini (usuellement situ\u00e9 entre 10 % et 20 % des variables totales), rendant ainsi licite une imputation stochastique ult\u00e9rieure des quelques cellules manquantes.<\/p>\n<p>La transcription algorithmique de cette r\u00e8gle d\u00e9cisionnelle au sein de <em>Base R<\/em> s&rsquo;appuie sur la manipulation conjointe de <em>rowSums()<\/em> et du nombre total de colonnes <em>ncol()<\/em> du jeu d&rsquo;observations. L&rsquo;analyste fixe formellement un param\u00e8tre de tol\u00e9rance proportionnel, not\u00e9 par exemple <em>alpha<\/em>. Le nombre maximal d&rsquo;omissions autoris\u00e9es par ligne pour un participant donn\u00e9 s&rsquo;\u00e9tablit alors math\u00e9matiquement par l&rsquo;arrondi inf\u00e9rieur du produit : <em>seuil_k &lt;- floor(alpha * ncol(df))<\/em>. La condition de r\u00e9tention de l&rsquo;observation se formalise sous la r\u00e8gle d&rsquo;in\u00e9quation vectorielle suivante :<\/p>\n<p><em>df_toler\u00e9 &lt;- df[rowSums(is.na(df)) &lt;= seuil_k, ]<\/em><\/p>\n<p>Illustrons cette m\u00e9thodologie sur notre matrice de d\u00e9monstration en d\u00e9finissant un seuil de tol\u00e9rance de non-r\u00e9ponse maximal fix\u00e9 \u00e0 une seule variable lacunaire admise par sujet (ce qui correspond \u00e0 <em>seuil_k &lt;- 1<\/em> pour un total de 3 variables). L&rsquo;\u00e9valuation de l&rsquo;instruction d&rsquo;indexation conserve les observations 1 et 6 (qui affichent 0 NA), mais admet \u00e9galement les observations 2, 3 et 7 qui ne comportent chacune qu&rsquo;une seule mesure d\u00e9faillante. Seules les lignes 4 (qui cumule 2 NA) et 5 (qui culmine \u00e0 3 NA) se trouvent sanctionn\u00e9es par le filtre et \u00e9vinc\u00e9es de la cohorte r\u00e9sultante.<\/p>\n<p>Cette approche gradu\u00e9e concilie rigueur math\u00e9matique et pragmatisme exp\u00e9rimental : elle purge sans concession les unit\u00e9s statistiques excessivement d\u00e9grad\u00e9es dont la reconstitution requerrait des extrapolations num\u00e9riques injustifiables, tout en sauvegardant la vaste majorit\u00e9 des participants mod\u00e9r\u00e9ment document\u00e9s. La puissance statistique globale des tests ult\u00e9rieurs s&rsquo;en trouve puissamment consolid\u00e9e, tout en circonscrivant drastiquement les risques de distorsion li\u00e9s \u00e0 l&rsquo;amputation aveugle d&rsquo;unit\u00e9s partiellement informatives.<\/p>\n<h2>6. Approche moderne avec le package tidyr et la fonction drop_na()<\/h2>\n<h3>6.1 Introduction \u00e0 l&rsquo;\u00e9cosyst\u00e8me Tidyverse et syntaxe de base de drop_na()<\/h3>\n<p>L&rsquo;av\u00e8nement de l&rsquo;\u00e9cosyst\u00e8me <a rel=\"noopener noreferrer\" href=\"https:\/\/www.tidyverse.org\/\">Tidyverse<\/a>, initi\u00e9 par les travaux conceptuels de Hadley Wickham, a profond\u00e9ment refondu les paradigmes de structuration et de transformation des donn\u00e9es au sein de la communaut\u00e9 R. Fond\u00e9 sur le manifeste des \u00ab donn\u00e9es ordonn\u00e9es \u00bb (<em>Tidy Data<\/em>), ce m\u00e9tapackage impose des r\u00e8gles strictes de coh\u00e9rence formelle : chaque variable doit occuper une colonne d\u00e9di\u00e9e, chaque unit\u00e9 d&rsquo;observation doit correspondre \u00e0 une ligne unique, et chaque valeur scalaire doit loger dans une cellule individualis\u00e9e. Dans ce cadre programmatique standardis\u00e9, le package sp\u00e9cialis\u00e9 <em>tidyr<\/em> introduit la fonction <em>drop_na()<\/em>, express\u00e9ment con\u00e7ue pour ex\u00e9cuter la suppression des lignes incompl\u00e8tes avec une expressivit\u00e9 d\u00e9clarative qui transcende les syntaxes d&rsquo;indexation matricielle cryptiques de l&rsquo;environnement originel.<\/p>\n<p>La syntaxe fondamentale de la fonction s&rsquo;ex\u00e9cute de mani\u00e8re limpide en fournissant simplement le tableau de donn\u00e9es en premier argument : <em>df_propre &lt;- drop_na(df)<\/em>. Lorsqu&rsquo;elle est invoqu\u00e9e sans sp\u00e9cification de colonnes secondaires, la fonction <em>drop_na()<\/em> applique de mani\u00e8re sous-jacente un algorithme rigoureusement \u00e9quivalent \u00e0 la suppression compl\u00e8te par liste de <em>na.omit()<\/em>, en purgeant toute observation abritant au minimum une valeur <em>NA<\/em>. Toutefois, la v\u00e9ritable force architecturale de <em>drop_na()<\/em> r\u00e9side dans son interfa\u00e7age natif avec l&rsquo;op\u00e9rateur de cha\u00eenage s\u00e9quentiel, qu&rsquo;il s&rsquo;agisse de l&rsquo;op\u00e9rateur historique <em>%&gt;%<\/em> du package <em>magrittr<\/em> ou du nouvel op\u00e9rateur pipe natif <em>|&gt;<\/em> int\u00e9gr\u00e9 au c\u0153ur de R depuis sa version 4.1.0.<\/p>\n<p>Gr\u00e2ce \u00e0 cette composabilit\u00e9, l&rsquo;\u00e9limination des valeurs manquantes s&rsquo;ins\u00e8re harmonieusement au sein d&rsquo;un pipeline continu de transformation de donn\u00e9es :<\/p>\n<p><em>df_pipe &lt;- df |&gt; drop_na()<\/em><\/p>\n<p>Cette \u00e9criture \u00e9limine le recours syst\u00e9matique aux variables interm\u00e9diaires \u00e9ph\u00e9m\u00e8res et supprime les imbrications complexes d&rsquo;appels de fonctions qui caract\u00e9risaient le code Base R traditionnel. L&rsquo;analyste lit la s\u00e9quence d&rsquo;instructions de gauche \u00e0 droite et de haut en bas, en suivant le flux de traitement s\u00e9quentiel appliqu\u00e9 au corpus empirique. En outre, contrairement \u00e0 <em>na.omit()<\/em> qui encombre l&rsquo;objet de m\u00e9tadonn\u00e9es d&rsquo;attributs via la classe <em>na.action<\/em>, <em>drop_na()<\/em> d\u00e9livre un objet structurellement purifi\u00e9, sans surcharges r\u00e9siduelles cach\u00e9es, garantissant une compatibilit\u00e9 imm\u00e9diate avec les pipelines graphiques de <em>ggplot2<\/em> ou les architectures de mod\u00e9lisation de <em>tidymodels<\/em>.<\/p>\n<h3>6.2 Ciblage pr\u00e9cis des variables avec la grammaire Tidyselect<\/h3>\n<p>L&rsquo;avantage op\u00e9rationnel le plus d\u00e9terminant de la fonction <em>drop_na()<\/em> r\u00e9side dans sa fusion native avec le moteur de s\u00e9lection lexicale <em>tidyselect<\/em>. Cette int\u00e9gration conf\u00e8re \u00e0 l&rsquo;utilisateur la capacit\u00e9 d&rsquo;\u00e9noncer des r\u00e8gles de suppression cibl\u00e9es sur des variables sp\u00e9cifiques sans jamais devoir recourir \u00e0 l&rsquo;encadrement des noms par des guillemets syntaxiques ni manipuler des indices num\u00e9riques obscurs. L&rsquo;appel conditionnel s&rsquo;ex\u00e9cute en mentionnant directement les identifiants non cit\u00e9s (<em>unquoted variable names<\/em>) au sein de la fonction, comme l&rsquo;illustre l&rsquo;instruction suivante destin\u00e9e \u00e0 purger exclusivement les unit\u00e9s d\u00e9faillantes sur les rebonds :<\/p>\n<p><em>df_cible &lt;- df |&gt; drop_na(rebounds)<\/em><\/p>\n<p>Si l&rsquo;analyste requiert la compl\u00e9tude absolue sur un ensemble conjoint de variables explicatives, il lui suffit d&rsquo;\u00e9num\u00e9rer les champs cibles s\u00e9par\u00e9s par des virgules dans l&rsquo;appel unifi\u00e9 : <em>df |&gt; drop_na(points, assists)<\/em>. Cette simplicit\u00e9 d&rsquo;\u00e9criture d\u00e9samorce les risques d&rsquo;erreurs typographiques fr\u00e9quents lors de l&rsquo;assemblage manuel d&rsquo;op\u00e9rateurs bool\u00e9ens complexes sous Base R. De surcro\u00eet, <em>drop_na()<\/em> tire pleinement parti de toute la panoplie des s\u00e9lecteurs contextuels avanc\u00e9s offerts par <em>tidyselect<\/em>, tels que <em>starts_with()<\/em>, <em>ends_with()<\/em>, <em>contains()<\/em>, ou encore <em>matches()<\/em>.<\/p>\n<p>Dans le domaine des sciences comportementales, o\u00f9 les protocoles d&rsquo;enqu\u00eate mobilisent des matrices dimensionnelles volumineuses int\u00e9grant par exemple des \u00e9chelles de personnalit\u00e9 de type Big Five r\u00e9parties sur des dizaines d&rsquo;items pr\u00e9fix\u00e9s (e.g., <em>extraversion_1<\/em>, <em>extraversion_2<\/em>, etc.), l&rsquo;analyste peut d\u00e9cr\u00e9ter l&rsquo;\u00e9viction s\u00e9lective des participants ayant omis de r\u00e9pondre \u00e0 ces dimensions sp\u00e9cifiques par une commande d&rsquo;une concision exemplaire :<\/p>\n<p><em>df_personnalite &lt;- df_enquete |&gt; drop_na(starts_with(\u00ab\u00a0extraversion_\u00a0\u00bb))<\/em><\/p>\n<p>Cette flexibilit\u00e9 lexicale s&rsquo;\u00e9tend \u00e9galement \u00e0 la n\u00e9gation logique gr\u00e2ce \u00e0 l&rsquo;op\u00e9rateur unaire d&rsquo;exclusion (<em>!<\/em>), autorisant par exemple l&rsquo;expurgation des donn\u00e9es manquantes sur l&rsquo;ensemble du corpus \u00e0 l&rsquo;exception explicite d&rsquo;une variable sociod\u00e9mographique p\u00e9riph\u00e9rique hautement incompl\u00e8te : <em>df |&gt; drop_na(!revenu_annuel)<\/em>. Cette expressivit\u00e9 transforme la t\u00e2che jadis fastidieuse du filtrage conditionnel en un acte d&rsquo;\u00e9criture programmatique d\u00e9claratif, \u00e9l\u00e9gant et autosuffisant.<\/p>\n<h3>6.3 Comportement de drop_na() avec les tibbles et data frames group\u00e9s<\/h3>\n<p>Lors de la manipulation de structures tabulaires avanc\u00e9es au sein du Tidyverse, les objets rev\u00eatent fr\u00e9quemment la classe sp\u00e9cialis\u00e9e <em>tibble<\/em> (une modernisation conceptuelle du <em>data.frame<\/em> natif qui supprime les coercitions implicites de cha\u00eenes en facteurs et am\u00e9liore le rendu d&rsquo;affichage console) et font l&rsquo;objet d&rsquo;op\u00e9rations de partitionnement s\u00e9mantique via la commande <em>group_by()<\/em> du package <em>dplyr<\/em>. L&rsquo;interaction entre la fonction <em>drop_na()<\/em> et un tableau pr\u00e9alablement partitionn\u00e9 en strates de groupement ob\u00e9it \u00e0 des r\u00e8gles de gestion d&rsquo;int\u00e9grit\u00e9 particuli\u00e8rement sophistiqu\u00e9es.<\/p>\n<p>Lorsqu&rsquo;un tableau group\u00e9 est soumis \u00e0 l&rsquo;\u00e9valuation de <em>drop_na()<\/em>, le filtre d&rsquo;amputation s&rsquo;ex\u00e9cute de mani\u00e8re transversale sur les observations sans d\u00e9truire pour autant la couche structurelle des m\u00e9tadonn\u00e9es de groupement. Le tableau r\u00e9sultant conserve rigoureusement son statut d&rsquo;objet group\u00e9 (<em>grouped_df<\/em>), ses cl\u00e9s de partitionnement d&rsquo;origine et ses indices de strates, ajust\u00e9s simplement \u00e0 la baisse pour refl\u00e9ter l&rsquo;\u00e9viction des unit\u00e9s d\u00e9faillantes. Si d&rsquo;aventure l&rsquo;ensemble des observations associ\u00e9es \u00e0 une modalit\u00e9 sp\u00e9cifique d&rsquo;un facteur de groupement se trouve \u00e9limin\u00e9 en raison d&rsquo;une incompl\u00e9tude syst\u00e9mique, la modalit\u00e9 subsiste au niveau des m\u00e9tadonn\u00e9es de groupe du tibble avec un effectif de ligne nul, \u00e0 moins qu&rsquo;un appel explicite \u00e0 la commande de r\u00e9initialisation des facteurs ou \u00e0 <em>group_trim()<\/em> ne vienne purger ces strates d\u00e9sormais fant\u00f4mes.<\/p>\n<p>Il importe \u00e9galement d&rsquo;analyser le comportement de la fonction face aux cas limites o\u00f9 des colonnes compl\u00e8tes de groupement h\u00e9bergent elles-m\u00eames des valeurs <em>NA<\/em>. Si la variable directrice employ\u00e9e lors du partitionnement <em>group_by(region)<\/em> comporte des \u00e9l\u00e9ments non renseign\u00e9s, ces observations constituent une strate \u00e0 part enti\u00e8re identifi\u00e9e par le label <em>NA<\/em>. Si l&rsquo;op\u00e9rateur encha\u00eene cons\u00e9cutivement un appel \u00e0 <em>drop_na()<\/em> sans argument, cette strate non assign\u00e9e sera imm\u00e9diatement an\u00e9antie au m\u00eame titre que n&rsquo;importe quelle autre ligne lacunaire. En revanche, si l&rsquo;appel est restreint \u00e0 une dimension distincte, par exemple <em>drop_na(points)<\/em>, la cat\u00e9gorie de groupement manquante sera scrupuleusement conserv\u00e9e pour peu que la performance num\u00e9rique des points y soit correctement document\u00e9e, offrant un contr\u00f4le granulaire sur la dynamique d&rsquo;assainissement hi\u00e9rarchique.<\/p>\n<h2>7. Traitement des valeurs manquantes totales et complexes avec dplyr<\/h2>\n<h3>7.1 \u00c9limination des lignes enti\u00e8rement NA via filter() et if_any()<\/h3>\n<p>Alors que la fonction <em>drop_na()<\/em> brille par son impl\u00e9mentation directe de la suppression par liste ou par s\u00e9lection nominale, le package <em>dplyr<\/em> fournit une infrastructure de requ\u00eatage bool\u00e9en infiniment plus puissante \u00e0 travers la conjonction de sa fonction fondamentale <em>filter()<\/em> et de la primitive d&rsquo;\u00e9valuation multi-colonnes <em>if_any()<\/em>. Cette synergie syntaxique permet de formaliser de fa\u00e7on particuli\u00e8rement transparente le filtrage des lignes enti\u00e8rement compos\u00e9es de valeurs manquantes, comblant ainsi une lacune fonctionnelle de base tout en offrant une alternative d&rsquo;une lisibilit\u00e9 algorithmique sup\u00e9rieure aux in\u00e9quations vectorielles de <em>Base R<\/em>.<\/p>\n<p>Le traitement des lignes int\u00e9gralement vides s&rsquo;articule autour de l&rsquo;assertion conceptuelle suivante : une ligne doit \u00eatre conserv\u00e9e au sein du corpus d\u00e8s lors qu&rsquo;il existe <em>au moins une colonne<\/em> dont la valeur est formellement valide (non-NA). La formalisation moderne de cette condition logique s&rsquo;\u00e9crit de la mani\u00e8re suivante :<\/p>\n<p><em>df_sans_vides &lt;- df |&gt; filter(if_any(everything(), ~ !is.na(.)))<\/em><\/p>\n<p>Analysons la d\u00e9composition fonctionnelle de cette instruction. La fonction <em>if_any()<\/em> accepte deux arguments directeurs : le p\u00e9rim\u00e8tre d&rsquo;application dimensionnel et le pr\u00e9dicat logique de validation. En renseignant la fonction auxiliaire <em>everything()<\/em>, nous ordonnons \u00e0 R d&rsquo;\u00e9tendre la v\u00e9rification \u00e0 la totalit\u00e9 des colonnes pr\u00e9sentes dans la structure tabulaire. Le second argument introduit une fonction anonyme stylis\u00e9e par le tilde (<em>~<\/em>), qui applique le test <em>!is.na(.)<\/em> o\u00f9 le point d\u00e9signe s\u00e9quentiellement le contenu de chaque cellule examin\u00e9e. La macro-fonction <em>if_any()<\/em> \u00e9value horizontalement ces pr\u00e9dicats et renvoie <em>TRUE<\/em> pour l&rsquo;observation d\u00e8s que le test de non-vacuit\u00e9 est v\u00e9rifi\u00e9 sur ne serait-ce qu&rsquo;une seule composante vectorielle.<\/p>\n<p>Cette approche surclasse incontestablement les anciennes m\u00e9thodes de sous-ensemblement matriciel par sa robustesse et sa modularit\u00e9. Contrairement aux syntaxes \u00e0 base de <em>apply()<\/em> qui op\u00e8rent des coercitions matricielles dangereuses et d\u00e9gradent les temps de calcul, <em>if_any()<\/em> mobilise en interne des routines C++ hautement optimis\u00e9es issues de la biblioth\u00e8que <em>vctrs<\/em>, tout en pr\u00e9servant scrupuleusement la diversit\u00e9 des classes de colonnes (m\u00e9langeant sans aucun risque des dates, des variables de classe facteur, des types textuels ou des scalaires num\u00e9riques). Elle pr\u00e9munit le pipeline analytique contre toute \u00e9viction pr\u00e9matur\u00e9e de donn\u00e9es partiellement document\u00e9es, s\u00e9curisant le flux d&rsquo;ingestion des bases complexes.<\/p>\n<h3>7.2 Suppression des cas partiellement manquants via filter() et if_all()<\/h3>\n<p>Dans la perspective sym\u00e9trique o\u00f9 l&rsquo;analyste exige la puret\u00e9 absolue des enregistrements, <em>dplyr<\/em> propose l&rsquo;op\u00e9rateur jumeau <em>if_all()<\/em>. Cet op\u00e9rateur stipule que la condition bool\u00e9enne formul\u00e9e doit \u00eatre imp\u00e9rativement satisfaite par <em>l&rsquo;int\u00e9gralit\u00e9<\/em> des colonnes incluses dans le p\u00e9rim\u00e8tre d&rsquo;\u00e9valuation pour que la ligne soit autoris\u00e9e \u00e0 franchir le filtre. L&rsquo;instruction s&rsquo;\u00e9nonce comme suit :<\/p>\n<p><em>df_purifie &lt;- df |&gt; filter(if_all(everything(), ~ !is.na(.)))<\/em><\/p>\n<p>Sur le plan du r\u00e9sultat dimensionnel brut, cette \u00e9criture atteint une \u00e9quivalence fonctionnelle parfaite avec l&rsquo;instruction <em>drop_na()<\/em> appliqu\u00e9e sans param\u00e8tre ou avec le <em>na.omit()<\/em> de <em>Base R<\/em>. Seules les observations totalement exhaustives (dans notre mod\u00e8le, les observations 1 et 6) sont maintenues. N\u00e9anmoins, la sup\u00e9riorit\u00e9 architecturale de la syntaxe <em>filter(if_all(&#8230;))<\/em> r\u00e9side dans sa capacit\u00e9 sans \u00e9gale \u00e0 coupler des s\u00e9lecteurs de pr\u00e9dicats de type \u00e0 l&rsquo;op\u00e9ration de filtration, une fonctionnalit\u00e9 inaccessible \u00e0 la commande <em>drop_na()<\/em> conventionnelle.<\/p>\n<p>\u00c0 titre d&rsquo;illustration, consid\u00e9rons un protocole de recherche m\u00e9dicale o\u00f9 la base de donn\u00e9es associe des identifiants administratifs de patients (textes), des dates d&rsquo;admission (horodatages), des diagnostics cliniques qualitatifs (facteurs) et une vaste s\u00e9rie de biomarqueurs sanguins continus (num\u00e9riques). L&rsquo;exp\u00e9rimentateur peut souhaiter tol\u00e9rer des manques d&rsquo;information sur les variables qualitatives annexes, tout en exigeant une compl\u00e9tude absolue et non n\u00e9gociable sur l&rsquo;int\u00e9gralit\u00e9 des mesures m\u00e9taboliques quantitatives. Avec <em>dplyr<\/em>, cette s\u00e9lection conditionnelle de haute pr\u00e9cision se r\u00e9sout en une seule ligne de code :<\/p>\n<p><em>df_bio_complet &lt;- df_medical |&gt; filter(if_all(where(is.numeric), ~ !is.na(.)))<\/em><\/p>\n<p>L&rsquo;utilisation du s\u00e9lecteur conditionnel <em>where(is.numeric)<\/em> circonscrit dynamiquement l&rsquo;\u00e9valuation de compl\u00e9tude stricte aux seules colonnes dont le type sous-jacent est quantitatif, ignorant souverainement les \u00e9ventuelles valeurs manquantes dispers\u00e9es au sein des colonnes textuelles ou chronologiques. Cette puissance de ciblage d\u00e9claratif offre un niveau de contr\u00f4le analytique hautement sophistiqu\u00e9, garantissant que le nettoyage des donn\u00e9es s&rsquo;ajuste avec une exactitude chirurgicale aux imp\u00e9ratifs th\u00e9oriques du protocole exp\u00e9rimental.<\/p>\n<h3>7.3 Cr\u00e9ation de colonnes indicatrices du taux d&rsquo;incompl\u00e9tude<\/h3>\n<p>Au-del\u00e0 de la suppression brute imm\u00e9diate, les standards de la science ouverte et de la recherche reproductible recommandent d&rsquo;auditer et de consigner formellement le volume d&rsquo;attrition subi par chaque unit\u00e9 statistique avant de proc\u00e9der \u00e0 son \u00e9ventuelle \u00e9limination du jeu de donn\u00e9es principal. L&rsquo;infrastructure de <em>dplyr<\/em> permet d&rsquo;orchestrer cette phase diagnostique avec une transparence totale en injectant, au moyen de la fonction <em>mutate()<\/em>, des m\u00e9triques scalaires quantifiant le niveau d&rsquo;incompl\u00e9tude individuel au sein de colonnes indicatrices d\u00e9di\u00e9es.<\/p>\n<p>L&rsquo;enrichissement du tableau s&rsquo;op\u00e8re par l&rsquo;\u00e9valuation combin\u00e9e de la fonction d&rsquo;agr\u00e9gation <em>rowSums()<\/em> sur une s\u00e9lection transversale pilot\u00e9e par <em>across()<\/em>, permettant d&rsquo;extraire \u00e0 la fois le d\u00e9compte brut des valeurs manquantes et le ratio proportionnel d&rsquo;incompl\u00e9tude :<\/p>\n<p><em>df_audit &lt;- df |&gt; mutate(nb_na = rowSums(is.na(across(everything()))), taux_na = nb_na \/ ncol(df))<\/em><\/p>\n<p>L&rsquo;ex\u00e9cution de cette directive annexe au tableau d&rsquo;origine deux nouvelles variables quantitatives : <em>nb_na<\/em>, qui \u00e9num\u00e8re pr\u00e9cis\u00e9ment le volume d&rsquo;absences par ligne, et <em>taux_na<\/em>, qui normalise cette information sur une \u00e9chelle continue s&rsquo;\u00e9tendant de 0.0 (compl\u00e9tude parfaite) \u00e0 1.0 (vacuit\u00e9 absolue). La mise \u00e0 disposition de ces m\u00e9triques autorise ensuite l&rsquo;op\u00e9rateur \u00e0 impl\u00e9menter des filtrages gradu\u00e9s ultra-pr\u00e9cis, par exemple en \u00e9cartant uniquement les sujets dont le taux d&rsquo;attrition d\u00e9passe 30 % : <em>filter(taux_na &lt;= 0.30)<\/em>.<\/p>\n<p>Dans une perspective de gouvernance des donn\u00e9es rigoureuse, ce m\u00e9canisme facilite en outre la scission du corpus en deux branches documentaires distinctes : le fichier de travail assaini destin\u00e9 \u00e0 la mod\u00e9lisation statistique d&rsquo;une part, et le registre des exclusions (ou m\u00e9ta-table d&rsquo;attrition) d&rsquo;autre part. En appliquant l&rsquo;instruction <em>df_exclus &lt;- df_audit |&gt; filter(taux_na &gt; 0.30)<\/em>, l&rsquo;analyste isole pr\u00e9cis\u00e9ment la cohorte des observations rejet\u00e9es. Ce tableau des exclusions peut ensuite \u00eatre s\u00e9rialis\u00e9 dans les annexes de recherche afin de documenter de mani\u00e8re opposable la typologie sociod\u00e9mographique ou exp\u00e9rimentale des unit\u00e9s \u00e9vinc\u00e9es, satisfaisant ainsi aux exigences les plus s\u00e9v\u00e8res de transparence m\u00e9thodologique \u00e9dict\u00e9es par les comit\u00e9s de relecture par les pairs.<\/p>\n<h2>8. Optimisation des performances pour les donn\u00e9es massives avec data.table<\/h2>\n<h3>8.1 Syntaxe haute performance et fonction na.omit() de data.table<\/h3>\n<p>Lorsque les volumes de donn\u00e9es franchissent le seuil des analyses de laboratoire standard pour atteindre des \u00e9chelles industrielles ou de bio-informatique g\u00e9nomique comprenant des millions d&rsquo;observations et des milliers de marqueurs, les surcharges d&rsquo;allocation m\u00e9moire inh\u00e9rentes aux data frames standards et aux tibbles du Tidyverse peuvent saturer la m\u00e9moire vive et ralentir drastiquement les cadences de calcul. Dans ce contexte de calcul intensif, le package <a rel=\"noopener noreferrer\" href=\"https:\/\/rdatatable.gitlab.io\/data.table\/\">data.table<\/a>, d\u00e9velopp\u00e9 par Matt Dowle et ses collaborateurs, s&rsquo;impose comme la solution de r\u00e9f\u00e9rence absolue au sein de l&rsquo;\u00e9cosyst\u00e8me R, garantissant des vitesses d&rsquo;ex\u00e9cution exceptionnelles gr\u00e2ce \u00e0 une r\u00e9impl\u00e9mentation compl\u00e8te des structures matricielles en langage C bas niveau.<\/p>\n<p>Pour exploiter cette architecture, le tableau exp\u00e9rimental originel doit pr\u00e9alablement \u00eatre transmut\u00e9 en objet de classe <em>data.table<\/em>. Cette transformation s&rsquo;op\u00e8re instantan\u00e9ment \u00e0 l&rsquo;aide de la fonction de conversion par r\u00e9f\u00e9rence <em>setDT(df)<\/em>, laquelle requalifie la structure en place dans l&rsquo;espace m\u00e9moire existant sans ex\u00e9cuter la moindre copie physique superflue. D\u00e8s lors que l&rsquo;objet est promu au rang de <em>data.table<\/em>, la m\u00e9thode S3 ultra-optimis\u00e9e <em>na.omit.data.table()<\/em> prend automatiquement le pas sur l&rsquo;ancienne m\u00e9thode de Base R lors de l&rsquo;appel canonique : <em>dt_clean &lt;- na.omit(df)<\/em>.<\/p>\n<p>Le moteur compil\u00e9 sous-jacent de <em>data.table<\/em> surclasse ses concurrents par l&rsquo;int\u00e9gration d&rsquo;un argument exclusif nomm\u00e9 <em>cols<\/em>, lequel autorise la restriction du filtre d&rsquo;exhaustivit\u00e9 \u00e0 un vecteur de colonnes cibles sans induire la cr\u00e9ation d&rsquo;aucun objet interm\u00e9diaire en m\u00e9moire :<\/p>\n<p><em>dt_cible &lt;- na.omit(df, cols = c(\u00ab\u00a0points\u00a0\u00bb, \u00ab\u00a0assists\u00a0\u00bb))<\/em><\/p>\n<p>Les bancs d&rsquo;essai comparatifs (<em>benchmarks<\/em>) d\u00e9montrent avec constance que sur des tables exc\u00e9dant dix millions de lignes, l&rsquo;\u00e9valuation de <em>na.omit()<\/em> sous <em>data.table<\/em> s&rsquo;ex\u00e9cute avec des facteurs d&rsquo;acc\u00e9l\u00e9ration oscillant entre 5x et 50x par rapport aux primitives standard de <em>Base R<\/em> ou aux d\u00e9clinaisons fonctionnelles du <em>Tidyverse<\/em>. Cette v\u00e9locit\u00e9 stup\u00e9fiante d\u00e9coule de l&rsquo;absence totale d&rsquo;instanciation d&rsquo;arbres syntaxiques abstraits et de l&rsquo;interdiction de toute duplication vectorielle invisible lors du balayage s\u00e9quentiel des colonnes.<\/p>\n<h3>8.2 Filtrage par r\u00e9f\u00e9rence sans copie m\u00e9moire superflue<\/h3>\n<p>L&rsquo;une des caract\u00e9ristiques les plus redoutables du moteur R standard r\u00e9side dans son m\u00e9canisme universel de \u00ab copie lors de la modification \u00bb (<em>copy-on-modify<\/em>). D\u00e8s qu&rsquo;un op\u00e9rateur applique une indexation par crochets classique de type <em>df &lt;- df[condition, ]<\/em>, R duplique int\u00e9gralement la structure de donn\u00e9es dans un nouvel emplacement m\u00e9moire avant d&rsquo;y injecter les valeurs filtr\u00e9es, doublant instantan\u00e9ment l&#8217;empreinte RAM occup\u00e9e par le processus d&rsquo;analyse. Face \u00e0 des corpus volumineux avoisinant la capacit\u00e9 maximale de la m\u00e9moire vive disponible, cette duplication engendre des ph\u00e9nom\u00e8nes d&rsquo;\u00e9tranglement s\u00e9v\u00e8res (<em>swapping<\/em> sur disque) ou l&rsquo;interruption pure et simple de la session avec \u00e9mission de l&rsquo;erreur fatale : <em>cannot allocate vector of size&#8230;<\/em>.<\/p>\n<p>Le package <em>data.table<\/em> contourne magistralement cette impasse architecturale en promouvant la manipulation directe des pointeurs par r\u00e9f\u00e9rence. L&rsquo;interrogation conditionnelle s&rsquo;ex\u00e9cute directement dans le premier volet de la syntaxe unifi\u00e9e <em>DT[i, j, by]<\/em>, o\u00f9 la clause <em>i<\/em> s\u00e9lectionne les lignes avec une efficacit\u00e9 maximale sans jamais g\u00e9n\u00e9rer de doublons structurels. L&rsquo;instruction destin\u00e9e \u00e0 \u00e9vacuer les valeurs manquantes d&rsquo;une variable critique s&rsquo;\u00e9nonce simplement :<\/p>\n<p><em>dt_filtre &lt;- dt[!is.na(points)]<\/em><\/p>\n<p>Dans cette formulation, l&rsquo;identifiant <em>points<\/em> est \u00e9valu\u00e9 directement dans le contexte interne de la table sans qu&rsquo;il soit n\u00e9cessaire de pr\u00e9fixer le nom de l&rsquo;objet ou de recourir \u00e0 l&rsquo;op\u00e9rateur dollar (<em>$<\/em>). Pour conjuguer des crit\u00e8res d&rsquo;exclusion sur des vecteurs multiples, l&rsquo;analyste assemble ses pr\u00e9dicats \u00e0 l&rsquo;aide des op\u00e9rateurs logiques standards : <em>dt[!is.na(points) &amp; !is.na(assists)]<\/em>.<\/p>\n<p>En poussant l&rsquo;optimisation \u00e0 son paroxysme, <em>data.table<\/em> autorise l&rsquo;\u00e9limination des lignes vides \u00e0 l&rsquo;aide de la fonction interne <em>set()<\/em> ou de l&rsquo;op\u00e9rateur de sous-ensemblement destructif par r\u00e9f\u00e9rence, qui modifie les pointeurs de la m\u00e9moire C sans transf\u00e9rer le moindre m\u00e9gaoctet vers de nouvelles adresses physiques. Ce paradigme garantit une empreinte \u00e9cologique computationnelle minimale et permet de traiter avec une fluidit\u00e9 d\u00e9concertante des bases de donn\u00e9es massives sur des stations de travail aux ressources mat\u00e9rielles modestes, l\u00e0 o\u00f9 les m\u00e9thodes conventionnelles provoqueraient immanquablement un \u00e9puisement de la m\u00e9moire syst\u00e8me.<\/p>\n<h2>9. Manipulation matricielle et gestion des structures de donn\u00e9es complexes<\/h2>\n<h3>9.1 Suppression des lignes NA au sein de matrices multidimensionnelles<\/h3>\n<p>Bien que le conteneur de donn\u00e9es le plus usuel pour l&rsquo;analyse statistique g\u00e9n\u00e9rale demeure le <em>data.frame<\/em>, les mod\u00e9lisations d&rsquo;alg\u00e8bre computationnelle, les calculs de r\u00e9seaux de neurones, la confection de matrices de distance g\u00e9n\u00e9tique ou les d\u00e9compositions spectrales requi\u00e8rent imp\u00e9rativement le maniement d&rsquo;objets de classe <em>matrix<\/em>. Contrairement aux tableaux de donn\u00e9es qui autorisent l&rsquo;h\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9 des modes entre colonnes (pourvu que la longueur vectorielle soit rigoureusement partag\u00e9e), la matrice constitue un vecteur atomique continu dot\u00e9 d&rsquo;un attribut de dimension (<em>dim<\/em>) imposant une homog\u00e9n\u00e9it\u00e9 de type absolue \u00e0 l&rsquo;ensemble de ses cellules (g\u00e9n\u00e9ralement <em>double<\/em> ou <em>integer<\/em>).<\/p>\n<p>Cette contrainte architecturale conditionne \u00e9troitement la mani\u00e8re dont les valeurs manquantes s&rsquo;y manifestent et s&rsquo;y traitent. Lorsqu&rsquo;une matrice math\u00e9matique incorpore des valeurs <em>NA<\/em>, l&rsquo;ensemble des op\u00e9rations tensorielles classiques comme le produit matriciel (<em>%*%<\/em>) ou la r\u00e9solution de syst\u00e8mes lin\u00e9aires par <em>solve()<\/em> \u00e9chouent syst\u00e9matiquement, renvoyant des blocs entiers d&rsquo;ind\u00e9terminations. Pour \u00e9laguer une matrice des lignes portant des \u00e9l\u00e9ments manquants, la primitive <em>complete.cases()<\/em> conserve une validit\u00e9 op\u00e9rationnelle int\u00e9grale :<\/p>\n<p><em>mat_propre &lt;- mat[complete.cases(mat), , drop = FALSE]<\/em><\/p>\n<p>La pr\u00e9sence du param\u00e8tre <em>drop = FALSE<\/em> au sein des crochets d&rsquo;indexation matricielle rev\u00eat ici une importance capitale sur le plan m\u00e9thodologique et programmatique. Par d\u00e9faut, le compilateur R applique un comportement r\u00e9ducteur historique h\u00e9rit\u00e9 du langage S : si, cons\u00e9cutivement \u00e0 un filtrage d&rsquo;observations d\u00e9faillantes, la matrice r\u00e9sultante ne conserve qu&rsquo;une seule ligne valide, R r\u00e9trograde instantan\u00e9ment la classe de l&rsquo;objet d&rsquo;une matrice bidimensionnelle vers un simple vecteur atomique unidimensionnel. Cette coercition dimensionnelle automatique an\u00e9antit l&rsquo;orientation matricielle de la structure et provoque immanquablement le plantage en cha\u00eene des fonctions alg\u00e9briques ult\u00e9rieures qui attendent formellement un tenseur \u00e0 deux dimensions. L&rsquo;adjonction syst\u00e9matique de la directive <em>drop = FALSE<\/em> neutralise ce comportement en for\u00e7ant R \u00e0 pr\u00e9server le statut matriciel de l&rsquo;objet, ind\u00e9pendamment du nombre r\u00e9siduel d&rsquo;observations conserv\u00e9es.<\/p>\n<p>L&rsquo;alternative arithm\u00e9tique exploitant <em>rowSums(is.na(mat)) == 0<\/em> s&rsquo;av\u00e8re particuli\u00e8rement v\u00e9loce sur les structures matricielles num\u00e9riques pures. L&rsquo;absence totale de v\u00e9rification de noms de colonnes et de m\u00e9tadonn\u00e9es d&rsquo;attributs autorise le compilateur \u00e0 d\u00e9rouler les boucles de calcul sur des registres processeur directs \u00e0 tr\u00e8s haute cadence, garantissant des gains d&rsquo;efficience substantiels lors de la manipulation d&rsquo;espaces g\u00e9om\u00e9triques de haute dimensionnalit\u00e9.<\/p>\n<h3>9.2 Gestion des lignes NA dans les colonnes imbriqu\u00e9es (list-columns)<\/h3>\n<p>L&rsquo;essor des architectures de mod\u00e9lisation avanc\u00e9es port\u00e9es par le package <em>tidyr<\/em> et la programmation fonctionnelle du package <em>purrr<\/em> a d\u00e9mocratis\u00e9 l&rsquo;usage des colonnes imbriqu\u00e9es (<em>list-columns<\/em>). Dans ces structures sophistiqu\u00e9es, une cellule de tableau ne contient plus un scalaire atomique isol\u00e9, mais encapsule un objet R complet et complexe, tel qu&rsquo;un sous-vecteur de dimensions variables, une matrice secondaire, un data frame partitionn\u00e9, ou m\u00eame la sortie d&rsquo;un objet de mod\u00e9lisation de classe <em>lm<\/em>. Face \u00e0 ces architectures arborescentes non plates, les fonctions d&rsquo;assainissement classiques comme <em>complete.cases()<\/em> ou <em>drop_na()<\/em> se heurtent \u00e0 des limitations s\u00e9mantiques imm\u00e9diates.<\/p>\n<p>En effet, lorsqu&rsquo;une colonne de type liste abrite un \u00e9l\u00e9ment absent, celui-ci peut se manifester sous deux formes ontologiques distinctes : soit sous la forme d&rsquo;un scalaire <em>NA<\/em> standard log\u00e9 dans la liste (g\u00e9n\u00e9ralement typ\u00e9 <em>NA_real_<\/em> ou <em>logical<\/em>), soit sous la forme d&rsquo;un vecteur ou d&rsquo;un tableau vide de longueur z\u00e9ro (comme <em>NULL<\/em> ou <em>numeric(0)<\/em>). Or, pour la primitive <em>complete.cases()<\/em>, une cellule encapsulant un vecteur vide de dimension z\u00e9ro n&rsquo;est pas formellement identifi\u00e9e comme un marqueur <em>NA<\/em> ; l&rsquo;observation franchit alors le filtre en toute invisibilit\u00e9, g\u00e9n\u00e9rant des erreurs lors des op\u00e9rations ult\u00e9rieures de d\u00e9simbrication (<em>unnest()<\/em>).<\/p>\n<p>Pour assainir rigoureusement un tableau abritant des colonnes imbriqu\u00e9es, l&rsquo;analyste doit concevoir des pr\u00e9dicats logiques personnalis\u00e9s fond\u00e9s sur les outils du package <em>purrr<\/em>, notamment la fonction <em>map_lgl()<\/em>, capable d&rsquo;inspecter l&rsquo;int\u00e9rieur de chaque conteneur de liste :<\/p>\n<p><em>df_imbrique_propre &lt;- df_imbrique |&gt; filter(purrr::map_lgl(colonne_liste, ~ length(.) &gt; 0 &amp;&amp; !all(is.na(.))))<\/em><\/p>\n<p>Dans cette architecture de filtration fine, la fonction lambda v\u00e9rifie de mani\u00e8re ordonn\u00e9e que l&rsquo;\u00e9l\u00e9ment imbriqu\u00e9 poss\u00e8de une longueur strictement sup\u00e9rieure \u00e0 z\u00e9ro (\u00e9cartant ainsi les pointeurs nuls ou les s\u00e9ries vides) et qu&rsquo;il n&rsquo;est pas int\u00e9gralement compos\u00e9 d&rsquo;\u00e9l\u00e9ments <em>NA<\/em> via le test <em>!all(is.na(.))<\/em>. Ce niveau de contr\u00f4le granulaire s&rsquo;av\u00e8re absolument indispensable lors du traitement de hi\u00e9rarchies de donn\u00e9es longitudinales ou de mod\u00e8les psychom\u00e9triques multiniveaux, o\u00f9 la d\u00e9faillance d&rsquo;une sous-structure locale ne doit en aucun cas corrompre l&rsquo;alignement matriciel de la strate parente.<\/p>\n<h2>10. Impacts m\u00e9thodologiques et statistiques de la suppression de lignes<\/h2>\n<h3>10.1 Perte de puissance statistique et biais de s\u00e9lection induits<\/h3>\n<p>L&rsquo;acte d&rsquo;amputation consistant \u00e0 purger un tableau de donn\u00e9es de ses lignes incompl\u00e8tes ne constitue en aucun cas une op\u00e9ration technique neutre ou anodine : il engage directement les hypoth\u00e8ses \u00e9pist\u00e9mologiques et la robustesse inf\u00e9rentielle de l&rsquo;ensemble de la d\u00e9marche d&rsquo;investigation scientifique. Sur le plan de la th\u00e9orie statistique classique, la premi\u00e8re cons\u00e9quence directe de la suppression par liste (<em>listwise deletion<\/em>) se mat\u00e9rialise par l&rsquo;amenuisement m\u00e9canique de la taille effective de l&rsquo;\u00e9chantillon analys\u00e9, not\u00e9e <em>N<\/em>. Dans la mesure o\u00f9 les erreurs types des estimateurs varient de fa\u00e7on inversement proportionnelle \u00e0 la racine carr\u00e9e de la taille d&rsquo;\u00e9chantillon, toute r\u00e9traction de <em>N<\/em> induit un \u00e9largissement imm\u00e9diat des intervalles de confiance et un effondrement substantiel de la puissance statistique des tests d&rsquo;hypoth\u00e8ses formels. D\u00e8s lors, le risque d&rsquo;erreur de type II \u2014 c&rsquo;est-\u00e0-dire l&rsquo;incapacit\u00e9 \u00e0 rejeter une hypoth\u00e8se nulle pourtant factuellement fausse dans la r\u00e9alit\u00e9 empirique \u2014 s&rsquo;en trouve dramatiquement d\u00e9multipli\u00e9.<\/p>\n<p>De surcro\u00eet, ainsi que le formalisent les \u00e9quations fondamentales de Donald Rubin et de Joseph Schafer, la suppression pure et simple d&rsquo;enregistrements n&rsquo;est immunis\u00e9e contre le risque de biais d&rsquo;estimation que sous la condition th\u00e9orique rarissime d&rsquo;un m\u00e9canisme d&rsquo;absence totalement al\u00e9atoire (<a rel=\"noopener noreferrer\" href=\"https:\/\/www.jstor.org\/stable\/2335739\">MCAR<\/a>). Si le processus g\u00e9n\u00e9rateur sous-jacent rel\u00e8ve d&rsquo;une disparition al\u00e9atoire conditionnelle (MAR) ou non al\u00e9atoire (MNAR), la suppression par liste alt\u00e8re dramatiquement la repr\u00e9sentativit\u00e9 de l&rsquo;\u00e9chantillon en s\u00e9lectionnant implicitement un sous-ensemble syst\u00e9matiquement biais\u00e9 de la population cible. Les distributions marginales se trouvent tronqu\u00e9es, les variances empiriques sont artificiellement sous-estim\u00e9es ou surestim\u00e9es, et les coefficients de covariance entre les variables se d\u00e9forment de mani\u00e8re impr\u00e9visible.<\/p>\n<p>Dans le domaine de la psychom\u00e9trie et de la mod\u00e9lisation en \u00e9quations structurelles, l&rsquo;\u00e9viction indiscrimin\u00e9e des participants mod\u00e9r\u00e9ment d\u00e9faillants produit des ravages m\u00e9thodologiques particuli\u00e8rement document\u00e9s. Lors de la conduite d&rsquo;analyses factorielles exploratoires ou confirmatoires, l&rsquo;\u00e9limination syst\u00e9matique des profils incomplets alt\u00e8re substantiellement la structure de la matrice de corr\u00e9lations polychoriques ou de covariances inter-items. Cette distorsion g\u00e9om\u00e9trique peut masquer l&rsquo;\u00e9mergence de facteurs latents authentiques ou, inversement, cr\u00e9er des art\u00e9facts factoriels artificiels imputables exclusivement au biais de s\u00e9lection des r\u00e9pondants les plus m\u00e9ticuleux ou les plus conformistes. Par cons\u00e9quent, l&rsquo;\u00e9lagage m\u00e9canique des donn\u00e9es ne doit jamais \u00eatre consid\u00e9r\u00e9 comme une routine par d\u00e9faut, mais comme une d\u00e9cision d&rsquo;arbitrage critique exigeant une justification m\u00e9thodologique \u00e9tay\u00e9e.<\/p>\n<h3>10.2 Alternatives analytiques \u00e0 la suppression brute de donn\u00e9es<\/h3>\n<p>Face aux p\u00e9rils statistiques inh\u00e9rents \u00e0 l&rsquo;amputation aveugle des unit\u00e9s d&rsquo;observation, la m\u00e9thodologie quantitative contemporaine a d\u00e9velopp\u00e9 un arsenal d&rsquo;alternatives sophistiqu\u00e9es permettant d&rsquo;exploiter l&rsquo;int\u00e9gralit\u00e9 du signal informatif disponible sans sacrifier la validit\u00e9 des inf\u00e9rences. Il convient en premier lieu de proscrire formellement les pratiques d\u00e9su\u00e8tes d&rsquo;imputation univari\u00e9e simple, telles que le remplacement d&rsquo;un <em>NA<\/em> par la moyenne arithm\u00e9tique ou la m\u00e9diane de la colonne. Bien que trivialement faciles \u00e0 impl\u00e9menter sous R, ces techniques na\u00efves \u00e9crasent artificiellement la variance r\u00e9siduelle des distributions, d\u00e9forment les formes de dispersion en cr\u00e9ant des pics de densit\u00e9 anormaux, et sous-estiment gravement les erreurs types lors de la mod\u00e9lisation statistique subs\u00e9quente.<\/p>\n<p>La r\u00e9f\u00e9rence m\u00e9thodologique dominante pour le traitement des donn\u00e9es relevant du r\u00e9gime MAR r\u00e9side dans l&rsquo;approche par imputation multiple, et plus particuli\u00e8rement dans l&rsquo;algorithme d&rsquo;imputation multiple par \u00e9quations cha\u00een\u00e9es (<em>Multivariate Imputation by Chained Equations<\/em> ou MICE), brillamment impl\u00e9ment\u00e9 dans l&rsquo;\u00e9cosyst\u00e8me R au sein du package \u00e9ponyme <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=mice\">mice<\/a> con\u00e7u par Stef van Buuren. Ce paradigme proc\u00e8de par \u00e9tapes probabilistes rigoureuses : il mod\u00e9lise chaque variable incompl\u00e8te conditionnellement \u00e0 l&rsquo;ensemble des autres descripteurs de la base, g\u00e9n\u00e8re <em>m<\/em> jeux de donn\u00e9es complets distincts en injectant une composante stochastique r\u00e9siduelle repr\u00e9sentative de l&rsquo;incertitude \u00e9pist\u00e9mique, ajuste le mod\u00e8le d&rsquo;analyse sur chacun de ces corpus de mani\u00e8re parall\u00e8le, puis agr\u00e8ge (<em>pool<\/em>) l&rsquo;ensemble des estimations conform\u00e9ment aux r\u00e8gles alg\u00e9briques formalis\u00e9es par Rubin. Cette s\u00e9quence garantit des estimations de coefficients non biais\u00e9es et pr\u00e9serve l&rsquo;exactitude des intervalles de confiance.<\/p>\n<p>Parall\u00e8lement \u00e0 l&rsquo;imputation multiple, la m\u00e9thode d&rsquo;estimation \u00e0 information maximale (<em>Full Information Maximum Likelihood<\/em> ou <strong>FIML<\/strong>) constitue l&rsquo;alternative de pr\u00e9dilection au sein des architectures de mod\u00e9lisation structurelle et des r\u00e9gressions multivari\u00e9es, impl\u00e9ment\u00e9e nativement dans des packages de pointe tels que <em>lavaan<\/em>. Plut\u00f4t que de reconstruire artificiellement les donn\u00e9es manquantes, l&rsquo;algorithme FIML ajuste la fonction de vraisemblance logarithmique individuelle pour chaque observation en exploitant exclusivement le sous-ensemble sp\u00e9cifique de variables r\u00e9ellement observ\u00e9es pour ce sujet pr\u00e9cis. Cette int\u00e9gration analytique directe contourne l&rsquo;obligation d&rsquo;amputation des lignes incompl\u00e8tes tout en fournissant des estimateurs aux propri\u00e9t\u00e9s asymptotiques optimales sous r\u00e9serve du respect du postulat MAR.<\/p>\n<p>Enfin, les standards \u00e9ditoriaux internationaux, notamment formalis\u00e9s par les directives de l&rsquo;<a rel=\"noopener noreferrer\" href=\"https:\/\/apastyle.apa.org\/\">American Psychological Association<\/a> (normes APA 7e \u00e9dition), imposent d\u00e9sormais une transparence absolue dans la communication scientifique. Tout article empirique ayant eu recours \u00e0 la suppression de lignes doit imp\u00e9rativement documenter : le nombre exact d&rsquo;observations initialement collect\u00e9es, le volume absolu et la proportion relative d&rsquo;enregistrements \u00e9vinc\u00e9s, le m\u00e9canisme d&rsquo;absence postul\u00e9 \u00e9tay\u00e9 par des analyses de sensibilit\u00e9, et la preuve formelle que l&rsquo;amputation op\u00e9r\u00e9e n&rsquo;alt\u00e8re pas de mani\u00e8re substantielle les conclusions th\u00e9oriques avanc\u00e9es.<\/p>\n<h2>11. Erreurs fr\u00e9quentes, pi\u00e8ges syntaxiques et protocoles de d\u00e9bogage<\/h2>\n<h3>11.1 Confusion entre cha\u00eenes de caract\u00e8res vides, espaces et v\u00e9ritables NA<\/h3>\n<p>L&rsquo;une des sources de d\u00e9faillance les plus insidieuses lors de l&rsquo;ex\u00e9cution de filtres de nettoyage de donn\u00e9es r\u00e9side dans l&rsquo;h\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9 s\u00e9mantique masqu\u00e9e au sein des vecteurs de cha\u00eenes de caract\u00e8res ou des facteurs cat\u00e9goriels. Dans de multiples environnements d&rsquo;ingestion de fichiers bruts (notamment lors de l&rsquo;extraction de formulaires web ou d&rsquo;exports de logiciels d&rsquo;enqu\u00eates en ligne), les non-r\u00e9ponses ne sont pas syst\u00e9matiquement encod\u00e9es sous la forme de valeurs nulles, mais sous la forme de cha\u00eenes textuelles vides (<em>\u00ab\u00a0\u00a0\u00bb<\/em>), de suites d&rsquo;espaces ins\u00e9cables (<em>\u00a0\u00bb   \u00ab\u00a0<\/em>), ou de mentions litt\u00e9rales textuelles telles que <em>\u00ab\u00a0NA\u00a0\u00bb<\/em>, <em>\u00ab\u00a0N\/A\u00a0\u00bb<\/em>, <em>\u00ab\u00a0NULL\u00a0\u00bb<\/em> ou <em>\u00ab\u00a0Refus\u00a0\u00bb<\/em>. Pour l&rsquo;interpr\u00e9teur R, chacune de ces manifestations constitue une donn\u00e9e textuelle valide de classe <em>character<\/em> et non une constante logique <em>NA<\/em>.<\/p>\n<p>Lorsque l&rsquo;analyste applique na\u00efvement des fonctions comme <em>na.omit()<\/em>, <em>complete.cases()<\/em> ou <em>drop_na()<\/em> \u00e0 un tel tableau, le moteur logiciel n&rsquo;identifie aucun marqueur <em>NA<\/em> officiel au sein de ces cellules trompeuses. Par cons\u00e9quent, les lignes correspondantes franchissent avec succ\u00e8s l&rsquo;ensemble des filtres de suppression, maintenant au sein du corpus des enregistrements factuellement corrompus. Pour d\u00e9samorcer cette anomalie en amont, il est imp\u00e9ratif de configurer ad\u00e9quatement les param\u00e8tres d&rsquo;ingestion d\u00e8s la phase de lecture des donn\u00e9es au moyen de l&rsquo;argument <em>na.strings<\/em> au sein de fonctions telles que <em>read.csv()<\/em> :<\/p>\n<p><em>df_brut &lt;- read.csv(\u00ab\u00a0donnees.csv\u00a0\u00bb, na.strings = c(\u00ab\u00a0NA\u00a0\u00bb, \u00ab\u00a0\u00a0\u00bb, \u00a0\u00bb \u00ab\u00a0, \u00ab\u00a0N\/A\u00a0\u00bb, \u00ab\u00a0NULL\u00a0\u00bb))<\/em><\/p>\n<p>Si le jeu de donn\u00e9es est d\u00e9j\u00e0 instanci\u00e9 en m\u00e9moire, la conversion curative des cha\u00eenes sentinelles vers de v\u00e9ritables constantes manquantes s&rsquo;ex\u00e9cute de mani\u00e8re \u00e9l\u00e9gante via la fonction <em>na_if()<\/em> du package <em>dplyr<\/em>, combin\u00e9e avec des op\u00e9rations de nettoyage textuel des espaces superflus port\u00e9es par <em>stringr::str_trim()<\/em> :<\/p>\n<p><em>df_assaini &lt;- df |&gt; mutate(across(where(is.character), ~ na_if(stringr::str_trim(.), \u00ab\u00a0\u00a0\u00bb)))<\/em><\/p>\n<p>Cette instruction parcourt l&rsquo;ensemble des colonnes textuelles du tableau, \u00e9limine les espaces r\u00e9siduels invisibles en d\u00e9but et fin de cha\u00eene, puis transmute syst\u00e9matiquement les cha\u00eenes devenues rigoureusement vides en constantes <em>NA_character_<\/em>. D\u00e8s lors, les filtres d&rsquo;\u00e9lagage standard recouvrent leur pleine efficacit\u00e9 fonctionnelle et \u00e9liminent sans faille ces pseudo-observations ind\u00e9sirables.<\/p>\n<h3>11.2 Perte involontaire de donn\u00e9es caus\u00e9e par l&rsquo;indexation Base R avec NA<\/h3>\n<p>L&rsquo;un des pi\u00e8ges syntaxiques les plus redoutables et les plus fr\u00e9quemment document\u00e9s au sein du socle <em>Base R<\/em> concerne le comportement pathologique de l&rsquo;op\u00e9rateur d&rsquo;indexation matricielle \u00e0 crochets lorsqu&rsquo;il est confront\u00e9 \u00e0 un vecteur logique contenant lui-m\u00eame des valeurs manquantes. Supposons qu&rsquo;un analyste cherche \u00e0 isoler les athl\u00e8tes ayant marqu\u00e9 strictement plus de 15 points en utilisant l&rsquo;instruction d&rsquo;indexation bool\u00e9enne intuitive suivante :<\/p>\n<p><em>df_piege &lt;- df[df$points &gt; 15, ]<\/em><\/p>\n<p>L&rsquo;\u00e9valuation de la condition relationnelle <em>df$points &gt; 15<\/em> engendre un vecteur logique qui, conform\u00e9ment aux principes de la logique trivalente examin\u00e9s pr\u00e9c\u00e9demment, renvoie la constante <em>NA<\/em> chaque fois que la variable <em>points<\/em> est elle-m\u00eame non renseign\u00e9e. Or, la convention fondamentale de sous-ensemblement de Base R stipule que lorsqu&rsquo;un s\u00e9lecteur de ligne \u00e9value un <em>NA<\/em> logique, l&rsquo;interpr\u00e9teur ne peut trancher sur l&rsquo;inclusion ou l&rsquo;exclusion de l&rsquo;enregistrement ; il g\u00e9n\u00e8re alors artificiellement au sein du tableau r\u00e9sultant une <strong>ligne fant\u00f4me<\/strong>, enti\u00e8rement compos\u00e9e de valeurs <em>NA<\/em> sur l&rsquo;int\u00e9gralit\u00e9 de ses colonnes.<\/p>\n<p>Cette particularit\u00e9 produit une anomalie d\u00e9concertante : l&rsquo;analyste, qui visait \u00e0 restreindre son tableau \u00e0 des observations num\u00e9riques qualifi\u00e9es, se retrouve avec une structure pollu\u00e9e par de nouvelles lignes int\u00e9gralement vides qui n&rsquo;existaient pas sous cette forme dans la distribution d&rsquo;origine. Pour d\u00e9sactiver formellement ce pi\u00e8ge et garantir que seules les unit\u00e9s validant incontestablement la condition soient extraites, il est absolument indispensable d&rsquo;encapsuler la condition logique au sein de la fonction <em>which()<\/em> :<\/p>\n<p><em>df_robuste &lt;- df[which(df$points &gt; 15), ]<\/em><\/p>\n<p>La primitive <em>which()<\/em> convertit le vecteur de bool\u00e9ens en un vecteur d&rsquo;indices entiers stricts pointant exclusivement vers les coordonn\u00e9es o\u00f9 la condition est incontestablement <em>TRUE<\/em>, en ignorant syst\u00e9matiquement et sans ambigu\u00eft\u00e9 les \u00e9valuations aboutissant \u00e0 <em>NA<\/em> ou <em>FALSE<\/em>. L&rsquo;indexation matricielle subs\u00e9quente ne manipulant que des entiers positifs, aucune ligne fant\u00f4me n&rsquo;est instanci\u00e9e, s\u00e9curisant ainsi l&rsquo;int\u00e9grit\u00e9 topologique de la base \u00e9pur\u00e9e.<\/p>\n<h3>11.3 Gestion des facteurs et des niveaux non utilis\u00e9s apr\u00e8s suppression<\/h3>\n<p>Une complication structurelle majeure cons\u00e9cutive \u00e0 l&rsquo;amputation de lignes concerne la persistance r\u00e9siduelle des niveaux (<em>levels<\/em>) au sein des variables qualitatives instanci\u00e9es sous la classe <em>factor<\/em>. Dans le mod\u00e8le d&rsquo;objets de R, un facteur encapsule un vecteur d&rsquo;entiers sous-jacent associ\u00e9 \u00e0 un attribut contenant la nomenclature exhaustive de l&rsquo;ensemble des modalit\u00e9s th\u00e9oriquement admissibles pour cette variable. Lorsqu&rsquo;un filtre de suppression \u00e9limine la totalit\u00e9 des observations qui incarnaient une modalit\u00e9 cat\u00e9gorielle rare au sein de l&rsquo;\u00e9chantillon, R n&rsquo;op\u00e8re aucune mise \u00e0 jour automatique de la liste des niveaux autoris\u00e9s.<\/p>\n<p>Par voie de cons\u00e9quence, le facteur conserve dans ses m\u00e9tadonn\u00e9es internes la trace formelle d&rsquo;une modalit\u00e9 dont l&rsquo;effectif r\u00e9el est d\u00e9sormais strictement \u00e9gal \u00e0 z\u00e9ro au sein du tableau nettoy\u00e9. Si l&rsquo;analyste proc\u00e8de ult\u00e9rieurement \u00e0 l&rsquo;estimation d&rsquo;un mod\u00e8le lin\u00e9aire (<em>lm<\/em>) ou d&rsquo;une analyse de variance (<em>ANOVA<\/em>) \u00e0 partir de ce tableau, le moteur d&rsquo;estimation cherchera \u00e0 allouer des degr\u00e9s de libert\u00e9 et \u00e0 construire des param\u00e8tres de contrastes pour ces niveaux fant\u00f4mes. Cela d\u00e9clenche fr\u00e9quemment des singularit\u00e9s de rang matriciel, l&rsquo;\u00e9mission d&rsquo;avertissements de non-convergence, ou l&rsquo;apparition de coefficients non estimables mat\u00e9rialis\u00e9s par des mentions <em>NA<\/em> dans le tableau r\u00e9capitulatif des coefficients.<\/p>\n<p>Pour immuniser le pipeline contre ce dysfonctionnement m\u00e9thodologique, il est imp\u00e9ratif d&rsquo;incorporer un protocole d&rsquo;assainissement syst\u00e9matique des facteurs apr\u00e8s toute proc\u00e9dure substantielle d&rsquo;\u00e9lagage de lignes. L&rsquo;instruction canonique de Base R s&rsquo;articule autour de la commande <em>droplevels()<\/em> :<\/p>\n<p><em>df_final &lt;- droplevels(df_complet)<\/em><\/p>\n<p>Cette fonction inspecte de mani\u00e8re r\u00e9cursive l&rsquo;ensemble des colonnes factorielles de l&rsquo;objet, recense les modalit\u00e9s dont la fr\u00e9quence empirique r\u00e9siduelle est nulle, et purge d\u00e9finitivement ces niveaux orphelins de l&rsquo;attribut <em>levels<\/em>. Le tableau de donn\u00e9es stabilis\u00e9 se trouve alors parfaitement calibr\u00e9 pour l&rsquo;injection dans les algorithmes de mod\u00e9lisation multivari\u00e9e, \u00e9cartant tout risque d&rsquo;instabilit\u00e9 num\u00e9rique li\u00e9e \u00e0 des param\u00e8tres fant\u00f4mes.<\/p>\n<h2>12. Synth\u00e8se comparative et guide d\u00e9cisionnel pour l&rsquo;analyste<\/h2>\n<h3>12.1 Tableau comparatif des commandes : performances, d\u00e9pendances et syntaxe<\/h3>\n<p>Le tableau analytique ci-dessous synth\u00e9tise les propri\u00e9t\u00e9s techniques, syntaxiques et structurelles des principales m\u00e9thodologies de suppression de lignes pass\u00e9es en revue, offrant \u00e0 l&rsquo;ing\u00e9nieur de donn\u00e9es et au chercheur une vue panoramique pour guider leurs choix d&rsquo;impl\u00e9mentation logicielle :<\/p>\n<ul>\n<li><strong>complete.cases() [Base R]<\/strong> : Supprime les lignes avec au moins un NA. Aucune d\u00e9pendance externe (natif). Complexit\u00e9 algorithmique optimale en C. Pr\u00e9serve les attributs originaux mais maintient les noms de lignes (row.names) d&rsquo;origine. Syntaxe matricielle par crochets d&rsquo;une concision moyenne.<\/li>\n<li><strong>na.omit() [Base R]<\/strong> : Supprime les lignes avec au moins un NA. Aucune d\u00e9pendance externe. Performance computationnelle tr\u00e8s rapide. Implante la classe d&rsquo;attribut <em>na.action = omit<\/em>, essentielle pour la mod\u00e9lisation statistique mais n\u00e9cessitant parfois une purge manuelle.<\/li>\n<li><strong>rowSums(is.na()) &lt; ncol() [Base R]<\/strong> : Supprime exclusivement les lignes enti\u00e8rement vides. Aucune d\u00e9pendance. Excellente rapidit\u00e9 sur matrices homog\u00e8nes. Aucune alt\u00e9ration des m\u00e9tadonn\u00e9es. Syntaxe arithm\u00e9tique demandant une bonne ma\u00eetrise conceptuelle.<\/li>\n<li><strong>drop_na() [tidyr \/ Tidyverse]<\/strong> : Supprime au moins un NA ou filtre sur colonnes sp\u00e9cifiques. N\u00e9cessite l&rsquo;installation du Tidyverse. Performance interm\u00e9diaire sur grands volumes, mais lisibilit\u00e9 syntaxique d\u00e9clarative exceptionnelle avec int\u00e9gration du pipe (|&gt;) et de tidyselect.<\/li>\n<li><strong>filter() + if_any() [dplyr]<\/strong> : Supprime les lignes enti\u00e8rement vides ou configurations complexes. D\u00e9pendance au Tidyverse. Vitesse optimis\u00e9e par le moteur C++ de vctrs. Syntaxe d\u00e9clarative de haut niveau, id\u00e9ale pour les pipelines de production document\u00e9s.<\/li>\n<li><strong>na.omit.data.table() [data.table]<\/strong> : Supprime au moins un NA avec option de ciblage par l&rsquo;argument cols. N\u00e9cessite le package data.table. Performances de tr\u00e8s haut niveau sur m\u00e9gadonn\u00e9es (&gt;10M lignes). Modification possible par r\u00e9f\u00e9rence sans surco\u00fbt m\u00e9moire RAM.<\/li>\n<\/ul>\n<p>Le choix de l&rsquo;\u00e9cosyst\u00e8me technique d\u00e9pend ultimement des imp\u00e9ratifs propres au projet de recherche. Dans le cadre de d\u00e9veloppements de packages autonomes ou de scripts destin\u00e9s \u00e0 \u00eatre d\u00e9ploy\u00e9s sur des serveurs aux ressources hautement contraintes, le recours exclusif aux primitives de <em>Base R<\/em> s&rsquo;impose pour sanctuariser l&rsquo;absence totale de d\u00e9pendances externes et garantir une p\u00e9rennit\u00e9 d\u00e9cennale du code sans maintenance de biblioth\u00e8ques tierces. Dans un contexte de recherche clinique, d&rsquo;\u00e9pid\u00e9miologie universitaire ou de data science exploratoire o\u00f9 la lisibilit\u00e9 du code pour les pairs prime sur les millisecondes processeur, l&rsquo;infrastructure d\u00e9clarative du <em>Tidyverse<\/em> repr\u00e9sente le standard absolu d&rsquo;\u00e9l\u00e9gance et de maintenabilit\u00e9. Enfin, d\u00e8s lors que les structures matricielles franchissent les limites de charge de la m\u00e9moire conventionnelle, la transition vers l&rsquo;architecture de calcul optimis\u00e9e de <em>data.table<\/em> s&rsquo;\u00e9rige en n\u00e9cessit\u00e9 op\u00e9rationnelle incontournable.<\/p>\n<h3>12.2 Arbre d\u00e9cisionnel pour le nettoyage rigoureux des valeurs manquantes<\/h3>\n<p>Afin de syst\u00e9matiser la d\u00e9marche de l&rsquo;analyste face \u00e0 un jeu de donn\u00e9es lacunaire, nous formalisons ci-apr\u00e8s un protocole standardis\u00e9 articul\u00e9 autour de quatre \u00e9tapes d\u00e9cisionnelles s\u00e9quentielles, garantissant que chaque op\u00e9ration d&rsquo;\u00e9lagage repose sur un fondement m\u00e9thodologique inattaquable :<\/p>\n<p><strong>\u00c9tape 1 : Diagnostic structurel et cat\u00e9gorisation de l&rsquo;absence.<\/strong> L&rsquo;analyste proc\u00e8de \u00e0 une cartographie rigoureuse \u00e0 l&rsquo;aide de <em>rowSums(is.na(df))<\/em> et <em>table()<\/em>. Il discrimine formellement les lignes int\u00e9gralement vides de celles souffrant d&rsquo;une attrition partielle. Les lignes totalement vides sont imm\u00e9diatement purg\u00e9es \u00e0 l&rsquo;aide de l&rsquo;instruction <em>df[rowSums(is.na(df)) &lt; ncol(df), ]<\/em> ou <em>filter(if_any(everything(), ~ !is.na(.)))<\/em>. Cette \u00e9tape rel\u00e8ve de l&rsquo;assainissement technique fondamental et ne pr\u00e9sente aucun risque de biais statistique.<\/p>\n<p><strong>\u00c9tape 2 : Quantification de l&rsquo;attrition et v\u00e9rification des seuils critiques.<\/strong> L&rsquo;op\u00e9rateur \u00e9value la proportion globale d&rsquo;observations incompl\u00e8tes r\u00e9siduelles. Si le volume de lignes affect\u00e9es par au moins un <em>NA<\/em> repr\u00e9sente moins de 5 % du corpus et que les tests d&rsquo;ind\u00e9pendance confortent formellement l&rsquo;hypoth\u00e8se d&rsquo;un m\u00e9canisme purement al\u00e9atoire (MCAR), l&rsquo;application de la suppression compl\u00e8te par liste via <em>drop_na()<\/em> ou <em>complete.cases()<\/em> est m\u00e9thodologiquement admissible. En revanche, si le taux d&rsquo;attrition franchit ce seuil critique ou si les donn\u00e9es s&rsquo;inscrivent dans une logique de panel longitudinal, l&rsquo;amputation stricte doit \u00eatre formellement suspendue.<\/p>\n<p><strong>\u00c9tape 3 : Arbitrage entre ciblage conditionnel et mod\u00e9lisation alternative.<\/strong> Si l&rsquo;investigation empirique repose sur une variable d\u00e9pendante cardinale non imputable, l&rsquo;analyste restreint l&rsquo;\u00e9viction \u00e0 cet attribut unique au moyen de <em>df |&gt; drop_na(variable_cle)<\/em>. Si le m\u00e9canisme d&rsquo;incompl\u00e9tude est suspect\u00e9 d&rsquo;\u00eatre conditionnel (MAR) et concerne de multiples covariables, l&rsquo;analyste abandonne d\u00e9finitivement la suppression de lignes au profit d&rsquo;architectures d&rsquo;imputation stochastique multiple (MICE via le package <em>mice<\/em>) ou d&rsquo;estimations \u00e0 information maximale int\u00e9gr\u00e9e (FIML via le package <em>lavaan<\/em>).<\/p>\n<p><strong>\u00c9tape 4 : Validation, standardisation et documentation du jeu de donn\u00e9es assaini.<\/strong> \u00c0 l&rsquo;issue des op\u00e9rations d&rsquo;\u00e9viction retenues, l&rsquo;analyste ex\u00e9cute scrupuleusement le protocole de s\u00e9curisation post-filtrage : r\u00e9initialisation des noms de lignes (<em>row.names(df) &lt;- NULL<\/em>), purge syst\u00e9matique des modalit\u00e9s factorielles orphelines (<em>droplevels(df)<\/em>), et archivage des unit\u00e9s statistiques \u00e9vinc\u00e9es dans une table de m\u00e9tadonn\u00e9es d&rsquo;attrition. L&rsquo;ensemble de la cha\u00eene de transformation est consign\u00e9 au sein d&rsquo;un script R document\u00e9, structur\u00e9 de mani\u00e8re s\u00e9quentielle et h\u00e9berg\u00e9 sous un syst\u00e8me de contr\u00f4le de version, garantissant ainsi la conformit\u00e9 de l&rsquo;\u00e9tude avec les pr\u00e9ceptes de la science ouverte et de la parfaite reproductibilit\u00e9 computationnelle.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Little, R. J. A., &amp; Rubin, D. B. (2019). <em>Statistical Analysis with Missing Data<\/em> (3e \u00e9d.). John Wiley &amp; Sons. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1002\/9781119482865\">https:\/\/doi.org\/10.1002\/9781119482865<\/a><\/li>\n<li>Rubin, D. B. (1976). Inference and missing data. <em>Biometrika<\/em>, 63(3), 581\u2013590. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1093\/biomet\/63.3.581\">https:\/\/doi.org\/10.1093\/biomet\/63.3.581<\/a><\/li>\n<li>Schafer, J. L. (1997). <em>Analysis of Incomplete Multivariate Data<\/em>. Chapman and Hall\/CRC. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1201\/9781439821862\">https:\/\/doi.org\/10.1201\/9781439821862<\/a><\/li>\n<li>van Buuren, S. (2018). <em>Flexible Imputation of Missing Data<\/em> (2e \u00e9d.). 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>van Buuren, S., &amp; Groothuis-Oudshoorn, K. (2011). mice: Multivariate Imputation by Chained Equations in R. <em>Journal of Statistical Software<\/em>, 45(3), 1\u201367. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.18637\/jss.v045.i03\">https:\/\/doi.org\/10.18637\/jss.v045.i03<\/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., \u2026 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., &amp; Grolemund, G. (2017). <em>R for Data Science: Import, Tidy, Transform, Visualize, and Model Data<\/em>. O&rsquo;Reilly Media. <a rel=\"noopener noreferrer\" href=\"https:\/\/r4ds.had.co.nz\/\">https:\/\/r4ds.had.co.nz\/<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour identifier et supprimer les lignes contenant des valeurs manquantes partielles ou totales (NA) dans un data frame sous R.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[1829,2193],"tags":[5573,5575,5574,5576,5572],"class_list":["post-3569","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-statistique","category-programmation-r","tag-complete-cases","tag-donnees-manquantes-r","tag-drop_na-tidyr","tag-nettoyage-data-frame-r","tag-supprimer-lignes-na-r"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/3569","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=3569"}],"version-history":[{"count":0,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/3569\/revisions"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3569"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3569"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3569"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}