{"id":1578,"date":"2026-10-14T18:00:41","date_gmt":"2026-10-14T18:00:41","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-remplacer-na-par-chaines-de-caracteres-dans-r-exemples\/"},"modified":"2026-10-14T18:00:41","modified_gmt":"2026-10-14T18:00:41","slug":"comment-remplacer-na-par-chaines-de-caracteres-dans-r-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-remplacer-na-par-chaines-de-caracteres-dans-r-exemples","title":{"rendered":"Comment remplacer les NA par des cha\u00eenes de caract\u00e8res dans R (avec exemples)"},"content":{"rendered":"<p>Dans le champ contemporain de la recherche empirique et du traitement de donn\u00e9es quantitatives, l&rsquo;int\u00e9grit\u00e9 des corpus d&rsquo;information constitue le fondement sur lequel repose toute inf\u00e9rence statistique valide. Pourtant, les praticiens de la science des donn\u00e9es, les psychom\u00e9triciens et les analystes quantitatifs sont perp\u00e9tuellement confront\u00e9s \u00e0 l&rsquo;omnipr\u00e9sence des donn\u00e9es incompl\u00e8tes. Qu&rsquo;il s&rsquo;agisse de questionnaires psychom\u00e9triques administr\u00e9s en ligne, d&rsquo;enqu\u00eates \u00e9pid\u00e9miologiques longitudinales ou d&rsquo;essais cliniques multicentriques, l&rsquo;absence de r\u00e9ponse est une r\u00e9alit\u00e9 in\u00e9vitable du processus de recueil de donn\u00e9es humaines. Au sein de l&rsquo;environnement de calcul statistique <a rel=\"noopener noreferrer\" href=\"https:\/\/www.r-project.org\/\">R<\/a>, la gestion de ces vides informationnels requiert une compr\u00e9hension technique et conceptuelle particuli\u00e8rement rigoureuse, dans la mesure o\u00f9 l&rsquo;interpr\u00e9teur traite l&rsquo;absence d&rsquo;information comme un \u00e9tat logique singulier et non comme une simple cha\u00eene textuelle.<\/p>\n<p>La transformation des valeurs manquantes, d\u00e9sign\u00e9es formellement par le symbole r\u00e9serv\u00e9 <em>NA<\/em> (pour <em>Not Available<\/em>), en cha\u00eenes de caract\u00e8res explicites repr\u00e9sente une \u00e9tape pivot dans les flux de pr\u00e9paration et de nettoyage des donn\u00e9es (ou <em>data wrangling<\/em>). Si l&rsquo;imputation num\u00e9rique vise traditionnellement \u00e0 remplacer des manques par des valeurs plausibles en vue de calculs param\u00e9triques, la conversion d&rsquo;un statut d&rsquo;absence en une \u00e9tiquette textuelle telle que \u00ab Non renseign\u00e9 \u00bb, \u00ab Refus de r\u00e9pondre \u00bb ou \u00ab Inapplicable \u00bb r\u00e9pond \u00e0 un besoin fondamentalement diff\u00e9rent. Cette op\u00e9ration vise la lisibilit\u00e9 documentaire, la standardisation cat\u00e9gorielle pour les visualisations descriptives, et la qualification qualitative des motifs d&rsquo;absence au sein des protocoles de recherche.<\/p>\n<p>Ce guide exhaustif a \u00e9t\u00e9 con\u00e7u pour offrir une analyse approfondie et syst\u00e9matique des m\u00e9thodes permettant de substituer des cha\u00eenes de caract\u00e8res aux valeurs manquantes dans l&rsquo;\u00e9cosyst\u00e8me R. En parcourant les m\u00e9canismes sous-jacents du R de base, les fonctions sp\u00e9cialis\u00e9es du m\u00e9tapackage <a rel=\"noopener noreferrer\" href=\"https:\/\/www.tidyverse.org\/\">Tidyverse<\/a> telles que <code>replace_na()<\/code> de <em>tidyr<\/em> et <code>mutate()<\/code> de <em>dplyr<\/em>, ainsi que les subtilit\u00e9s inh\u00e9rentes aux vecteurs de facteurs g\u00e9r\u00e9s par <em>forcats<\/em>, ce manuel propose une d\u00e9marche m\u00e9thodique \u00e9prouv\u00e9e. Au-del\u00e0 des simples lignes de commande, les enjeux \u00e9pist\u00e9mologiques, m\u00e9thodologiques et statistiques de ces transformations sont examin\u00e9s afin de garantir des analyses reproductibles et conformes aux exigences acad\u00e9miques les plus strictes.<\/p>\n<h2>1. Introduction \u00e0 la gestion des donn\u00e9es manquantes en sciences psychologiques et statistiques<\/h2>\n<h3>1.1 Le d\u00e9fi \u00e9pist\u00e9mologique des donn\u00e9es manquantes en psychom\u00e9trie<\/h3>\n<p>Dans le domaine des sciences psychologiques, l&rsquo;administration d&rsquo;inventaires de personnalit\u00e9, d&rsquo;\u00e9chelles de bien-\u00eatre ou d&rsquo;\u00e9valuations cognitives confronte syst\u00e9matiquement le chercheur \u00e0 l&rsquo;incompl\u00e9tude des observations. Contrairement aux sciences physiques o\u00f9 l&rsquo;absence de mesure r\u00e9sulte souvent d&rsquo;une d\u00e9faillance d&rsquo;instrumentation facilement mod\u00e9lisable, la non-r\u00e9ponse humaine engage des processus psychologiques complexes. Un participant confront\u00e9 au questionnaire d&rsquo;inventaire de d\u00e9pression de Beck (BDI-II) ou au mod\u00e8le en cinq facteurs (NEO-PI-R) peut omettre d\u00e9lib\u00e9r\u00e9ment un item en raison de la d\u00e9sirabilit\u00e9 sociale, de l&rsquo;anxi\u00e9t\u00e9 d\u00e9clench\u00e9e par un contenu per\u00e7u comme intrusif, ou d&rsquo;une incompr\u00e9hension syntaxique de l&rsquo;\u00e9nonc\u00e9. Dans d&rsquo;autres situations, l&rsquo;omission rel\u00e8ve d&rsquo;une simple fatigue cognitive \u00e0 la fin d&rsquo;une longue batterie de tests psychom\u00e9triques.<\/p>\n<p>La taxonomie fondamentale th\u00e9oris\u00e9e par Donald Rubin \u00e9tablit une distinction cruciale entre trois m\u00e9canismes r\u00e9gissant les donn\u00e9es manquantes : le m\u00e9canisme enti\u00e8rement al\u00e9atoire (<em>Missing Completely at Random<\/em> ou MCAR), le m\u00e9canisme al\u00e9atoire (<em>Missing at Random<\/em> ou MAR) et le m\u00e9canisme non al\u00e9atoire (<em>Missing Not at Random<\/em> ou MNAR). Dans le cas du MCAR, la probabilit\u00e9 qu&rsquo;une donn\u00e9e soit manquante est totalement ind\u00e9pendante des variables observ\u00e9es et non observ\u00e9es. Dans le cas du MAR, cette probabilit\u00e9 d\u00e9pend d&rsquo;autres caract\u00e9ristiques mesur\u00e9es chez le participant (comme l&rsquo;\u00e2ge ou le niveau d&rsquo;anxi\u00e9t\u00e9 de base), mais pas de la valeur de la r\u00e9ponse omise elle-m\u00eame. Enfin, dans le sch\u00e9ma MNAR, la non-r\u00e9ponse est directement corr\u00e9l\u00e9e \u00e0 la variable latente que l&rsquo;item cherche \u00e0 mesurer ; par exemple, un individu manifestant un niveau s\u00e9v\u00e8re d&rsquo;id\u00e9ation suicidaire refusant sp\u00e9cifiquement de r\u00e9pondre \u00e0 l&rsquo;item \u00e9valuant ce sympt\u00f4me.<\/p>\n<p>L&rsquo;impact de la pr\u00e9sence de valeurs non attribu\u00e9es sur la fid\u00e9lit\u00e9 et la validit\u00e9 des \u00e9chelles de mesure est majeur. L&rsquo;omission de r\u00e9ponses alt\u00e8re le calcul de la coh\u00e9rence interne mesur\u00e9e par le coefficient alpha de Cronbach ou l&rsquo;om\u00e9ga de McDonald, et introduit des biais syst\u00e9matiques dans les analyses factorielles confirmatoires. Toutefois, dans les phases de restitution descriptive, les rapports cliniques individualis\u00e9s et les analyses qualitatives mixtes, ignorer la cause de l&rsquo;absence en \u00e9liminant les lignes incompl\u00e8tes (analyse par suppression de liste) constitue une erreur m\u00e9thodologique s\u00e9v\u00e8re. Il devient imp\u00e9ratif d&rsquo;op\u00e9rer une standardisation textuelle qui qualifie express\u00e9ment la nature de l&rsquo;omission, transformant le vide informatique en une modalit\u00e9 informative intelligible pour le clinicien et l&rsquo;auditeur statistique.<\/p>\n<h3>1.2 Repr\u00e9sentation formelle de l&rsquo;absence de donn\u00e9es dans l&rsquo;\u00e9cosyst\u00e8me R<\/h3>\n<p>Dans l&rsquo;architecture interne du langage R, l&rsquo;absence de donn\u00e9es est conceptualis\u00e9e au niveau le plus fondamental de l&rsquo;interpr\u00e9teur par la constante logique <code>NA<\/code>. Cette constante n&rsquo;est pas une simple cha\u00eene de caract\u00e8res contenant les lettres \u00ab N \u00bb et \u00ab A \u00bb, mais un indicateur scalaire d\u00e9signant une valeur inconnue ou non disponible. Pour maintenir l&rsquo;int\u00e9grit\u00e9 du syst\u00e8me de typage strict des vecteurs atomiques, R impl\u00e9mente en r\u00e9alit\u00e9 plusieurs d\u00e9clinaisons internes de cette valeur, notamment <code>NA_character_<\/code>, <code>NA_integer_<\/code>, <code>NA_real_<\/code> et <code>NA_complex_<\/code>. Bien que l&rsquo;utilisateur n&rsquo;\u00e9crive habituellement que <code>NA<\/code>, l&rsquo;interpr\u00e9teur assigne ou coerce dynamiquement cette entit\u00e9 vers la variante correspondant au type du conteneur parent.<\/p>\n<p>Il est primordial de distinguer rigoureusement <code>NA<\/code> des autres concepts d&rsquo;absence ou d&rsquo;anomalie num\u00e9rique sous R. L&rsquo;objet <code>NULL<\/code> repr\u00e9sente l&rsquo;absence totale de valeur ou un objet de longueur nulle, souvent renvoy\u00e9 par des fonctions dont l&rsquo;ex\u00e9cution ne produit aucun r\u00e9sultat. La valeur sp\u00e9ciale <code>NaN<\/code> (<em>Not a Number<\/em>) d\u00e9signe une ind\u00e9termination math\u00e9matique issue d&rsquo;une op\u00e9ration arithm\u00e9tique illicite, comme la division de z\u00e9ro par z\u00e9ro ou la racine carr\u00e9e d&rsquo;un nombre n\u00e9gatif dans le corps des r\u00e9els. Quant \u00e0 la cha\u00eene de caract\u00e8res vide, not\u00e9e <code>\"\"<\/code>, elle constitue une donn\u00e9e textuelle parfaitement d\u00e9finie et existante d&rsquo;une longueur de z\u00e9ro caract\u00e8re, mais dot\u00e9e d&rsquo;une r\u00e9alit\u00e9 en m\u00e9moire. Face \u00e0 ces diff\u00e9rentes entit\u00e9s, les fonctions statistiques standard telles que <code>mean()<\/code>, <code>sd()<\/code> ou <code>cor()<\/code> adoptent une r\u00e8gle stricte : en pr\u00e9sence d&rsquo;un seul \u00e9l\u00e9ment <code>NA<\/code>, le r\u00e9sultat de l&rsquo;\u00e9valuation renvoie in\u00e9vitablement <code>NA<\/code>, \u00e0 moins que le param\u00e8tre <code>na.rm = TRUE<\/code> ne soit formellement sp\u00e9cifi\u00e9.<\/p>\n<p>Transformer un indicateur logique <code>NA<\/code> en une \u00e9tiquette textuelle explicite r\u00e9pond \u00e0 des exigences pr\u00e9cises de communication et d&rsquo;ing\u00e9nierie des donn\u00e9es. Lorsqu&rsquo;une variable qualitative doit figurer dans un tableau r\u00e9capitulatif destin\u00e9 \u00e0 des praticiens non statisticiens, la mention litt\u00e9rale \u00ab Donn\u00e9e non renseign\u00e9e \u00bb \u00e9vite l&rsquo;ambigu\u00eft\u00e9 inh\u00e9rente \u00e0 l&rsquo;affichage brut de l&rsquo;interpr\u00e9teur. De surcro\u00eet, lors de l&rsquo;exportation de donn\u00e9es vers des formats tabulaires interm\u00e9diaires ou des syst\u00e8mes de gestion de bases de donn\u00e9es relationnelles, la conversion textuelle pr\u00e9vient les distorsions d&rsquo;interpr\u00e9tation o\u00f9 un <code>NA<\/code> pourrait \u00eatre erron\u00e9ment assimil\u00e9 par un logiciel tiers \u00e0 une cha\u00eene blanche ou au mot \u00ab NA \u00bb sans valeur s\u00e9mantique d&rsquo;absence.<\/p>\n<h3>1.3 Objectifs p\u00e9dagogiques et organisation m\u00e9thodologique de ce manuel<\/h3>\n<p>L&rsquo;objectif principal de ce manuel est de conf\u00e9rer au lecteur une autonomie technique totale pour identifier, manipuler et recoder les valeurs manquantes sous forme de cha\u00eenes de caract\u00e8res au sein de jeux de donn\u00e9es complexes. La ma\u00eetrise de ces comp\u00e9tences exige l&rsquo;acquisition raisonn\u00e9e des outils de l&rsquo;\u00e9cosyst\u00e8me Tidyverse, avec une focalisation prononc\u00e9e sur les packages <a rel=\"noopener noreferrer\" href=\"https:\/\/tidyr.tidyverse.org\/\">tidyr<\/a>, <a rel=\"noopener noreferrer\" href=\"https:\/\/dplyr.tidyverse.org\/\">dplyr<\/a> et <a rel=\"noopener noreferrer\" href=\"https:\/\/forcats.tidyverse.org\/\">forcats<\/a>. Ces extensions modernes de R ont transform\u00e9 l&rsquo;ing\u00e9nierie logicielle statistique en introduisant des syntaxes unifi\u00e9es, pr\u00e9visibles et hautement lisibles, indispensables \u00e0 la maintenance de pipelines analytiques au sein d&rsquo;\u00e9quipes de recherche multidisciplinaires.<\/p>\n<p>Afin de garantir une pratique scientifique rigoureuse, ce document s&rsquo;articule autour d&rsquo;une approche comparative syst\u00e9matique. Les solutions contemporaines offertes par le Tidyverse seront minutieusement confront\u00e9es aux techniques du R de base. Cette mise en perspective permettra d&rsquo;\u00e9valuer les compromis entre lisibilit\u00e9 syntaxique, d\u00e9pendance logicielle et efficacit\u00e9 computationnelle sur des structures de donn\u00e9es de taille massive. Une attention particuli\u00e8re sera allou\u00e9e \u00e0 la r\u00e9solution des anomalies classiques, telles que l&rsquo;injection accidentelle de cha\u00eenes textuelles au sein de colonnes structur\u00e9es sous forme de facteurs ordonn\u00e9s ou cat\u00e9goriels, une source fr\u00e9quente de blocages dans les scripts d&rsquo;analyse.<\/p>\n<p>La progression m\u00e9thodologique de l&rsquo;ouvrage s&rsquo;appuie sur des cas d&rsquo;usage directement inspir\u00e9s de cohortes empiriques en psychologie quantitative. Qu&rsquo;il s&rsquo;agisse de g\u00e9rer des donn\u00e9es sociod\u00e9mographiques incompl\u00e8tes, d&rsquo;harmoniser les non-r\u00e9ponses d&rsquo;inventaires psychom\u00e9triques multidimensionnels ou d&rsquo;assainir des verbatim textuels issus d&rsquo;entretiens cliniques structur\u00e9s, chaque proc\u00e9d\u00e9 technique sera illustr\u00e9 par des exemples complets, reproductibles et imm\u00e9diatement transf\u00e9rables \u00e0 des protocoles de recherche fondamentale ou appliqu\u00e9e.<\/p>\n<h2>2. Fondements techniques : La structure des valeurs NA dans les vecteurs R<\/h2>\n<h3>2.1 Typologie interne et coercition des valeurs manquantes<\/h3>\n<p>Pour appr\u00e9hender sereinement le remplacement des valeurs manquantes par du texte, il convient d&rsquo;examiner la mani\u00e8re dont le moteur de R g\u00e8re l&rsquo;allocation m\u00e9moire des vecteurs atomiques. Tout vecteur dans R poss\u00e8de un type unique et invariable une fois allou\u00e9. Les principaux types de base sont les types logique (<em>logical<\/em>), entier (<em>integer<\/em>), r\u00e9el (<em>double<\/em>) et cha\u00eene de caract\u00e8res (<em>character<\/em>). La constante g\u00e9n\u00e9rique <code>NA<\/code> est, par d\u00e9faut, de type logique. Lorsqu&rsquo;elle est ins\u00e9r\u00e9e dans un vecteur num\u00e9rique ou textuel, l&rsquo;interpr\u00e9teur effectue une coercition implicite et silencieuse vers la variante interne correspondante. Dans le cadre pr\u00e9cis d&rsquo;un vecteur textuel, l&rsquo;\u00e9l\u00e9ment manquant devient formellement <code>NA_character_<\/code>.<\/p>\n<p>Cette distinction interne est cruciale lors de l&rsquo;application de fonctions bas niveau. La commande <code>typeof(NA)<\/code> renvoie la cha\u00eene <code>\"logical\"<\/code>, tandis que <code>typeof(NA_character_)<\/code> confirme le type <code>\"character\"<\/code>. Les fonctions diagnostiques <code>class()<\/code> et <code>mode()<\/code> permettent \u00e9galement d&rsquo;inspecter la nature des objets manipul\u00e9s. Lorsque l&rsquo;analyste d\u00e9cide d&rsquo;injecter une cha\u00eene de caract\u00e8res, par exemple le mot \u00ab Absent \u00bb, dans un vecteur pr\u00e9existant contenant des valeurs <code>NA<\/code>, le m\u00e9canisme de coercition automatique de R s&rsquo;active. Si le vecteur d&rsquo;origine \u00e9tait num\u00e9rique (contenant des entiers ou des r\u00e9els), la tentative d&rsquo;insertion d&rsquo;un texte entra\u00eene la conversion irr\u00e9versible de l&rsquo;ensemble du vecteur vers le type cha\u00eene de caract\u00e8res, privant l&rsquo;analyste de toute possibilit\u00e9 ult\u00e9rieure d&rsquo;ex\u00e9cuter des calculs arithm\u00e9tiques sans reconversion pr\u00e9alable.<\/p>\n<p>Les risques d&rsquo;incompatibilit\u00e9 de type lors d&rsquo;assignations non contr\u00f4l\u00e9es constituent l&rsquo;une des causes les plus courantes d&rsquo;instabilit\u00e9 des scripts scientifiques. Si une colonne d&rsquo;\u00e2ge au sein d&rsquo;une base de donn\u00e9es m\u00e9dicale contient des entiers et des <code>NA<\/code>, substituer ces derniers par la cha\u00eene \u00ab Inconnu \u00bb transformera l&rsquo;int\u00e9gralit\u00e9 de la colonne en vecteur textuel. L&rsquo;ex\u00e9cution subs\u00e9quente d&rsquo;une commande d&rsquo;ajustement de mod\u00e8le lin\u00e9aire comme <code>lm()<\/code> \u00e9chouera ou traitera l&rsquo;\u00e2ge comme une variable qualitative non ordonn\u00e9e \u00e0 multiples niveaux, faussant dramatiquement les degr\u00e9s de libert\u00e9 et les estimations de variance. D\u00e8s lors, toute substitution textuelle d&rsquo;un <code>NA<\/code> doit faire l&rsquo;objet d&rsquo;une r\u00e9flexion pr\u00e9alable sur la vocation de la colonne concern\u00e9e.<\/p>\n<h3>2.2 L&rsquo;\u00e9valuation logique avec is.na() versus les op\u00e9rateurs d&rsquo;\u00e9galit\u00e9<\/h3>\n<p>Une incompr\u00e9hension fr\u00e9quente chez les utilisateurs d\u00e9butants et interm\u00e9diaires de R concerne l&rsquo;application des op\u00e9rateurs de comparaison relationnelle face aux donn\u00e9es manquantes. Il est math\u00e9matiquement et logiquement incorrect de tenter d&rsquo;isoler des valeurs manquantes au moyen de l&rsquo;expression <code>x == NA<\/code>. Dans la logique ternaire adopt\u00e9e par R (vrai, faux, inconnu), comparer une entit\u00e9 inconnue \u00e0 une autre entit\u00e9 inconnue produit n\u00e9cessairement une ind\u00e9termination logique. En cons\u00e9quence, l&rsquo;expression <code>x == NA<\/code> n&rsquo;\u00e9value aucun \u00e9l\u00e9ment \u00e0 <code>TRUE<\/code> ou <code>FALSE<\/code>, mais retourne syst\u00e9matiquement un vecteur de m\u00eame dimension enti\u00e8rement compos\u00e9 de valeurs <code>NA<\/code>.<\/p>\n<p>Pour \u00e9valuer de mani\u00e8re fiable et d\u00e9terministe la pr\u00e9sence de valeurs non attribu\u00e9es, R met \u00e0 disposition la primitive vectoris\u00e9e <code>is.na()<\/code>. Cette fonction parcourt le vecteur pass\u00e9 en argument et teste l&rsquo;\u00e9tat d&rsquo;absence de chaque \u00e9l\u00e9ment au niveau binaire interne. Elle renvoie invariablement un vecteur bool\u00e9en o\u00f9 la valeur <code>TRUE<\/code> signale une case vide et <code>FALSE<\/code> une case occup\u00e9e par une donn\u00e9e valide. Par exemple, si l&rsquo;on applique cette commande \u00e0 un vecteur combinant du texte et des manques, l&rsquo;expression <code>is.na(c(\"Paris\", NA, \"Lyon\"))<\/code> produira sans ambigu\u00eft\u00e9 <code>c(FALSE, TRUE, FALSE)<\/code>.<\/p>\n<p>L&rsquo;utilisation combin\u00e9e de <code>is.na()<\/code> avec l&rsquo;op\u00e9rateur de n\u00e9gation logique, repr\u00e9sent\u00e9 par le point d&rsquo;exclamation <code>!is.na(x)<\/code>, constitue la base de tout filtrage visant \u00e0 extraire exclusivement les observations compl\u00e8tes. Sur le plan de la performance computationnelle, <code>is.na()<\/code> est une fonction native \u00e9crite en langage C, hautement optimis\u00e9e pour le traitement par lots en m\u00e9moire vive. Son ex\u00e9cution sur des matrices ou des data frames comportant des millions de lignes s&rsquo;op\u00e8re en une fraction de seconde, minimisant l&#8217;empreinte processeur par rapport \u00e0 des boucles it\u00e9ratives d&rsquo;inspection scalaire. Cette efficacit\u00e9 fait de <code>is.na()<\/code> la pierre angulaire des m\u00e9thodes traditionnelles de remplacement de donn\u00e9es que nous d\u00e9taillerons dans les sections consacr\u00e9es au R de base.<\/p>\n<h2>3. La m\u00e9thode moderne avec tidyr : Ma\u00eetriser la fonction replace_na()<\/h2>\n<h3>3.1 Architecture et syntaxe g\u00e9n\u00e9rale de replace_na()<\/h3>\n<p>Le package <a rel=\"noopener noreferrer\" href=\"https:\/\/tidyr.tidyverse.org\/\">tidyr<\/a>, composant central du m\u00e9tapackage Tidyverse maintenu par Posit, a \u00e9t\u00e9 sp\u00e9cialement d\u00e9velopp\u00e9 pour ordonner et restructurer les donn\u00e9es tabulaires selon les principes du <em>tidy data<\/em> \u00e9nonc\u00e9s par Hadley Wickham. Au sein de cette biblioth\u00e8que, la fonction <code>replace_na()<\/code> se positionne comme l&rsquo;outil d\u00e9di\u00e9 par excellence \u00e0 l&rsquo;imputation de remplacement. Sa signature formelle est d&rsquo;une grande sobri\u00e9t\u00e9 : elle accepte en premier argument <code>data<\/code>, repr\u00e9sentant un vecteur atomique ou un data frame (ou tibble), et en second argument <code>replace<\/code>, sp\u00e9cifiant la ou les valeurs de substitution.<\/p>\n<p>L&rsquo;une des forces majeures de <code>replace_na()<\/code> r\u00e9side dans son polymorphisme ma\u00eetris\u00e9. Lorsqu&rsquo;elle est appliqu\u00e9e \u00e0 un vecteur isol\u00e9, l&rsquo;argument <code>replace<\/code> requiert un scalaire unique du m\u00eame type que le vecteur d&rsquo;entr\u00e9e. En revanche, lorsqu&rsquo;elle traite un tableau de donn\u00e9es dans son ensemble, elle attend une liste nomm\u00e9e associant chaque d\u00e9signation de colonne \u00e0 sa valeur d&rsquo;imputation sp\u00e9cifique. Cette conception modulaire s&rsquo;articule parfaitement avec les flux de travail utilisant l&rsquo;op\u00e9rateur de cha\u00eenage classique <code>%&gt;%<\/code> du package magrittr ou l&rsquo;op\u00e9rateur de pipe natif <code>|&gt;<\/code> introduit dans la version 4.1.0 du moteur R.<\/p>\n<p>Dans le contexte de projets de recherche clinique et d&rsquo;\u00e9tudes translationnelles, la lisibilit\u00e9 du code conditionne directement l&rsquo;auditabilit\u00e9 des r\u00e9sultats par des tiers. L&#8217;emploi de <code>replace_na()<\/code> \u00e9vite les syntaxes verbeuses et r\u00e9p\u00e9titives d&rsquo;indexation matricielle qui encombrent traditionnellement les scripts. La clart\u00e9 d\u00e9clarative offerte par cette fonction garantit que toute personne examinant le pipeline d&rsquo;analyse peut identifier imm\u00e9diatement quelle colonne fait l&rsquo;objet d&rsquo;une substitution, quelle valeur textuelle sp\u00e9cifique est ins\u00e9r\u00e9e et comment les typages de sortie sont pr\u00e9serv\u00e9s.<\/p>\n<h3>3.2 Environnement d&rsquo;ex\u00e9cution et pr\u00e9requis d&rsquo;installation<\/h3>\n<p>Pour mettre en \u0153uvre les instructions pr\u00e9sent\u00e9es dans ce guide, l&rsquo;installation pr\u00e9alable des biblioth\u00e8ques logicielles requises doit \u00eatre valid\u00e9e. Le moyen le plus direct consiste \u00e0 installer la suite Tidyverse via le gestionnaire officiel du Comprehensive R Archive Network (CRAN). Cette proc\u00e9dure s&rsquo;effectue au moyen de la commande <code>install.packages(\"tidyverse\")<\/code> ou, si l&rsquo;on souhaite limiter le t\u00e9l\u00e9chargement aux composants strictement indispensables, par l&rsquo;installation isol\u00e9e de <em>tidyr<\/em> et de <em>dplyr<\/em> via <code>install.packages(c(\"tidyr\", \"dplyr\", \"forcats\", \"stringr\"))<\/code>.<\/p>\n<p>Dans un cadre acad\u00e9mique soucieux de reproductibilit\u00e9 \u00e0 long terme, la gestion stricte de l&rsquo;arbre des d\u00e9pendances logicielles repr\u00e9sente un imp\u00e9ratif m\u00e9thodologique. L&rsquo;utilisation du package <code>renv<\/code> est vivement recommand\u00e9e pour capturer l&rsquo;\u00e9tat exact des versions de packages mobilis\u00e9es au moment des calculs. L&rsquo;initialisation d&rsquo;un environnement herm\u00e9tique avec <code>renv::init()<\/code> assure que les scripts ex\u00e9cut\u00e9s sur une machine locale conserveront un comportement absolument identique lorsqu&rsquo;ils seront compil\u00e9s ult\u00e9rieurement sur un serveur de calcul ou une station de travail ind\u00e9pendante.<\/p>\n<p>Afin de concr\u00e9tiser notre apprentissage \u00e0 travers des manipulations v\u00e9rifiables, construisons un jeu de donn\u00e9es synth\u00e9tique repr\u00e9sentatif d&rsquo;une cohorte \u00e9valu\u00e9e en psychologie de la sant\u00e9. Ce data frame, baptis\u00e9 <code>cohorte_psy<\/code>, regroupe des variables textuelles, cat\u00e9gorielles et num\u00e9riques comportant diverses formes d&rsquo;incompl\u00e9tude intentionnelle :<\/p>\n<p>Pour initialiser ce tableau de d\u00e9monstration dans une session active de R, l&rsquo;analyste ex\u00e9cute le script suivant :<\/p>\n<p><code>library(tidyr)<\/code><br \/>\n<code>library(dplyr)<\/code><br \/>\n<code>cohorte_psy &lt;- data.frame(id = 101:105, statut_marital = c(\"Mari\u00e9\", NA, \"S\u00e9par\u00e9\", \"C\u00e9libataire\", NA), diagnostic = c(\"Anxi\u00e9t\u00e9\", \"D\u00e9pression\", NA, NA, \"Trouble bipolaire\"), score_bdi = c(14, 28, NA, 9, 32), stringsAsFactors = FALSE)<\/code><\/p>\n<p>L&rsquo;inspection pr\u00e9alable de la matrice d&rsquo;incompl\u00e9tude s&rsquo;op\u00e8re imm\u00e9diatement en sollicitant les fonctions standard <code>str(cohorte_psy)<\/code> et <code>summary(cohorte_psy)<\/code>. La commande <code>str()<\/code> confirme que les colonnes <code>statut_marital<\/code> et <code>diagnostic<\/code> sont bien stock\u00e9es comme des vecteurs de cha\u00eenes de caract\u00e8res (type <code>chr<\/code>), tandis que <code>summary()<\/code> quantifie la proportion de <code>NA<\/code> par colonne, fournissant un bilan descriptif avant toute tentative de manipulation corrective.<\/p>\n<h2>4. Remplacement des NA par une cha\u00eene dans une colonne unique<\/h2>\n<h3>4.1 Application cibl\u00e9e sur un vecteur isol\u00e9 ou une variable de data frame<\/h3>\n<p>Lorsqu&rsquo;une proc\u00e9dure de traitement impose de ne corriger qu&rsquo;une seule dimension qualitative au sein d&rsquo;une structure rectangulaire, <code>replace_na()<\/code> offre une solution syntaxique directe. Consid\u00e9rons la variable <code>statut_marital<\/code> de notre tableau t\u00e9moin. Dans de nombreuses enqu\u00eates d\u00e9mographiques, laisser ces cellules vides cr\u00e9e une incertitude analytique quant \u00e0 la r\u00e9ception du questionnaire. Pour remplacer ces manques par une \u00e9tiquette non ambigu\u00eb telle que \u00ab Information non communiqu\u00e9e \u00bb, la syntaxe \u00e9l\u00e9mentaire requiert de cibler le vecteur par l&rsquo;op\u00e9rateur d&rsquo;extraction <code>$<\/code>.<\/p>\n<p>L&rsquo;ex\u00e9cution de la commande prend la forme suivante :<\/p>\n<p><code>cohorte_psy<span class=\"arabpsy-math-inline\" data-latex=\"statut_marital &lt;- replace_na(cohorte_psy\">$statut_marital &lt;- replace_na(cohorte_psy$<\/span>statut_marital, \"Information non communiqu\u00e9e\")<\/code><\/p>\n<p>Cette instruction isole le vecteur textuel, identifie l&rsquo;ensemble des positions o\u00f9 <code>is.na()<\/code> est v\u00e9rifi\u00e9, substitue la cha\u00eene fournie en second argument aux indices correspondants, et r\u00e9assigne le vecteur transform\u00e9 au sein du data frame d&rsquo;origine. Il convient d&rsquo;observer que cette manipulation s&rsquo;ex\u00e9cute de mani\u00e8re vectoris\u00e9e et n&rsquo;alt\u00e8re en rien la longueur initiale de la colonne ni l&rsquo;alignement ordinal des lignes adjacentes.<\/p>\n<p>Pour les praticiens qui privil\u00e9gient un flux lin\u00e9aire continu \u00e9vitant la r\u00e9p\u00e9tition du nom de l&rsquo;objet, l&rsquo;op\u00e9rateur de pipe permet d&rsquo;obtenir un r\u00e9sultat fonctionnellement \u00e9quivalent :<\/p>\n<p><code>cohorte_psy<span class=\"arabpsy-math-inline\" data-latex=\"statut_marital &lt;- cohorte_psy\">$statut_marital &lt;- cohorte_psy$<\/span>statut_marital |&gt; replace_na(\"Information non communiqu\u00e9e\")<\/code><\/p>\n<p>La validation empirique du recodage s&rsquo;effectue sans d\u00e9lai au moyen de la fonction <code>table()<\/code>, en prenant soin d&rsquo;expliciter l&rsquo;argument <code>useNA = \"always\"<\/code> :<\/p>\n<p><code>table(cohorte_psy$statut_marital, useNA = \"always\")<\/code><\/p>\n<p>Ce diagnostic crois\u00e9 atteste de la disparition compl\u00e8te des occurrences <code>&lt;NA&gt;<\/code> dans la table de fr\u00e9quences et de l&rsquo;apparition distincte de la modalit\u00e9 textuelle nouvellement cr\u00e9\u00e9e, confirmant l&rsquo;imputation sans compromission de la structure globale du tableau.<\/p>\n<h3>4.2 Exemple pratique d\u00e9taill\u00e9 : Recodage du statut d\u00e9mographique<\/h3>\n<p>Analysons en d\u00e9tail les effets d&rsquo;une telle op\u00e9ration au moyen d&rsquo;un cas empirique d&rsquo;\u00e9valuation clinique. Consid\u00e9rons une cohorte de patients admis dans un service de consultation pour troubles de l&rsquo;humeur. La variable <code>diagnostic<\/code> pr\u00e9sente plusieurs valeurs manquantes, correspondant \u00e0 des cas o\u00f9 l&rsquo;investigation psychiatrique est toujours en cours d&rsquo;\u00e9valuation diagnostique au moment du gel de la base de donn\u00e9es. Conserver la mention <code>NA<\/code> pourrait induire le lecteur d&rsquo;un rapport interm\u00e9diaire en erreur en laissant supposer une omission de saisie.<\/p>\n<p>Proc\u00e9dons au remplacement m\u00e9thodique des valeurs manquantes par la mention explicite \u00ab Bilan en attente \u00bb :<\/p>\n<p><code>cohorte_psy<span class=\"arabpsy-math-inline\" data-latex=\"diagnostic &lt;- replace_na(cohorte_psy\">$diagnostic &lt;- replace_na(cohorte_psy$<\/span>diagnostic, \"Bilan en attente\")<\/code><\/p>\n<p>Examinons l&rsquo;\u00e9tat comparatif de notre jeu de donn\u00e9es. Avant l&rsquo;ex\u00e9cution, les lignes 3 et 4 du tableau pr\u00e9sentaient la valeur <code>NA<\/code> dans la colonne <code>diagnostic<\/code>. Apr\u00e8s l&rsquo;assignation, l&rsquo;impression du tableau via <code>print(cohorte_psy)<\/code> r\u00e9v\u00e8le la pr\u00e9sence effective de la cha\u00eene \u00ab Bilan en attente \u00bb aux indices 3 et 4. Pendant ce temps, la colonne <code>score_bdi<\/code>, qui mesure l&rsquo;intensit\u00e9 de la symptomatologie d\u00e9pressive \u00e0 l&rsquo;aide d&rsquo;une \u00e9chelle continue, demeure strictement intacte avec sa valeur <code>NA<\/code> d&rsquo;origine pr\u00e9serv\u00e9e \u00e0 la ligne 3.<\/p>\n<p>Cet exemple met en lumi\u00e8re un principe directeur fondamental de la gestion des donn\u00e9es scientifiques : l&rsquo;imputation s\u00e9lective. Les colonnes textuelles ou descriptives peuvent \u00eatre enrichies de libell\u00e9s s\u00e9mantiques explicites sans contaminer ni forcer la modification des colonnes num\u00e9riques contigu\u00ebs. L&rsquo;int\u00e9grit\u00e9 du vecteur <code>score_bdi<\/code> garantit que si des mod\u00e9lisations statistiques ult\u00e9rieures (telles que des analyses de r\u00e9gression ou des comparaisons de moyennes par test de Student) sont ex\u00e9cut\u00e9es, les param\u00e8tres math\u00e9matiques d&rsquo;exclusion des valeurs manquantes continueront d&rsquo;op\u00e9rer rigoureusement sans g\u00e9n\u00e9rer d&rsquo;erreurs de calcul arithm\u00e9tique.<\/p>\n<h3>4.3 Pi\u00e8ges courants lors de l&rsquo;application unidirectionnelle<\/h3>\n<p>En d\u00e9pit de son apparente simplicit\u00e9, l&rsquo;application unidirectionnelle de <code>replace_na()<\/code> est le th\u00e9\u00e2tre de maladresses syntaxiques fr\u00e9quentes chez les chercheurs. Le premier pi\u00e8ge r\u00e9side dans l&rsquo;omission pure et simple de la r\u00e9assignation du r\u00e9sultat. Dans l&rsquo;\u00e9cosyst\u00e8me R, la tr\u00e8s grande majorit\u00e9 des fonctions sont d\u00e9pourvues d&rsquo;effets de bord par mutation directe en place (<em>in-place modification<\/em>), conform\u00e9ment au paradigme de la programmation fonctionnelle pure. Ainsi, ex\u00e9cuter simplement :<\/p>\n<p><code>replace_na(cohorte_psy$statut_marital, \"Non renseign\u00e9\")<\/code><\/p>\n<p>affiche le vecteur modifi\u00e9 dans la console interactive sans pour autant mettre \u00e0 jour l&rsquo;objet <code>cohorte_psy<\/code> stock\u00e9 dans la m\u00e9moire de la session R. Si l&rsquo;analyste consulte ensuite son tableau avec <code>head(cohorte_psy)<\/code>, il constatera avec stupeur que les <code>NA<\/code> subsistent. L&rsquo;assignation formelle via l&rsquo;op\u00e9rateur <code>&lt;-<\/code> est imp\u00e9rative pour acter la persistance des modifications en m\u00e9moire vive.<\/p>\n<p>Un deuxi\u00e8me \u00e9cueil concerne la confusion structurelle entre un vecteur isol\u00e9 et un objet de type <code>tibble<\/code> ou <code>data.frame<\/code> \u00e0 colonne unique. Si l&rsquo;on applique accidentellement une syntaxe d&rsquo;extraction par doubles crochets ou s\u00e9lection tidyselect sans extraire la colonne sous forme atomique, <code>replace_na()<\/code> interpr\u00e9tera l&rsquo;objet d&rsquo;entr\u00e9e comme un tableau de donn\u00e9es et non comme un vecteur simple. Dans cette situation, passer une cha\u00eene de caract\u00e8res scalaire en second argument au lieu d&rsquo;une liste d\u00e9clenchera une erreur explicite signalant que pour un data frame, l&rsquo;argument de remplacement doit imp\u00e9rativement \u00eatre une structure en liste.<\/p>\n<p>Le troisi\u00e8me pi\u00e8ge, et certainement le plus d\u00e9routant, d\u00e9coule de la manipulation de colonnes implicitement encod\u00e9es comme des facteurs cat\u00e9goriels. Dans les versions de R ant\u00e9rieures \u00e0 la version 4.0.0, l&rsquo;argument <code>stringsAsFactors<\/code> \u00e9tait configur\u00e9 par d\u00e9faut sur <code>TRUE<\/code> lors de l&rsquo;importation de fichiers textes avec <code>read.table()<\/code> ou <code>read.csv()<\/code>. Si une colonne de statut est un facteur et que l&rsquo;analyste tente de substituer un <code>NA<\/code> par une cha\u00eene de caract\u00e8res qui ne figure pas d\u00e9j\u00e0 dans les niveaux pr\u00e9d\u00e9finis du facteur (les <em>levels<\/em>), l&rsquo;op\u00e9ration \u00e9choue silencieusement ou g\u00e9n\u00e8re l&rsquo;avertissement redout\u00e9 <code>invalid factor level, NA generated<\/code>, recr\u00e9ant un nouveau <code>NA<\/code> \u00e0 la place m\u00eame de la modification attendue. Nous r\u00e9soudrons exhaustivement cette probl\u00e9matique dans la section d\u00e9di\u00e9e aux facteurs.<\/p>\n<h2>5. Remplacement simultan\u00e9 des NA dans plusieurs colonnes textuelles<\/h2>\n<h3>5.1 Utilisation de structures en liste dans replace_na()<\/h3>\n<p>Lorsque le corpus de donn\u00e9es comprend de multiples dimensions qualitatives n\u00e9cessitant un assainissement concert\u00e9, proc\u00e9der par assignations individuelles successives devient laborieux, in\u00e9l\u00e9gant et source de duplications de code contraires aux principes du g\u00e9nie logiciel statistique. La fonction <code>replace_na()<\/code> r\u00e9sout \u00e9l\u00e9gamment cette contrainte par sa capacit\u00e9 \u00e0 recevoir un tableau de donn\u00e9es entier comme premier argument, coupl\u00e9 \u00e0 une liste de param\u00e8tres de substitution nomm\u00e9e en second argument.<\/p>\n<p>L&rsquo;architecture interne de cette modalit\u00e9 d&rsquo;utilisation repose sur l&rsquo;association directe entre les cl\u00e9s de la liste et les noms stricts des colonnes du tableau. Si une variable pr\u00e9sente dans le data frame n&rsquo;appara\u00eet pas dans la liste de configuration fournie, <code>replace_na()<\/code> la traverse simplement sans y apporter la moindre alt\u00e9ration. \u00c0 l&rsquo;inverse, toute variable d\u00e9sign\u00e9e dans la liste se voit appliquer la cha\u00eene ou la valeur sp\u00e9cifique qui lui a \u00e9t\u00e9 allou\u00e9e. La signature conceptuelle de cette instruction s&rsquo;\u00e9crit de la mani\u00e8re suivante :<\/p>\n<p><code>tableau_nettoye &lt;- tableau_brut |&gt; replace_na(list(colonne_A = \"Remplacement A\", colonne_B = \"Remplacement B\"))<\/code><\/p>\n<p>Cette approche pr\u00e9sente l&rsquo;avantage consid\u00e9rable d&rsquo;autoriser une diff\u00e9renciation s\u00e9mantique fine selon la nature \u00e9pist\u00e9mologique de chaque variable. L&rsquo;analyste n&rsquo;est pas contraint d&rsquo;appliquer une \u00e9tiquette g\u00e9n\u00e9rique indistincte \u00e0 l&rsquo;ensemble du fichier. Une colonne d&rsquo;ant\u00e9c\u00e9dents m\u00e9dicaux pourra ainsi se voir attribuer la mention \u00ab Aucun ant\u00e9c\u00e9dent r\u00e9pertori\u00e9 \u00bb, tandis qu&rsquo;une colonne mesurant le niveau d&rsquo;instruction recevra l&rsquo;\u00e9tiquette \u00ab Degr\u00e9 scolaire non communiqu\u00e9 \u00bb. Le traitement global gagne \u00e0 la fois en coh\u00e9rence documentaire et en pr\u00e9cision terminologique.<\/p>\n<h3>5.2 Exemple pratique multi-variables : Statut socio-\u00e9conomique et niveau d&rsquo;\u00e9tudes<\/h3>\n<p>Illustrons cette m\u00e9thodologie avanc\u00e9e \u00e0 l&rsquo;aide d&rsquo;un cas repr\u00e9sentatif d&rsquo;une enqu\u00eate \u00e9pid\u00e9miologique en population g\u00e9n\u00e9rale. Imaginons un jeu de donn\u00e9es contenant les variables d\u00e9mographiques <code>profession<\/code>, <code>diplome<\/code> et <code>revenu_annuel<\/code> mesur\u00e9es aupr\u00e8s de six participants, tel que structur\u00e9 ci-dessous :<\/p>\n<p><code>enquete_socio &lt;- data.frame(participant = paste0(\"P\", 1:6), profession = c(\"Enseignant\", NA, \"Ouvrier\", \"Cadre\", NA, \"Retrait\u00e9\"), diplome = c(\"Master\", \"Baccalaur\u00e9at\", NA, \"Doctorat\", NA, \"Licence\"), revenu_annuel = c(34000, 22000, NA, 58000, 19000, NA), stringsAsFactors = FALSE)<\/code><\/p>\n<p>Dans ce protocole, nous souhaitons que les valeurs manquantes de la colonne <code>profession<\/code> soient cod\u00e9es par l&rsquo;intitul\u00e9 \u00ab Sans activit\u00e9 ou non d\u00e9clar\u00e9e \u00bb, tandis que les manques de la variable <code>diplome<\/code> doivent porter la mention \u00ab Donn\u00e9e \u00e9ducative absente \u00bb. Crucialement, la variable <code>revenu_annuel<\/code>, qui est de nature strictement quantitative continue (relev\u00e9 en euros), ne doit en aucun cas \u00eatre transform\u00e9e en texte afin de pr\u00e9server l&rsquo;aptitude ult\u00e9rieure \u00e0 calculer le revenu moyen ou l&rsquo;\u00e9cart-type de la cohorte.<\/p>\n<p>La commande group\u00e9e s&rsquo;ex\u00e9cute avec une parfaite limpidit\u00e9 :<\/p>\n<p><code>enquete_nettoyee &lt;- enquete_socio |&gt; replace_na(list(profession = \"Sans activit\u00e9 ou non d\u00e9clar\u00e9e\", diplome = \"Donn\u00e9e \u00e9ducative absente\"))<\/code><\/p>\n<p>L&rsquo;examen du nouvel objet <code>enquete_nettoyee<\/code> d\u00e9montre l&rsquo;efficacit\u00e9 chirurgicale du processus. Les colonnes qualitatives cibl\u00e9es ont int\u00e9gr\u00e9 leurs libell\u00e9s explicites respectifs l\u00e0 o\u00f9 si\u00e9geaient auparavant des <code>NA<\/code>. Simultan\u00e9ment, la colonne <code>revenu_annuel<\/code> conserve ses cellules <code>NA<\/code> natives de type <code>double<\/code>, parfaitement identifiables par les fonctions d&rsquo;estimation param\u00e9trique. Le tableau final respecte \u00e0 la perfection le format attendu pour une restitution documentaire institutionnelle ou pour la transition vers des mod\u00e8les d&rsquo;\u00e9quations structurelles o\u00f9 les indicateurs cat\u00e9goriels et continus sont sp\u00e9cifi\u00e9s distinctement.<\/p>\n<h3>5.3 Scalabilit\u00e9 et maintenance du code pour grands questionnaires<\/h3>\n<p>Dans le cadre de projets d&rsquo;envergure impliquant des questionnaires psychom\u00e9triques de grande \u00e9chelle \u2014 tels que le Minnesota Multiphasic Personality Inventory (MMPI) qui compte plus de cinq cents items, ou des cohortes \u00e9pid\u00e9miologiques longitudinales compilant des dizaines de mesures subjectives \u2014, la r\u00e9daction manuelle d&rsquo;une liste de substitution pour chaque variable devient insoutenable et hautement vuln\u00e9rable aux fautes typographiques.<\/p>\n<p>Pour r\u00e9soudre cette contrainte de scalabilit\u00e9 logicielle, le chercheur peut g\u00e9n\u00e9rer la liste de remplacement de fa\u00e7on enti\u00e8rement programmatique en combinant les fonctions de manipulation de noms de colonnes et les utilitaires fonctionnels du package <a rel=\"noopener noreferrer\" href=\"https:\/\/purrr.tidyverse.org\/\">purrr<\/a>. Supposons que l&rsquo;on dispose d&rsquo;une base de donn\u00e9es contenant cinquante colonnes textuelles d&rsquo;items subjectifs dont les noms partagent le m\u00eame pr\u00e9fixe conventionnel, par exemple <code>item_01<\/code> jusqu&rsquo;\u00e0 <code>item_50<\/code>. Nous pouvons identifier automatiquement ces colonnes et leur associer un dictionnaire de remplacement unifi\u00e9 :<\/p>\n<p><code>colonnes_cibles &lt;- grep(\"^item_\", names(base_volumineuse), value = TRUE)<\/code><br \/>\n<code>liste_remplacement &lt;- as.list(rep(\"Non \u00e9valu\u00e9\", length(colonnes_cibles)))<\/code><br \/>\n<code>names(liste_remplacement) &lt;- colonnes_cibles<\/code><br \/>\n<code>base_volumineuse &lt;- base_volumineuse |&gt; replace_na(liste_remplacement)<\/code><\/p>\n<p>Cette approche d&rsquo;ing\u00e9nierie logicielle garantit une maintenance optimale du code de recherche. Si de nouvelles variables qualitatives r\u00e9pondant au m\u00eame motif syntaxique sont ajout\u00e9es ult\u00e9rieurement lors d&rsquo;une vague d&rsquo;\u00e9valuation subs\u00e9quente (\u00e9valuation longitudinale \u00e0 T2 ou T3), le script traitera l&rsquo;ensemble du corpus sans n\u00e9cessiter la moindre retouche manuelle. De plus, les variables omises involontairement dans la structure de liste continuent d&rsquo;exister sans alt\u00e9ration destructrice, offrant un filet de s\u00e9curit\u00e9 structurel indispensable \u00e0 l&rsquo;analytique reproductible.<\/p>\n<h2>6. M\u00e9thodes traditionnelles en R de base (Base R) sans d\u00e9pendances<\/h2>\n<h3>6.1 Remplacement par indexation logique directe<\/h3>\n<p>Bien que l&rsquo;\u00e9l\u00e9gance syntaxique du Tidyverse s\u00e9duise une majorit\u00e9 de praticiens contemporains, la ma\u00eetrise des m\u00e9canismes du R de base demeure indispensable. Dans de nombreux environnements de calcul haute performance, sur des serveurs s\u00e9curis\u00e9s d&rsquo;h\u00f4pitaux interdisant l&rsquo;installation de biblioth\u00e8ques tierces, ou lors du d\u00e9veloppement de packages R destin\u00e9s \u00e0 \u00eatre publi\u00e9s sur le CRAN o\u00f9 la minimisation des d\u00e9pendances est une exigence absolue de stabilit\u00e9, l&rsquo;indexation logique native s&rsquo;impose comme la solution privil\u00e9gi\u00e9e.<\/p>\n<p>Le principe fondamental de l&rsquo;imputation en R de base repose sur le sous-ensemble logique vectoris\u00e9 combinant l&rsquo;op\u00e9rateur d&rsquo;extraction crochets <code>[ ]<\/code> et le pr\u00e9dicat <code>is.na()<\/code>. Consid\u00e9rons un vecteur de donn\u00e9es textuelles extrait d&rsquo;une base de dossiers m\u00e9dicaux :<\/p>\n<p><code>reponse &lt;- c(\"Favorable\", NA, \"D\u00e9favorable\", NA, \"R\u00e9serv\u00e9\")<\/code><br \/>\n<code>reponse[is.na(reponse)] &lt;- \"Ind\u00e9termin\u00e9\"<\/code><\/p>\n<p>L&rsquo;\u00e9valuation s&rsquo;ex\u00e9cute de fa\u00e7on s\u00e9quentielle et extr\u00eamement directe : l&rsquo;expression <code>is.na(reponse)<\/code> g\u00e9n\u00e8re un vecteur logique <code>c(FALSE, TRUE, FALSE, TRUE, FALSE)<\/code>. Lorsque ce vecteur logique est pass\u00e9 \u00e0 l&rsquo;int\u00e9rieur des crochets d&rsquo;indexation du vecteur d&rsquo;origine, l&rsquo;interpr\u00e9teur R filtre la m\u00e9moire pour cibler uniquement les adresses physiques correspondant aux positions \u00e9valu\u00e9es \u00e0 <code>TRUE<\/code>. L&rsquo;op\u00e9rateur d&rsquo;assignation <code>&lt;-<\/code> inscrit alors directement la cha\u00eene de substitution \u00ab Ind\u00e9termin\u00e9 \u00bb dans ces positions cibles, en laissant toutes les autres cellules inchang\u00e9es.<\/p>\n<p>Lorsqu&rsquo;elle est appliqu\u00e9e \u00e0 une colonne log\u00e9e au sein d&rsquo;un data frame, la commande prend la forme suivante :<\/p>\n<p><code>df<span class=\"arabpsy-math-inline\" data-latex=\"statut[is.na(df\">$statut[is.na(df$<\/span>statut)] &lt;- \"Ind\u00e9termin\u00e9\"<\/code><\/p>\n<p>Cette m\u00e9thodologie se distingue par sa frugalit\u00e9 computationnelle et son ex\u00e9cution native sans aucune surcharge li\u00e9e au chargement de m\u00e9tadonn\u00e9es ou d&rsquo;environnements d&rsquo;ex\u00e9cution complexes. Elle comporte n\u00e9anmoins un risque ergonomique : la r\u00e9p\u00e9tition n\u00e9cessaire du nom de l&rsquo;objet (<code>df$statut<\/code> figure deux fois dans l&rsquo;instruction) accro\u00eet la probabilit\u00e9 d&rsquo;erreurs de saisie, notamment lorsqu&rsquo;un copi\u00e9-coll\u00e9 h\u00e2tif conduit l&rsquo;analyste \u00e0 filtrer sur une colonne tout en assignant le r\u00e9sultat dans une autre variable adjacente.<\/p>\n<h3>6.2 Application de la fonction ifelse() vectoris\u00e9e<\/h3>\n<p>Une seconde approche traditionnelle en R de base fait appel \u00e0 la fonction d&rsquo;arbitrage conditionnel <code>ifelse()<\/code>. Cette primitive vectoris\u00e9e accepte trois arguments indispensables : un test logique sous forme de condition bool\u00e9enne, la valeur \u00e0 retourner si le test est valid\u00e9 (<code>yes<\/code>), et la valeur alternative \u00e0 restituer si le test \u00e9choue (<code>no<\/code>). Dans notre champ d&rsquo;application, la syntaxe prend la forme suivante :<\/p>\n<p><code>df<span class=\"arabpsy-math-inline\" data-latex=\"statut &lt;- ifelse(is.na(df\">$statut &lt;- ifelse(is.na(df$<\/span>statut), \"Donn\u00e9e absente\", df$statut)<\/code><\/p>\n<p>L&rsquo;op\u00e9rateur \u00e9value la condition <code>is.na(df$statut)<\/code> pour chaque ligne du tableau. Pour chaque composante o\u00f9 le test renvoie <code>TRUE<\/code>, l&rsquo;\u00e9l\u00e9ment correspondant de la sortie prend la valeur \u00ab Donn\u00e9e absente \u00bb. Dans le cas inverse o\u00f9 la condition renvoie <code>FALSE<\/code>, la fonction recopie la valeur pr\u00e9existante pr\u00e9sente dans <code>df$statut<\/code>. Bien que cette formulation pr\u00e9sente une logique narrative intuitive, elle dissimule des limitations techniques substantielles qui doivent inciter l&rsquo;analyste \u00e0 la circonspection.<\/p>\n<p>En premier lieu, <code>ifelse()<\/code> est notoire dans l&rsquo;\u00e9cosyst\u00e8me R pour sa propension \u00e0 d\u00e9pouiller les vecteurs de leurs attributs de classe sous-jacents. Si la colonne d&rsquo;origine porte des attributs temporels (comme des dates de classe <code>Date<\/code> ou <code>POSIXct<\/code>) ou des m\u00e9tadonn\u00e9es sp\u00e9cifiques attribu\u00e9es par des outils de capture de donn\u00e9es cliniques (comme les objets \u00e9tiquet\u00e9s <em>labelled<\/em> de SPSS ou SAS import\u00e9s via le package <code>haven<\/code>), <code>ifelse()<\/code> \u00e9limine fr\u00e9quemment ces attributs pour renvoyer un vecteur atomique brut d\u00e9pouill\u00e9, provoquant des anomalies de comportement dans les visualisations ult\u00e9rieures.<\/p>\n<p>En second lieu, sur le plan des performances algorithmiques pures, <code>ifelse()<\/code> \u00e9value syst\u00e9matiquement les deux branches d&rsquo;arguments (l&rsquo;expression vraie et l&rsquo;expression fausse) dans leur int\u00e9gralit\u00e9 avant de construire le vecteur final. Sur des cohortes massives de plusieurs millions d&rsquo;enregistrements, cette double \u00e9valuation engendre un co\u00fbt m\u00e9moire et processeur largement sup\u00e9rieur \u00e0 celui de l&rsquo;indexation directe par <code>[is.na()]<\/code>. Ainsi, si le chercheur choisit d&rsquo;op\u00e9rer en R de base pur, l&rsquo;indexation directe doit \u00eatre syst\u00e9matiquement pr\u00e9f\u00e9r\u00e9e \u00e0 l&rsquo;usage de <code>ifelse()<\/code> pour les t\u00e2ches de simple imputation.<\/p>\n<h2>7. Int\u00e9gration au sein de l&rsquo;\u00e9cosyst\u00e8me dplyr et manipulation avanc\u00e9e<\/h2>\n<h3>7.1 Combinaison de mutate() avec replace_na()<\/h3>\n<p>L&rsquo;int\u00e9gration harmonieuse des op\u00e9rations de nettoyage dans un flux d&rsquo;ing\u00e9nierie de donn\u00e9es fluide repose principalement sur le package <a rel=\"noopener noreferrer\" href=\"https:\/\/dplyr.tidyverse.org\/\">dplyr<\/a>. Gr\u00e2ce au verbe grammatical <code>mutate()<\/code>, sp\u00e9cialis\u00e9 dans l&rsquo;alt\u00e9ration et la d\u00e9rivation de colonnes, le remplacement des valeurs manquantes s&rsquo;inscrit organiquement dans une cha\u00eene de traitement standardis\u00e9e. Au lieu d&rsquo;isoler des commandes \u00e9parses dans son script, le chercheur consolide l&rsquo;ensemble des transformations dans un pipeline logique lisible de haut en bas.<\/p>\n<p>L&rsquo;association paradigmatique de <code>mutate()<\/code> et de <code>replace_na()<\/code> s&rsquo;articule comme suit :<\/p>\n<p><code>cohorte_harmonisee &lt;- cohorte_psy |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;filter(id &gt; 100) |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;mutate(statut_marital = replace_na(statut_marital, \"Non renseign\u00e9\")) |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;arrange(id)<\/code><\/p>\n<p>L&rsquo;int\u00e9r\u00eat conceptuel de cette articulation tient \u00e0 la gestion fluide de la port\u00e9e lexicale : \u00e0 l&rsquo;int\u00e9rieur de l&rsquo;expression <code>mutate()<\/code>, le nom de la variable <code>statut_marital<\/code> est directement accessible sans qu&rsquo;il soit n\u00e9cessaire de r\u00e9p\u00e9ter la r\u00e9f\u00e9rence au data frame parent via le symbole <code>$<\/code>. L&rsquo;interpr\u00e9teur r\u00e9sout la colonne dans le contexte pr\u00e9cis de l&rsquo;objet transmis par le pipe. Cette syntaxe se pr\u00eate id\u00e9alement aux op\u00e9rations encha\u00een\u00e9es regroupant s\u00e9lections de colonnes avec <code>select()<\/code>, regroupements stratifi\u00e9s avec <code>group_by()<\/code> et r\u00e9sum\u00e9s statistiques consolid\u00e9s avec <code>summarise()<\/code>.<\/p>\n<p>Sur le plan de la gouvernance de la m\u00e9moire, les versions contemporaines de <em>dplyr<\/em> et du moteur R optimisent le comportement de <code>mutate()<\/code> en \u00e9vitant la duplication int\u00e9grale de l&rsquo;objet tant que cela n&rsquo;est pas strictement n\u00e9cessaire (m\u00e9canisme de <em>copy-on-modify<\/em>). Cela garantit une empreinte RAM minimale, m\u00eame lors de l&rsquo;encha\u00eenement de plusieurs dizaines d&rsquo;imputations successives au cours d&rsquo;un m\u00eame pipeline de validation scientifique.<\/p>\n<h3>7.2 Usage de if_else() et case_when() pour imputations nuanc\u00e9es<\/h3>\n<p>Dans de nombreux protocoles d&rsquo;\u00e9valuation psychologique, le remplacement d&rsquo;un <code>NA<\/code> ne peut se r\u00e9soudre par une \u00e9tiquette fixe universelle, mais d\u00e9pend intimement d&rsquo;informations contextuelles fournies par d&rsquo;autres variables de l&rsquo;enqu\u00eate. Pour r\u00e9pondre \u00e0 ces exigences logiques conditionnelles, <em>dplyr<\/em> propose les fonctions <code>if_else()<\/code> et <code>case_when()<\/code>. Contrairement au <code>ifelse()<\/code> permissif du R de base, <code>dplyr::if_else()<\/code> impose une stricte coh\u00e9rence de type entre la branche vraie et la branche fausse, emp\u00eachant toute coercition accidentelle qui corromprait la structure du jeu de donn\u00e9es.<\/p>\n<p>La puissance d&rsquo;arbitrage conditionnel s&rsquo;exprime pleinement \u00e0 travers <code>case_when()<\/code>, qui permet de formaliser des syst\u00e8mes d&rsquo;\u00e9quations logiques complexes sous une forme vectoris\u00e9e \u00e9l\u00e9gante. Imaginons une enqu\u00eate dans laquelle la variable <code>frequence_alcool<\/code> pr\u00e9sente des valeurs manquantes, mais o\u00f9 nous disposons par ailleurs d&rsquo;une variable binaire <code>consommateur_alcool<\/code> (indiquant \u00ab Non \u00bb ou \u00ab Oui \u00bb). Si un participant coche \u00ab Non \u00bb \u00e0 la premi\u00e8re question filtre, l&rsquo;item secondaire de fr\u00e9quence est logiquement laiss\u00e9 vide par le r\u00e9pondant. Traiter ce manque comme une simple non-r\u00e9ponse n\u00e9gligente (\u00ab Donn\u00e9e manquante \u00bb) constituerait une d\u00e9formation de la r\u00e9alit\u00e9 empirique.<\/p>\n<p>Le recodage contextuel s&rsquo;op\u00e8re m\u00e9thodiquement de la fa\u00e7on suivante :<\/p>\n<p><code>enquete_clinique &lt;- enquete_clinique |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;mutate(frequence_alcool = case_when(<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;!is.na(frequence_alcool) ~ frequence_alcool,<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;is.na(frequence_alcool) &amp; consommateur_alcool == \"Non\" ~ \"Non applicable (abst\u00e8me)\",<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;is.na(frequence_alcool) &amp; consommateur_alcool == \"Oui\" ~ \"Omission involontaire ou refus\",<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;TRUE ~ \"Statut ind\u00e9termin\u00e9\"<\/code><br \/>\n<code>&nbsp;&nbsp;))<\/code><\/p>\n<p>Dans cette structure, l&rsquo;op\u00e9rateur tilde <code>~<\/code> connecte la condition logique de gauche \u00e0 la valeur de remplacement textuelle attribu\u00e9e \u00e0 droite. Les r\u00e8gles sont \u00e9valu\u00e9es s\u00e9quentiellement pour chaque ligne de donn\u00e9es. Cette granularit\u00e9 analytique permet de pr\u00e9server la validit\u00e9 interne du corpus de recherche, en discriminant formellement les omissions dues \u00e0 la structure conditionnelle du questionnaire (<em>structural missingness<\/em>) des v\u00e9ritables refus de r\u00e9pondre ou d\u00e9faillances de saisie.<\/p>\n<h3>7.3 Application s\u00e9lective avec across() sur des ensembles de colonnes<\/h3>\n<p>L&rsquo;un des apports les plus remarquables de <em>dplyr<\/em> pour le traitement des donn\u00e9es massives r\u00e9side dans l&rsquo;utilisation de la fonction <code>across()<\/code>, qui a succ\u00e9d\u00e9 aux variantes historiques d\u00e9sormais obsol\u00e8tes <code>mutate_if()<\/code>, <code>mutate_at()<\/code> et <code>mutate_all()<\/code>. La fonction <code>across()<\/code> permet d&rsquo;appliquer une transformation donn\u00e9e \u00e0 un sous-ensemble complet de colonnes s\u00e9lectionn\u00e9es au moyen de pr\u00e9dicats logiques ou d&rsquo;aides \u00e0 la s\u00e9lection (<em>tidyselect helpers<\/em>).<\/p>\n<p>Consid\u00e9rons une batterie psychom\u00e9trique comportant un vaste volume de questions ouvertes et de champs de m\u00e9tadonn\u00e9es qualitatives. Si l&rsquo;objectif du chercheur est de remplacer les <code>NA<\/code> par la mention \u00ab Absence d&rsquo;information \u00bb sur absolument toutes les colonnes de type textuel du tableau, sans toucher aux scores cliniques continus, la formulation avec <code>across()<\/code> offre une compacit\u00e9 et une s\u00e9curit\u00e9 in\u00e9gal\u00e9es :<\/p>\n<p><code>donnees_traitees &lt;- cohorte_psy |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;mutate(across(where(is.character), ~ replace_na(.x, \"Absence d'information\")))<\/code><\/p>\n<p>Dans cette expression hautement expressive, <code>where(is.character)<\/code> op\u00e8re comme un filtre d&rsquo;introspection typologique qui scanne les m\u00e9tadonn\u00e9es de chaque colonne du tableau. Seules les variables dont le type primitif est textuel sont transmises \u00e0 la fonction de remplacement. La syntaxe compacte avec tilde et variable muette <code>.x<\/code> (ou la syntaxe \u00e9quivalente avec une fonction anonyme <code>(x) replace_na(x, \"...\")<\/code> standardis\u00e9e depuis R 4.1) applique la substitution chirurgicale \u00e0 chaque colonne identifi\u00e9e.<\/p>\n<p>L&rsquo;analyste peut \u00e9galement restreindre cette application par le nom des variables \u00e0 l&rsquo;aide des pr\u00e9dicats tidyselect standard, comme dans l&rsquo;exemple suivant :<\/p>\n<p><code>donnees_traitees &lt;- cohorte_psy |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;mutate(across(starts_with(\"echelle_anxiete_\"), ~ replace_na(.x, \"Non \u00e9valu\u00e9\")))<\/code><\/p>\n<p>Cette m\u00e9thodologie r\u00e9duit drastiquement les risques de bugs inh\u00e9rents \u00e0 l&rsquo;\u00e9criture de boucles it\u00e9ratives manuelles <code>for()<\/code>, prot\u00e8ge l&rsquo;immuabilit\u00e9 des colonnes num\u00e9riques adjacentes, et conf\u00e8re au code un niveau de concision et d&rsquo;\u00e9l\u00e9gance conforme aux meilleurs standards du g\u00e9nie logiciel acad\u00e9mique contemporain.<\/p>\n<h2>8. Le pi\u00e8ge des variables cat\u00e9gorielles : Facteurs versus Cha\u00eenes de caract\u00e8res<\/h2>\n<h3>8.1 M\u00e9canisme des niveaux (levels) dans les facteurs sous R<\/h3>\n<p>Dans l&rsquo;architecture de R, les variables cat\u00e9gorielles sont tr\u00e8s fr\u00e9quemment stock\u00e9es sous la forme de facteurs (classe <code>factor<\/code>). Cette structure de donn\u00e9es, d&rsquo;une importance capitale pour la mod\u00e9lisation statistique comme les analyses de variance (ANOVA) ou les r\u00e9gressions logistiques, ne stocke pas le texte sous forme de cha\u00eenes brutes en m\u00e9moire. Un facteur est en r\u00e9alit\u00e9 un vecteur sous-jacent d&rsquo;entiers pointant vers une table de r\u00e9f\u00e9rence interne contenant des \u00e9tiquettes uniques appel\u00e9es niveaux ou <em>levels<\/em>.<\/p>\n<p>Cette dualit\u00e9 interne explique pourquoi les tentatives na\u00efves d&rsquo;imputation textuelle sur un facteur d\u00e9clenchent immanquablement des erreurs de programmation s\u00e9v\u00e8res. Si une variable de groupe exp\u00e9rimental est cod\u00e9e sous forme de facteur avec les niveaux <code>c(\"Contr\u00f4le\", \"Traitement_A\", \"Traitement_B\")<\/code> et qu&rsquo;une observation pr\u00e9sente un <code>NA<\/code>, tenter d&rsquo;ex\u00e9cuter une assignation directe telle que :<\/p>\n<p><code>groupe[is.na(groupe)] &lt;- \"Non assign\u00e9\"<\/code><\/p>\n<p>provoquera imm\u00e9diatement l&rsquo;affichage du message d&rsquo;avertissement :<\/p>\n<p><em>Warning message: In `[&lt;-.factor`(`*tmp*`, is.na(groupe), value = \u00ab\u00a0Non assign\u00e9\u00a0\u00bb) : invalid factor level, NA generated<\/em><\/p>\n<p>Ce dysfonctionnement s&rsquo;explique simplement : la cha\u00eene \u00ab Non assign\u00e9 \u00bb n&rsquo;a pas \u00e9t\u00e9 d\u00e9clar\u00e9e au pr\u00e9alable dans le dictionnaire des niveaux autoris\u00e9s du facteur. Refusant d&rsquo;alt\u00e9rer arbitrairement la d\u00e9finition structurelle de la variable, l&rsquo;interpr\u00e9teur R rejette l&rsquo;insertion et r\u00e9injecte \u00e0 la place un nouveau <code>NA<\/code>. L&rsquo;analyste se retrouve donc au point de d\u00e9part, avec une valeur manquante persistante, tout en croyant avoir assaini ses donn\u00e9es. Il est donc fondamental de diagnostiquer pr\u00e9alablement la nature de la colonne au moyen de la fonction <code>is.factor()<\/code> avant toute op\u00e9ration d&rsquo;assainissement textuel.<\/p>\n<h3>8.2 R\u00e9solution du probl\u00e8me avec le package forcats<\/h3>\n<p>Pour surmonter rigoureusement cette contrainte propre aux facteurs, le m\u00e9tapackage Tidyverse int\u00e8gre une biblioth\u00e8que enti\u00e8rement d\u00e9di\u00e9e \u00e0 la manipulation des variables cat\u00e9gorielles : le package <a rel=\"noopener noreferrer\" href=\"https:\/\/forcats.tidyverse.org\/\">forcats<\/a>. Au sein de cette bo\u00eete \u00e0 outils, la fonction <code>fct_na_value_to_level()<\/code> repr\u00e9sente la m\u00e9thode contemporaine par excellence pour transformer une absence de donn\u00e9e en une modalit\u00e9 formellement reconnue au sein des niveaux du facteur.<\/p>\n<p>La syntaxe d&rsquo;application s&rsquo;av\u00e8re particuli\u00e8rement fluide :<\/p>\n<p><code>library(forcats)<\/code><br \/>\n<code>cohorte_psy &lt;- cohorte_psy |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;mutate(statut_cat = fct_na_value_to_level(statut_cat, level = \"Non sp\u00e9cifi\u00e9\"))<\/code><\/p>\n<p>Cette fonction ex\u00e9cute une double op\u00e9ration atomique s\u00e9curis\u00e9e : elle injecte d&rsquo;abord le libell\u00e9 \u00ab Non sp\u00e9cifi\u00e9 \u00bb \u00e0 la fin de la table des <em>levels<\/em> de la variable cat\u00e9gorielle, puis elle assigne le code entier correspondant aux positions pr\u00e9c\u00e9demment occup\u00e9es par les <code>NA<\/code>. Il convient de souligner que cette commande a officiellement succ\u00e9d\u00e9 \u00e0 la fonction historique <code>fct_explicit_na()<\/code>, qui a \u00e9t\u00e9 d\u00e9pr\u00e9ci\u00e9e dans les versions r\u00e9centes de <em>forcats<\/em> pour offrir une terminologie plus coh\u00e9rente avec l&rsquo;ensemble du langage.<\/p>\n<p>Si le chercheur op\u00e8re dans un cadre restreint en R de base sans acc\u00e8s aux biblioth\u00e8ques du Tidyverse, la m\u00eame modification structurelle impose d&rsquo;\u00e9tendre manuellement le dictionnaire des niveaux avant d&rsquo;effectuer l&rsquo;assignation par indexation logique :<\/p>\n<p><code>levels(cohorte_psy<span class=\"arabpsy-math-inline\" data-latex=\"statut_cat) &lt;- c(levels(cohorte_psy\">$statut_cat) &lt;- c(levels(cohorte_psy$<\/span>statut_cat), \"Non sp\u00e9cifi\u00e9\")<\/code><br \/>\n<code>cohorte_psy<span class=\"arabpsy-math-inline\" data-latex=\"statut_cat[is.na(cohorte_psy\">$statut_cat[is.na(cohorte_psy$<\/span>statut_cat)] &lt;- \"Non sp\u00e9cifi\u00e9\"<\/code><\/p>\n<p>Une alternative radicale, lorsque la dimension cat\u00e9gorielle n&rsquo;a plus vocation \u00e0 \u00eatre introduite sous forme de contrastes au sein d&rsquo;un mod\u00e8le statistique param\u00e9trique, consiste \u00e0 d\u00e9mystifier la variable en la r\u00e9trogradant au statut de simple vecteur textuel. L&rsquo;ex\u00e9cution pr\u00e9alable de <code>cohorte_psy<span class=\"arabpsy-math-inline\" data-latex=\"statut_cat &lt;- as.character(cohorte_psy\">$statut_cat &lt;- as.character(cohorte_psy$<\/span>statut_cat)<\/code> convertit l&rsquo;objet en cha\u00eene standard, lib\u00e9rant l&rsquo;utilisateur des contraintes de conformit\u00e9 des <em>levels<\/em> et autorisant l&rsquo;usage imm\u00e9diat de <code>tidyr::replace_na()<\/code>.<\/p>\n<h2>9. Traitements textuels avanc\u00e9s et nettoyage conditionnel avec stringr<\/h2>\n<h3>9.1 Harmonisation des fausses cha\u00eenes de valeurs manquantes<\/h3>\n<p>Dans la pratique courante de la recherche empirique, les fichiers bruts issus de logiciels d&rsquo;\u00e9valuation psychom\u00e9trique ou d&rsquo;enqu\u00eates en ligne (tels que Qualtrics, Google Forms, REDCap ou LimeSurvey) arrivent rarement dans un \u00e9tat de propret\u00e9 id\u00e9al. Lors de l&rsquo;exportation et de l&rsquo;importation par des fonctions comme <code>read.csv()<\/code>, de nombreuses pseudo-valeurs manquantes sont encod\u00e9es sous forme de textes litt\u00e9raux parasites : les mentions <code>\"NA\"<\/code>, <code>\"N\/A\"<\/code>, <code>\"null\"<\/code>, <code>\"aucun\"<\/code>, <code>\".\"<\/code>, voire de simples espaces blancs non visibles \u00e0 l&rsquo;\u0153il nu <code>\" \"<\/code>.<\/p>\n<p>Pour l&rsquo;interpr\u00e9teur R, ces mentions ne constituent en aucune fa\u00e7on des donn\u00e9es manquantes. Il s&rsquo;agit de cha\u00eenes de caract\u00e8res parfaitement valides, dot\u00e9es d&rsquo;une longueur non nulle, sur lesquelles le test <code>is.na()<\/code> renverra immanquablement <code>FALSE<\/code>. D\u00e8s lors, toute tentative d&rsquo;application de <code>replace_na()<\/code> sur un tel corpus ignorera superbement ces cellules aberrantes. Une phase de normalisation et d&rsquo;harmonisation amont s&rsquo;av\u00e8re indispensable pour convertir ces fausses cha\u00eenes textuelles en authentiques indicateurs logiques <code>NA<\/code> avant d&rsquo;entreprendre l&rsquo;imputation finale unifi\u00e9e.<\/p>\n<p>Cette harmonisation s&rsquo;accomplit avec une efficacit\u00e9 remarquable en combinant les fonctions <code>stringr::str_trim()<\/code> et <code>dplyr::na_if()<\/code> au sein d&rsquo;un pipeline de pr\u00e9paration :<\/p>\n<p><code>library(stringr)<\/code><br \/>\n<code>donnees_propres &lt;- donnees_brutes |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;mutate(across(where(is.character), ~ str_trim(.x))) |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;mutate(across(where(is.character), ~ na_if(.x, \"N\/A\"))) |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;mutate(across(where(is.character), ~ na_if(.x, \"null\"))) |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;mutate(across(where(is.character), ~ na_if(.x, \"\"))) |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;mutate(across(where(is.character), ~ replace_na(.x, \"Non document\u00e9\")))<\/code><\/p>\n<p>Dans ce protocole s\u00e9quenc\u00e9, <code>str_trim()<\/code> commence par \u00e9liminer tous les espaces r\u00e9siduels d&rsquo;amorce et de fin qui pourraient masquer la vacuit\u00e9 d&rsquo;une r\u00e9ponse. Par la suite, les appels successifs \u00e0 <code>na_if()<\/code> comparent les \u00e9l\u00e9ments du vecteur \u00e0 des cha\u00eenes indicatrices de carence et forcent la conversion de ces concordances vers le statut logique formel <code>NA_character_<\/code>. Une fois la base assainie et standardis\u00e9e sur le plan de ses repr\u00e9sentations d&rsquo;incompl\u00e9tude, la fonction <code>replace_na()<\/code> intervient pour conf\u00e9rer un libell\u00e9 textuel homog\u00e8ne et harmonis\u00e9 \u00e0 l&rsquo;ensemble du jeu d&rsquo;observations.<\/p>\n<h3>9.2 Remplacement contextuel bas\u00e9 sur des motifs d&rsquo;expressions r\u00e9guli\u00e8res<\/h3>\n<p>Dans certaines situations complexes, les motifs de non-r\u00e9ponse ne sont pas standardis\u00e9s sous une forme litt\u00e9rale exacte, mais se d\u00e9clinent \u00e0 travers des variations textuelles r\u00e9dig\u00e9es librement par les enqu\u00eateurs lors de la collecte (par exemple : \u00ab pas de r\u00e9ponse \u00bb, \u00ab absence de donn\u00e9es \u00bb, \u00ab non applicable selon participant \u00bb). La d\u00e9tection de ces motifs exige la puissance des expressions r\u00e9guli\u00e8res (<em>regex<\/em>) au moyen de la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/stringr.tidyverse.org\/\">stringr<\/a>.<\/p>\n<p>Il importe \u00e9galement d&rsquo;\u00e9clairer la fonction sp\u00e9cialis\u00e9e <code>str_replace_na()<\/code> offerte par <em>stringr<\/em>, dont l&rsquo;action est souvent confondue avec celle de <code>tidyr::replace_na()<\/code>. La commande <code>str_replace_na(string, replacement = \"NA\")<\/code> a \u00e9t\u00e9 explicitement con\u00e7ue pour convertir un indicateur logique <code>NA<\/code> en une cha\u00eene litt\u00e9rale exacte contenant par d\u00e9faut les caract\u00e8res alphab\u00e9tiques <code>\"NA\"<\/code>. Bien que cela semble anodin, cette distinction s\u00e9mantique est capitale :<\/p>\n<p><code>vecteur_test &lt;- c(\"Patient 1\", NA, \"Patient 3\")<\/code><br \/>\n<code>str_replace_na(vecteur_test, replacement = \"Inconnu\")<\/code><\/p>\n<p>La nuance \u00e9pist\u00e9mologique entre <code>str_replace_na()<\/code> et <code>replace_na()<\/code> r\u00e9side principalement dans le domaine d&rsquo;application vis\u00e9. Alors que <code>tidyr::replace_na()<\/code> s&rsquo;adresse prioritairement \u00e0 l&rsquo;ing\u00e9nierie des donn\u00e9es tabulaires et accepte des listes configuratrices pour des data frames entiers, <code>stringr::str_replace_na()<\/code> s&rsquo;ins\u00e8re au sein de pipelines de traitement de texte pur, notamment lors de la pr\u00e9paration de cha\u00eenes destin\u00e9es \u00e0 la concat\u00e9nation vectoris\u00e9e via <code>str_c()<\/code> ou <code>paste0()<\/code>, o\u00f9 la pr\u00e9sence d&rsquo;un <code>NA<\/code> logique provoquerait la propagation ind\u00e9sirable de la valeur manquante sur toute la cha\u00eene r\u00e9sultante.<\/p>\n<p>Le choix de l&rsquo;outil appropri\u00e9 d\u00e9pend donc rigoureusement de la finalit\u00e9 de l&rsquo;op\u00e9ration : si la transformation vise la compl\u00e9tion d&rsquo;un champ documentaire au sein d&rsquo;une matrice d&rsquo;observations scientifiques, l&#8217;emploi de l&rsquo;\u00e9cosyst\u00e8me <em>tidyr \/ dplyr<\/em> demeure le standard recommand\u00e9 par la communaut\u00e9 scientifique internationale.<\/p>\n<h2>10. \u00c9tudes de cas appliqu\u00e9es en psychologie quantitative et sciences sociales<\/h2>\n<h3>10.1 Nettoyage d&rsquo;une batterie de tests psychom\u00e9triques (Exemple : BDI-II ou NEO-PI-R)<\/h3>\n<p>Pour ancrer ces d\u00e9veloppements th\u00e9oriques au c\u0153ur de la pratique empirique de la recherche, d\u00e9veloppons un cas d&rsquo;application concret articul\u00e9 autour de l&rsquo;assainissement d&rsquo;un inventaire clinique d&rsquo;\u00e9valuation de la symptomatologie d\u00e9pressive, \u00e0 l&rsquo;image du Beck Depression Inventory (BDI-II). Dans un protocole d&rsquo;administration num\u00e9rique moderne, les r\u00e9ponses brutes collect\u00e9es contiennent fr\u00e9quemment une combinaison de m\u00e9tadonn\u00e9es sociod\u00e9mographiques qualitatives, d&rsquo;indicateurs de consentement formel et de scores d&rsquo;items psychom\u00e9triques individuels quantifi\u00e9s sur des \u00e9chelles de Likert allant de 0 \u00e0 3.<\/p>\n<p>Supposons que nous recevions la matrice d&rsquo;\u00e9valuation suivante pour cinq participants cons\u00e9cutifs admis au sein d&rsquo;un protocole hospitalier de suivi de l&rsquo;humeur :<\/p>\n<p><code>reponses_bdi &lt;- data.frame(<\/code><br \/>\n<code>&nbsp;&nbsp;sujet = c(\"S01\", \"S02\", \"S03\", \"S04\", \"S05\"),<\/code><br \/>\n<code>&nbsp;&nbsp;consentement = c(\"Oui\", \"Oui\", NA, \"Oui\", \"Oui\"),<\/code><br \/>\n<code>&nbsp;&nbsp;motif_consultation = c(\"Trouble du sommeil\", NA, \"Attaque de panique\", NA, \"Tristesse persistante\"),<\/code><br \/>\n<code>&nbsp;&nbsp;item1_tristesse = c(2, 3, NA, 0, 1),<\/code><br \/>\n<code>&nbsp;&nbsp;item2_pessimisme = c(1, 2, NA, 0, NA),<\/code><br \/>\n<code>&nbsp;&nbsp;item3_echec = c(1, NA, NA, 0, 2),<\/code><br \/>\n<code>&nbsp;&nbsp;stringsAsFactors = FALSE<\/code><br \/>\n<code>)<\/code><\/p>\n<p>La r\u00e8gle m\u00e9thodologique absolue en psychom\u00e9trie impose une s\u00e9gr\u00e9gation \u00e9tanche entre les variables descriptives qualitatives et les scores quantitatifs bruts des items. Dans les colonnes d&rsquo;items (<code>item1<\/code> \u00e0 <code>item3<\/code>), les valeurs manquantes r\u00e9sultent soit d&rsquo;une omission par fatigue, soit d&rsquo;un refus d\u00e9lib\u00e9r\u00e9 de r\u00e9pondre face \u00e0 des th\u00e9matiques culpabilisantes. Remplacer ces <code>NA<\/code> par du texte dans les colonnes d&rsquo;items briserait irr\u00e9m\u00e9diablement la structure math\u00e9matique de l&rsquo;\u00e9chelle, interdisant tout calcul ult\u00e9rieur du score total de d\u00e9pression par sommation arithm\u00e9tique.<\/p>\n<p>Le traitement raisonn\u00e9 consiste donc \u00e0 assainir textuellement les variables descriptives, tout en conservant l&rsquo;int\u00e9grit\u00e9 num\u00e9rique des items pour calculer un indice de compl\u00e9tude psychom\u00e9trique par sujet :<\/p>\n<p><code>bdi_prepare &lt;- reponses_bdi |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;replace_na(list(<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;consentement = \"Statut non document\u00e9\",<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;motif_consultation = \"Motif non sp\u00e9cifi\u00e9 lors de l'admission\"<\/code><br \/>\n<code>&nbsp;&nbsp;)) |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;rowwise() |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;mutate(<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;items_repondus = sum(!is.na(c_across(starts_with(\"item\")))),<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;taux_completude = items_repondus \/ 3,<\/code><br \/>\n<code>&nbsp;&nbsp;&nbsp;&nbsp;score_sommaire = ifelse(taux_completude &gt;= 0.8, sum(c_across(starts_with(\"item\")), na.rm = TRUE), NA_real_)<\/code><br \/>\n<code>&nbsp;&nbsp;) |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;ungroup()<\/code><\/p>\n<p>Dans ce pipeline clinique hautement reproductible, les variables qualitatives sont document\u00e9es sans ambigu\u00eft\u00e9 documentaire, tandis que les fonctions vectoris\u00e9es calculent rigoureusement la proportion d&rsquo;items compl\u00e9t\u00e9s par chaque sujet. Conform\u00e9ment aux recommandations psychom\u00e9triques internationales, si un sujet pr\u00e9sente un taux de compl\u00e9tude inf\u00e9rieur \u00e0 un seuil tol\u00e9rable (ici 80 % des items de l&rsquo;\u00e9chelle), le score sommaire n&rsquo;est pas estim\u00e9 de fa\u00e7on hasardeuse par sommation incompl\u00e8te, mais est consign\u00e9 formellement comme une valeur manquante quantitative <code>NA_real_<\/code> en vue d&rsquo;imputations stochastiques ult\u00e9rieures.<\/p>\n<h3>10.2 Traitement des questions ouvertes et commentaires libres en recherche clinique<\/h3>\n<p>Dans de nombreux protocoles mixtes alliant psychiatrie quantitative et psychopathologie clinique, les questionnaires d&rsquo;\u00e9valuation sont compl\u00e9t\u00e9s par des champs de saisie ouverts o\u00f9 les participants ou les praticiens peuvent formuler des observations narratives compl\u00e9mentaires (verbatim textuels, descriptions de ressentis somatiques, commentaires sur la tol\u00e9rance m\u00e9dicamenteuse). L&rsquo;absence de texte dans ces champs correspond le plus souvent au fait que le participant n&rsquo;avait aucune remarque particuli\u00e8re \u00e0 ajouter.<\/p>\n<p>Lorsque ces bases de donn\u00e9es qualitatives sont export\u00e9es pour faire l&rsquo;objet de fouille de textes (<em>text mining<\/em>) ou de traitement automatique du langage naturel (NLP) via des biblioth\u00e8ques sp\u00e9cialis\u00e9es comme <code>tidytext<\/code>, la pr\u00e9sence de valeurs <code>NA<\/code> au sein du corpus textuel introduit des biais algorithmiques s\u00e9v\u00e8res. Les fonctions de segmentation textuelle (<em>tokenization<\/em>) par mots ou n-grammes de <code>tidytext::unnest_tokens()<\/code> \u00e9chouent ou \u00e9liminent silencieusement les participants ne pr\u00e9sentant aucun commentaire, faussant le d\u00e9nombrement global de la cohorte initiale.<\/p>\n<p>La pr\u00e9paration m\u00e9thodologique d&rsquo;un tel corpus impose de convertir syst\u00e9matiquement les cellules vierges en une \u00e9tiquette standardis\u00e9e sans contenu s\u00e9mantique parasitant les dictionnaires lexicaux :<\/p>\n<p><code>corpus_clinique &lt;- corpus_brut |&gt;<\/code><br \/>\n<code>&nbsp;&nbsp;mutate(observations_libres = replace_na(observations_libres, \"Aucune observation formul\u00e9e\"))<\/code><\/p>\n<p>L&rsquo;int\u00e9gration explicite de cette formule standardis\u00e9e garantit que chaque unit\u00e9 statistique (chaque patient) est maintenue au sein de l&rsquo;arborescence du corpus. Lors de la phase ult\u00e9rieure de filtrage des mots vides (<em>stop words<\/em>), l&rsquo;expression \u00ab Aucune observation formul\u00e9e \u00bb peut \u00eatre soit isol\u00e9e pour quantifier la pr\u00e9valence des consultations sans incident verbalis\u00e9, soit exclue des calculs de fr\u00e9quence sans risquer de faire dispara\u00eetre les m\u00e9tadonn\u00e9es sociod\u00e9mographiques associ\u00e9es \u00e0 ces observations.<\/p>\n<h2>11. Bonnes pratiques m\u00e9thodologiques, reproductibilit\u00e9 et pi\u00e8ges statistiques<\/h2>\n<h3>11.1 Cons\u00e9quences statistiques de la conversion des NA en cha\u00eenes<\/h3>\n<p>Bien que la substitution d&rsquo;une \u00e9tiquette textuelle \u00e0 un indicateur <code>NA<\/code> constitue une pratique l\u00e9gitime pour l&rsquo;affichage de tables de bord et la documentation qualitative, l&rsquo;analyste doit imp\u00e9rativement mesurer les r\u00e9percussions m\u00e9thodologiques profondes de cette op\u00e9ration sur la validit\u00e9 de ses mod\u00e9lisations statistiques ult\u00e9rieures.<\/p>\n<p>Le premier \u00e9cueil rel\u00e8ve de la neutralisation irr\u00e9versible des m\u00e9canismes de s\u00e9curit\u00e9 int\u00e9gr\u00e9s \u00e0 l&rsquo;interpr\u00e9teur R. Les fonctions d&rsquo;estimation param\u00e9trique (telles que <code>lm()<\/code> pour la r\u00e9gression lin\u00e9aire ou <code>glm()<\/code> pour la r\u00e9gression logistique) disposent d&rsquo;un argument fondamental nomm\u00e9 <code>na.action<\/code>, configur\u00e9 par d\u00e9faut sur <code>na.omit<\/code>. Ce m\u00e9canisme d\u00e9tecte les valeurs manquantes authentiques et ajuste automatiquement les degr\u00e9s de libert\u00e9 du mod\u00e8le en cons\u00e9quence. D\u00e8s lors qu&rsquo;un <code>NA<\/code> est converti en une cha\u00eene textuelle explicite telle que \u00ab Inconnu \u00bb, cette modalit\u00e9 est assimil\u00e9e par le moteur de mod\u00e9lisation \u00e0 un niveau cat\u00e9goriel parfaitement l\u00e9gitime.<\/p>\n<p>Cette transformation artificielle introduit des distorsions conceptuelles majeures :<\/p>\n<ul>\n<li>Le mod\u00e8le statistique cr\u00e9e un param\u00e8tre de r\u00e9gression sp\u00e9cifique pour la modalit\u00e9 textuelle \u00ab Inconnu \u00bb, surconsommant des degr\u00e9s de libert\u00e9 de mani\u00e8re injustifi\u00e9e.<\/li>\n<li>Si la non-r\u00e9ponse est corr\u00e9l\u00e9e \u00e0 une variable non mesur\u00e9e (ph\u00e9nom\u00e8ne MNAR), l&rsquo;estimation des coefficients de r\u00e9gression pour les autres modalit\u00e9s s&rsquo;av\u00e8re lourdement biais\u00e9e.<\/li>\n<li>Les tests de comparaisons multiples et d&rsquo;hypoth\u00e8ses nulles perdent leur \u00e9talonnage probabiliste, augmentant drastiquement le risque d&rsquo;erreur de type I (faux positifs) ou de type II (faux n\u00e9gatifs).<\/li>\n<\/ul>\n<p>Les recommandations m\u00e9thodologiques \u00e9dict\u00e9es par l&rsquo;American Psychological Association (<a rel=\"noopener noreferrer\" href=\"https:\/\/apastyle.apa.org\/\">APA<\/a>) pr\u00e9conisent la transparence absolue dans la documentation du traitement des valeurs manquantes. Dans une perspective inf\u00e9rentielle, la substitution textuelle ne doit jamais \u00eatre utilis\u00e9e pour masquer une incompl\u00e9tude statistique. Lorsque des calculs math\u00e9matiques ou des tests d&rsquo;hypoth\u00e8ses sont programm\u00e9s, les m\u00e9thodes d&rsquo;imputation multiple par \u00e9quations cha\u00een\u00e9es (impl\u00e9ment\u00e9es sous R dans l&rsquo;excellent package <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=mice\">mice<\/a>) ou par algorithmes esp\u00e9rance-maximisation (package <code>Amelia<\/code>) doivent syst\u00e9matiquement primer sur toute manipulation textuelle empirique.<\/p>\n<h3>11.2 Tra\u00e7abilit\u00e9 du code et documentation du flux de travail<\/h3>\n<p>Dans un contexte scientifique international o\u00f9 la crise de la reproductibilit\u00e9 mobilise l&rsquo;attention des comit\u00e9s de lecture, la tra\u00e7abilit\u00e9 des transformations op\u00e9r\u00e9es sur les donn\u00e9es brutes constitue un imp\u00e9ratif \u00e9thique et d\u00e9ontologique. Chaque d\u00e9cision d&rsquo;assainissement textuel doit \u00eatre minutieusement document\u00e9e dans un cahier de laboratoire \u00e9lectronique et inscrite au sein d&rsquo;un codebook (dictionnaire de variables) accessible aux auditeurs de la recherche.<\/p>\n<p>La r\u00e8gle fondamentale d&rsquo;ing\u00e9nierie des donn\u00e9es prescrit l&rsquo;immutabilit\u00e9 des fichiers sources. L&rsquo;analyste ne doit en aucun cas modifier directement ses fichiers de donn\u00e9es brutes sur disque (fichiers CSV, XLSX ou bases SQL d&rsquo;origine). Le pipeline analytique doit charger les donn\u00e9es sources en mode de lecture seule, cr\u00e9er une copie d&rsquo;\u00e9tape en m\u00e9moire vive (nomm\u00e9e explicitement par exemple <code>donnees_etape1_nettoyees<\/code>), et appliquer l&rsquo;ensemble des substitutions via des scripts comment\u00e9s et versionn\u00e9s avec l&rsquo;outil Git.<\/p>\n<p>Pour s&rsquo;assurer qu&rsquo;aucune valeur manquante non intentionnelle ne subsiste \u00e0 la suite de la phase d&rsquo;imputation textuelle, l&rsquo;impl\u00e9mentation de tests unitaires automatis\u00e9s \u00e0 l&rsquo;aide de la biblioth\u00e8que <code>testthat<\/code> repr\u00e9sente une excellente pratique d&rsquo;assurance qualit\u00e9 logicielle :<\/p>\n<p><code>library(testthat)<\/code><br \/>\n<code>test_that(\"V\u00e9rification de l'absence de NA r\u00e9siduels dans la colonne statut\", {<\/code><br \/>\n<code>&nbsp;&nbsp;expect_equal(sum(is.na(cohorte_psy$statut_marital)), 0)<\/code><br \/>\n<code>})<\/code><\/p>\n<p>L&rsquo;int\u00e9gration de tels points de contr\u00f4le tout au long du script de pr\u00e9traitement garantit l&rsquo;int\u00e9grit\u00e9 de la cha\u00eene d&rsquo;analyse et certifie que toute alt\u00e9ration ult\u00e9rieure du pipeline sera imm\u00e9diatement signal\u00e9e en cas de r\u00e9gression ou d&rsquo;introduction accidentelle de nouvelles valeurs manquantes non r\u00e9pertori\u00e9es.<\/p>\n<h2>12. Guide d\u00e9cisionnel r\u00e9capitulatif pour les utilisateurs de R<\/h2>\n<h3>12.1 Matrice de choix d&rsquo;outils selon le contexte analytique<\/h3>\n<p>Face \u00e0 la multiplicit\u00e9 des solutions techniques offertes par l&rsquo;\u00e9cosyst\u00e8me du langage R pour substituer des cha\u00eenes de caract\u00e8res aux valeurs manquantes, le chercheur ou l&rsquo;analyste de donn\u00e9es doit op\u00e9rer un choix \u00e9clair\u00e9 en fonction des contraintes sp\u00e9cifiques de son environnement de travail. Le choix optimal d\u00e9coule d&rsquo;un compromis rationnel entre lisibilit\u00e9 algorithmique, d\u00e9pendances externes, complexit\u00e9 des r\u00e8gles logiques \u00e0 mettre en \u0153uvre et volume des structures de donn\u00e9es trait\u00e9es.<\/p>\n<p>Pour formaliser cette d\u00e9marche d\u00e9cisionnelle, le tableau descriptif ci-dessous synth\u00e9tise les propri\u00e9t\u00e9s compar\u00e9es des approches \u00e9tudi\u00e9es :<\/p>\n<p><strong>M\u00e9thode par indexation en R de base (Base R) :<\/strong><br \/>\nCette approche se caract\u00e9rise par une d\u00e9pendance logicielle nulle, ne requ\u00e9rant aucun chargement de package tiers. Sa vitesse d&rsquo;ex\u00e9cution sur les vecteurs atomiques est remarquable. En revanche, sa lisibilit\u00e9 est mod\u00e9r\u00e9e et le risque d&rsquo;erreur syntaxique par duplication du nom des variables est \u00e9lev\u00e9. Elle s&rsquo;impose particuli\u00e8rement lors du d\u00e9veloppement de packages R autonomes ou sur des serveurs de calcul haute performance hautement s\u00e9curis\u00e9s o\u00f9 le d\u00e9ploiement du Tidyverse est restreint.<\/p>\n<p><strong>M\u00e9thode avec tidyr::replace_na() :<\/strong><br \/>\nRecommand\u00e9e pour son excellente lisibilit\u00e9 au sein de flux de pr\u00e9paration interactifs, cette m\u00e9thode n\u00e9cessite le chargement de l&rsquo;extension <em>tidyr<\/em>. Sa signature simple permet de traiter indiff\u00e9remment des vecteurs isol\u00e9s ou des data frames entiers via une liste associative de remplacement. Elle constitue la norme contemporaine par excellence pour les rapports d&rsquo;analyse reproductibles sous Quarto ou R Markdown.<\/p>\n<p><strong>M\u00e9thode conditionnelle avec dplyr::case_when() :<\/strong><br \/>\nBien que sa d\u00e9pendance logicielle envers le package <em>dplyr<\/em> soit formelle, cette approche offre une expressivit\u00e9 logique in\u00e9gal\u00e9e. Elle est indispensable d\u00e8s lors que l&rsquo;attribution d&rsquo;une \u00e9tiquette textuelle de remplacement d\u00e9pend de conditions logiques crois\u00e9es impliquant d&rsquo;autres variables du tableau de donn\u00e9es (comme la discrimination des non-r\u00e9ponses structurelles face aux omissions r\u00e9elles).<\/p>\n<p><strong>M\u00e9thode pour facteurs avec forcats::fct_na_value_to_level() :<\/strong><br \/>\nCette proc\u00e9dure est sp\u00e9cifiquement d\u00e9di\u00e9e aux variables cat\u00e9gorielles de classe <em>factor<\/em>. Elle r\u00e9sout formellement le probl\u00e8me du rejet d&rsquo;insertion textuelle en int\u00e9grant d&rsquo;abord la modalit\u00e9 dans les <em>levels<\/em> avant d&rsquo;imputer. Elle doit \u00eatre syst\u00e9matiquement pr\u00e9f\u00e9r\u00e9e pour s\u00e9curiser les colonnes qualitatives destin\u00e9es \u00e0 l&rsquo;inf\u00e9rence sans alt\u00e9rer leur structure typologique sous-jacente.<\/p>\n<h3>12.2 Synth\u00e8se des instructions et aide-m\u00e9moire de programmation<\/h3>\n<p>Pour clore ce manuel de r\u00e9f\u00e9rence et offrir aux chercheurs un guide op\u00e9rationnel d&rsquo;application quotidienne, ce r\u00e9capitulatif regroupe les commandes fondamentales indispensables \u00e0 la manipulation et \u00e0 la substitution des valeurs <code>NA<\/code> par du texte sous R :<\/p>\n<p>1. <strong>Substitution dans un vecteur isol\u00e9 (Tidyverse) :<\/strong><br \/>\n<code>x &lt;- replace_na(x, \"Non renseign\u00e9\")<\/code><\/p>\n<p>2. <strong>Substitution dans un vecteur isol\u00e9 (R de base) :<\/strong><br \/>\n<code>x[is.na(x)] &lt;- \"Non renseign\u00e9\"<\/code><\/p>\n<p>3. <strong>Substitution simultan\u00e9e dans un data frame complet :<\/strong><br \/>\n<code>donnees &lt;- donnees |&gt; replace_na(list(var1 = \"Inconnu\", var2 = \"Non sp\u00e9cifi\u00e9\"))<\/code><\/p>\n<p>4. <strong>Substitution dans un pipeline dplyr avec mutate :<\/strong><br \/>\n<code>donnees &lt;- donnees |&gt; mutate(var = replace_na(var, \"Valeur\"))<\/code><\/p>\n<p>5. <strong>Substitution automatique sur toutes les colonnes textuelles :<\/strong><br \/>\n<code>donnees &lt;- donnees |&gt; mutate(across(where(is.character), ~ replace_na(.x, \"Absent\")))<\/code><\/p>\n<p>6. <strong>Substitution s\u00e9curis\u00e9e sur une variable cat\u00e9gorielle (Facteur) :<\/strong><br \/>\n<code>donnees &lt;- donnees |&gt; mutate(var_fact = forcats::fct_na_value_to_level(var_fact, level = \"Non document\u00e9\"))<\/code><\/p>\n<p>7. <strong>Conversion pr\u00e9alable des fausses cha\u00eenes en v\u00e9ritables NA :<\/strong><br \/>\n<code>donnees &lt;- donnees |&gt; mutate(var = dplyr::na_if(var, \"N\/A\")) |&gt; mutate(var = replace_na(var, \"Non document\u00e9\"))<\/code><\/p>\n<p>8. <strong>V\u00e9rification post-transformation de l&rsquo;absence de NA r\u00e9siduels :<\/strong><br \/>\n<code>table(donnees$var, useNA = \"always\")<\/code><\/p>\n<p>En int\u00e9grant ces instructions standardis\u00e9es au sein de leurs protocoles de recherche, les analystes de donn\u00e9es s&rsquo;assurent d&rsquo;une manipulation rigoureuse, transparente et p\u00e9renne de leurs corpus empiriques. L&rsquo;assainissement syst\u00e9matique des donn\u00e9es manquantes, loin de se r\u00e9duire \u00e0 un simple artifice d&rsquo;affichage, participe pleinement \u00e0 l&rsquo;\u00e9l\u00e9vation des standards de qualit\u00e9 et de reproductibilit\u00e9 de la science computationnelle contemporaine.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>American Psychological Association. (2020). <em>Publication manual of the American Psychological Association<\/em> (7th ed.). American Psychological Association. <a rel=\"noopener noreferrer\" href=\"https:\/\/apastyle.apa.org\/\">https:\/\/apastyle.apa.org\/<\/a><\/li>\n<li>Beck, A. T., Steer, R. A., &amp; Brown, G. K. (1996). <em>Manual for the Beck Depression Inventory-II<\/em>. Psychological Corporation. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1037\/t00742-000\">https:\/\/doi.org\/10.1037\/t00742-000<\/a><\/li>\n<li>Little, R. J. A., &amp; Rubin, D. B. (2019). <em>Statistical analysis with missing data<\/em> (3rd ed.). John Wiley &amp; Sons. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1002\/9781119482864\">https:\/\/doi.org\/10.1002\/9781119482864<\/a><\/li>\n<li>R Core Team. (2023). <em>R: A language and environment for statistical computing<\/em>. R Foundation for Statistical Computing. <a rel=\"noopener noreferrer\" href=\"https:\/\/www.r-project.org\/\">https:\/\/www.r-project.org\/<\/a><\/li>\n<li>Rubin, D. B. (1976). Inference and missing data. <em>Biometrika<\/em>, 63(3), 581-592. <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 &amp; 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> (2nd ed.). Chapman &amp; Hall\/CRC. <a rel=\"noopener noreferrer\" href=\"https:\/\/stefvanbuuren.name\/fimd\/\">https:\/\/stefvanbuuren.name\/fimd\/<\/a><\/li>\n<li>Wickham, H. (2014). Tidy data. <em>Journal of Statistical Software<\/em>, 59(10), 1-23. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.18637\/jss.v059.i10\">https:\/\/doi.org\/10.18637\/jss.v059.i10<\/a><\/li>\n<li>Wickham, H. (2019). <em>Advanced R<\/em> (2nd ed.). Chapman &amp; Hall\/CRC. <a rel=\"noopener noreferrer\" href=\"https:\/\/adv-r.hadley.nz\/\">https:\/\/adv-r.hadley.nz\/<\/a><\/li>\n<li>Wickham, H., \u00c7etinkaya-Rundel, M., &amp; Grolemund, G. (2023). <em>R for data science<\/em> (2nd ed.). O&rsquo;Reilly Media. <a rel=\"noopener noreferrer\" href=\"https:\/\/r4ds.hadley.nz\/\">https:\/\/r4ds.hadley.nz\/<\/a><\/li>\n<li>Wickham, H., Fran\u00e7ois, R., Henry, L., M\u00fcller, K., &amp; Vaughan, D. (2023). <em>dplyr: A grammar of data manipulation<\/em> (R package version 1.1.4). <a rel=\"noopener noreferrer\" href=\"https:\/\/CRAN.R-project.org\/package=dplyr\">https:\/\/CRAN.R-project.org\/package=dplyr<\/a><\/li>\n<li>Wickham, H., Vaughan, D., &amp; Girlich, M. (2024). <em>tidyr: Tidy messy data<\/em> (R package version 1.3.1). <a rel=\"noopener noreferrer\" href=\"https:\/\/CRAN.R-project.org\/package=tidyr\">https:\/\/CRAN.R-project.org\/package=tidyr<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide complet pour imputer et remplacer les valeurs NA par des cha\u00eenes de caract\u00e8res dans R avec tidyr, dplyr et le R de base dans les \u00e9tudes comportementales.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[1829,2193],"tags":[3348,3347,3346,3345,3060],"class_list":["post-1578","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-statistique","category-programmation-r","tag-donnees-manquantes","tag-r-de-base","tag-replace_na","tag-tidyr","tag-tidyverse"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/1578","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=1578"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/1578\/revisions"}],"predecessor-version":[{"id":16253,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/1578\/revisions\/16253"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1578"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1578"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1578"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}