{"id":4841,"date":"2026-09-11T13:40:00","date_gmt":"2026-09-11T13:40:00","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-recuperer-les-numeros-de-ligne-dans-r-avec-exemples\/"},"modified":"2026-09-11T13:40:00","modified_gmt":"2026-09-11T13:40:00","slug":"comment-recuperer-les-numeros-de-ligne-dans-r-avec-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-recuperer-les-numeros-de-ligne-dans-r-avec-exemples","title":{"rendered":"Comment r\u00e9cup\u00e9rer les num\u00e9ros de ligne dans R (avec exemples)"},"content":{"rendered":"<p>Dans l&rsquo;\u00e9cosyst\u00e8me du calcul scientifique et de l&rsquo;analyse statistique sous le langage R, la manipulation des structures de donn\u00e9es tabulaires constitue une comp\u00e9tence fondamentale pour les chercheurs, les data scientists et les bio-statisticiens. Si la plupart des op\u00e9rations routini\u00e8res s&rsquo;orientent spontan\u00e9ment vers l&rsquo;extraction de sous-ensembles de valeurs ou le calcul d&rsquo;agr\u00e9gats r\u00e9capitulatifs, la localisation pr\u00e9cise, univoque et reproductible des rangs ou coordonn\u00e9es positionnelles des observations demeure un pr\u00e9requis m\u00e9thodologique d&rsquo;une importance capitale. Savoir extraire non pas seulement les valeurs d&rsquo;une variable qui satisfont un crit\u00e8re donn\u00e9, mais l&#8217;emplacement ordinal exact des lignes concern\u00e9es dans la matrice de donn\u00e9es sous-jacente, permet de s\u00e9curiser le tra\u00e7age analytique, de diagnostiquer des anomalies et d&rsquo;op\u00e9rer des transformations chirurgicales au sein des protocoles de recherche empirique.<\/p>\n<p>Le langage de programmation statistique R, d\u00e9velopp\u00e9 initialement par Ross Ihaka et Robert Gentleman au sein du d\u00e9partement de statistique de l&rsquo;universit\u00e9 d&rsquo;Auckland et d\u00e9sormais maintenu par le <a rel=\"noopener noreferrer\" href=\"https:\/\/www.r-project.org\/\">R Development Core Team<\/a>, se distingue par une approche vectorielle native profond\u00e9ment ancr\u00e9e dans l&rsquo;h\u00e9ritage formel du langage S. Au sein de cet environnement, l&rsquo;indexation n&rsquo;est pas un simple artifice d&rsquo;acc\u00e8s syntaxique : elle refl\u00e8te l&rsquo;architecture matricielle des donn\u00e9es en m\u00e9moire vive. Or, selon que l&rsquo;on travaille dans le cadre du socle conventionnel (base R), avec la syntaxe d\u00e9clarative et expressive du <a rel=\"noopener noreferrer\" href=\"https:\/\/www.tidyverse.org\/\">Tidyverse<\/a>, ou sous les contraintes de haute performance algorithmique offertes par l&rsquo;extension <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/web\/packages\/data.table\/\">data.table<\/a>, les m\u00e9canismes d&rsquo;extraction des num\u00e9ros de ligne mobilisent des paradigmes distincts dont l&rsquo;assimilation conditionne la robustesse des cha\u00eenes de traitement quantitatif.<\/p>\n<p>Ce guide exhaustif a pour vocation d&rsquo;analyser en profondeur l&rsquo;ensemble des concepts, fonctions et strat\u00e9gies computationnelles permettant de r\u00e9cup\u00e9rer les num\u00e9ros de ligne dans R. Depuis les fondements logiques de la fonction fondamentale <code>which()<\/code> jusqu&rsquo;aux architectures binaires index\u00e9es des tables de donn\u00e9es massives, en passant par la gestion d\u00e9licate des valeurs ind\u00e9termin\u00e9es et les probl\u00e9matiques de virgule flottante, nous explorerons les implications th\u00e9oriques et pratiques de chaque m\u00e9thode \u00e0 travers des exemples concrets issus des sciences quantitatives et exp\u00e9rimentales.<\/p>\n<h2>1. Introduction aux m\u00e9canismes d&rsquo;indexation matricielle et vectorielle dans R<\/h2>\n<h3>1.1 Importance m\u00e9thodologique de l&rsquo;identification des rangs<\/h3>\n<p>La tra\u00e7abilit\u00e9 univoque des observations constitue l&rsquo;un des piliers de la reproductibilit\u00e9 scientifique et de la validation empirique. Dans une d\u00e9marche exp\u00e9rimentale rigoureuse, qu&rsquo;il s&rsquo;agisse d&rsquo;un essai clinique randomis\u00e9 ou d&rsquo;une mod\u00e9lisation \u00e9conom\u00e9trique longitudinale, chaque ligne d&rsquo;une table de donn\u00e9es repr\u00e9sente une unit\u00e9 observationnelle singuli\u00e8re \u00e0 un instant donn\u00e9. Distinguer formellement la valeur mesur\u00e9e d&rsquo;une variable de sa coordonn\u00e9e positionnelle est une n\u00e9cessit\u00e9 conceptuelle \u00e9l\u00e9mentaire : la valeur indique une modalit\u00e9 ph\u00e9notypique, comportementale ou physique, tandis que le rang identifie l&rsquo;ancrage spatial de l&rsquo;entit\u00e9 dans le dispositif d&rsquo;enregistrement num\u00e9rique. Confondre l&rsquo;attribut d&rsquo;une mesure et sa coordonn\u00e9e affaiblit consid\u00e9rablement la robustesse de l&rsquo;analyse, exposant le chercheur \u00e0 des \u00e9cueils m\u00e9thodologiques lors de rapprochements ult\u00e9rieurs.<\/p>\n<p>Dans les phases critiques de nettoyage, de fiabilisation et d&rsquo;audit des bases de donn\u00e9es complexes, l&rsquo;extraction des num\u00e9ros de ligne s&rsquo;av\u00e8re indispensable. Lorsqu&rsquo;un algorithme de d\u00e9tection signale une coh\u00e9rence interne viol\u00e9e \u2014 par exemple, une fr\u00e9quence cardiaque incompatible avec la vie humaine ou une divergence de chronologie entre deux sessions \u2014, le statisticien ne peut se contenter d&rsquo;isoler la valeur incrimin\u00e9e hors de son contexte. Il doit imp\u00e9rativement remonter \u00e0 la source de l&rsquo;observation au sein de la matrice brute pour v\u00e9rifier les m\u00e9tadonn\u00e9es associ\u00e9es, auditer les formulaires de recueil originaux ou appliquer un protocole de correction cibl\u00e9. L&rsquo;identification positionnelle op\u00e8re ainsi comme un fil d&rsquo;Ariane analytique qui garantit l&rsquo;int\u00e9grit\u00e9 du lien entre les donn\u00e9es brutes et les mod\u00e8les inf\u00e9rentiels finaux.<\/p>\n<p>Enfin, dans le cadre de protocoles d&rsquo;assurance qualit\u00e9 logicielle et d&rsquo;analyse m\u00e9dico-l\u00e9gale de donn\u00e9es de recherche, la capacit\u00e9 \u00e0 figer, documenter et v\u00e9rifier les rangs d&rsquo;extraction conditionne la validit\u00e9 des audits de conformit\u00e9 r\u00e9glementaire (notamment sous les directives de la Food and Drug Administration ou des normes de bonnes pratiques de laboratoire). Savoir pr\u00e9cis\u00e9ment quelles lignes ont \u00e9t\u00e9 trait\u00e9es, modifi\u00e9es ou \u00e9cart\u00e9es d&rsquo;un mod\u00e8le statistique offre un niveau de transparence sup\u00e9rieur, \u00e9liminant tout doute quant \u00e0 d&rsquo;\u00e9ventuelles alt\u00e9rations non document\u00e9es du corpus exp\u00e9rimental originel.<\/p>\n<h3>1.2 Structure interne des data frames et gestion des indices<\/h3>\n<p>Au niveau de la repr\u00e9sentation en m\u00e9moire dans le moteur interne de R, un objet de classe <code>data.frame<\/code> n&rsquo;est pas une simple matrice bidimensionnelle, mais une liste g\u00e9n\u00e9rique (type <code>VECSXP<\/code> en C interne) compos\u00e9e de vecteurs atomiques de dimensions identiques, chacun repr\u00e9sentant une variable. Cette sp\u00e9cificit\u00e9 architecturale induit une dualit\u00e9 fondamentale dans le m\u00e9canisme de r\u00e9f\u00e9rencement : la table poss\u00e8de une dimensionnalit\u00e9 bidimensionnelle virtuelle tout en conservant une structure sous-jacente segment\u00e9e par colonnes. L&rsquo;acc\u00e8s aux rangs individuels impose d\u00e8s lors une r\u00e9solution conjointe de la dimension verticale, mat\u00e9rialis\u00e9e conceptuellement par l&rsquo;attribut interne <code>row.names<\/code>.<\/p>\n<p>L&rsquo;attribut <code>row.names<\/code> d&rsquo;un data frame peut adopter deux \u00e9tats distincts au sein de l&rsquo;environnement de calcul. Dans sa configuration implicite et optimale, R stocke un format compact repr\u00e9sent\u00e9 par un vecteur d&rsquo;entiers s\u00e9quentiels n\u00e9gatifs, signal\u00e9 sous la forme <code>.set_row_names(n)<\/code>. Cette optimisation de bas niveau permet de manipuler les rangs sans allouer inutilement une s\u00e9quence explicite de cha\u00eenes de caract\u00e8res en m\u00e9moire vive. Toutefois, d\u00e8s lors que l&rsquo;utilisateur ou une routine de lecture (telle que <code>read.table<\/code> ou <code>read.csv<\/code>) assigne des identifiants textuels sp\u00e9cifiques, R mat\u00e9rialise un vecteur de cha\u00eenes de caract\u00e8res complet pour ces noms de lignes, ce qui alt\u00e8re profond\u00e9ment les m\u00e9canismes de s\u00e9lection par crochets <code>[i, j]<\/code>.<\/p>\n<p>\u00c0 l&rsquo;inverse, une matrice conventionnelle sous R repose sur un unique vecteur atomique continu muni d&rsquo;un attribut de dimension <code>dim<\/code> de longueur deux. L&rsquo;indexation matricielle s&rsquo;effectue selon le mode colonne pr\u00e9dominant (col-major order), o\u00f9 les \u00e9l\u00e9ments sont align\u00e9s de mani\u00e8re contigu\u00eb en m\u00e9moire. Les indices d&rsquo;un data frame et ceux d&rsquo;une matrice ne r\u00e9pondent donc pas exactement aux m\u00eames contraintes d&rsquo;adressage m\u00e9moire : l&rsquo;acc\u00e8s aux rangs d&rsquo;un data frame n\u00e9cessite d&rsquo;extraire le i-i\u00e8me \u00e9l\u00e9ment de chaque vecteur composant la liste, tandis que l&rsquo;acc\u00e8s matriciel calcule directement un d\u00e9calage de pointeur (pointer offset) lin\u00e9aire.<\/p>\n<h3>1.3 Enjeux computationnels dans le traitement des donn\u00e9es quantitatives<\/h3>\n<p>La recherche positionnelle au sein de grandes structures quantitatives soul\u00e8ve des probl\u00e9matiques de complexit\u00e9 algorithmique temporelle et spatiale qu&rsquo;aucun praticien ne saurait ignorer. L&rsquo;\u00e9valuation na\u00efve d&rsquo;un crit\u00e8re positionnel implique g\u00e9n\u00e9ralement un balayage lin\u00e9aire int\u00e9gral de la colonne consid\u00e9r\u00e9e, correspondant \u00e0 une complexit\u00e9 temporelle d&rsquo;ordre <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{O}(N)\">$\\mathcal{O}(N)$<\/span>, o\u00f9 <span class=\"arabpsy-math-inline\" data-latex=\"N\">$N$<\/span> d\u00e9signe l&rsquo;effectif total des observations. Si cette charge calculatoire demeure totalement indolore sur des jeux de donn\u00e9es acad\u00e9miques de quelques milliers d&rsquo;enregistrements, elle devient un goulet d&rsquo;\u00e9tranglement majeur lorsqu&rsquo;elle est r\u00e9p\u00e9t\u00e9e dans des boucles it\u00e9ratives, des simulations de Monte-Carlo ou des traitements de flux de donn\u00e9es massives (g\u00e9nomique, microdonn\u00e9es financi\u00e8res, capteurs IoT).<\/p>\n<p>Un autre d\u00e9fi m\u00e9thodologique r\u00e9side dans la pr\u00e9servation sans faille de l&rsquo;int\u00e9grit\u00e9 r\u00e9f\u00e9rentielle lors des op\u00e9rations de sous-\u00e9chantillonnage et de filtrage successif. Lorsque l&rsquo;on proc\u00e8de \u00e0 une extraction par condition logique, la suppression physique de certaines lignes entra\u00eene une renum\u00e9rotation implicite ou un d\u00e9calage des rangs dans la structure fille obtenue. Si le code fait r\u00e9f\u00e9rence \u00e0 des indices positionnels fixes d\u00e9termin\u00e9s en amont de l&rsquo;\u00e9puration, une confusion d\u00e9vastatrice s&rsquo;installe entre les coordonn\u00e9es du tableau d&rsquo;origine et celles du sous-tableau partitionn\u00e9. Les erreurs d&rsquo;indexation d\u00e9cal\u00e9e (off-by-one errors ou requ\u00eatages sur des positions obsol\u00e8tes) constituent l&rsquo;une des causes les plus insidieuses de corruption silencieuse des r\u00e9sultats scientifiques.<\/p>\n<p>L&rsquo;optimisation des requ\u00eates positionnelles impose donc un contr\u00f4le rigoureux du cycle de vie des indices. La garantie d&rsquo;une parfaite concordance entre les num\u00e9ros de ligne extraits et l&rsquo;\u00e9tat exact de la structure tabulaire au moment pr\u00e9cis du calcul conditionne l&rsquo;exactitude de l&rsquo;ensemble des analyses subs\u00e9quentes, depuis les imputations conditionnelles jusqu&rsquo;aux r\u00e9gressions multivari\u00e9es appliqu\u00e9es \u00e0 des strates sp\u00e9cifiques de l&rsquo;\u00e9chantillon.<\/p>\n<h2>2. Fondements logiques de la fonction which() dans l&rsquo;environnement R de base<\/h2>\n<h3>2.1 M\u00e9canisme interne et \u00e9valuation bool\u00e9enne<\/h3>\n<p>La fonction <code>which()<\/code> repr\u00e9sente la cl\u00e9 de vo\u00fbte de l&rsquo;extraction positionnelle dans le socle fondamental du langage R. Son principe de fonctionnement repose sur la conversion d\u00e9terministe d&rsquo;un vecteur d&rsquo;entr\u00e9e bool\u00e9en (contenant des valeurs logiques <code>TRUE<\/code> ou <code>FALSE<\/code>) en un vecteur d&rsquo;indices num\u00e9riques entiers correspondant exclusivement aux positions \u00e9valu\u00e9es comme strictement vraies. Lorsqu&rsquo;une condition relationnelle est soumise \u00e0 un vecteur de donn\u00e9es, R g\u00e9n\u00e8re d&rsquo;abord une structure logique interm\u00e9diaire de m\u00eame dimension, puis <code>which()<\/code> en extrait les localisations ordinales absolues.<\/p>\n<p>Consid\u00e9rons un vecteur num\u00e9rique \u00e9l\u00e9mentaire repr\u00e9sentant des scores d&rsquo;anxi\u00e9t\u00e9 mesur\u00e9s chez six patients :<\/p>\n<p><code>scores &lt;- c(12, 18, 25, 9, 31, 14)<\/code><\/p>\n<p>Lorsque le chercheur \u00e9value l&rsquo;expression logique <code>condition &lt;- scores &gt; 15<\/code>, R produit le vecteur bool\u00e9en suivant :<\/p>\n<p><code>c(FALSE, TRUE, TRUE, FALSE, TRUE, FALSE)<\/code><\/p>\n<p>L&rsquo;application directe de la fonction positionnelle sous la forme <code>which(scores &gt; 15)<\/code> instancie une conversion imm\u00e9diate qui renvoie le vecteur d&rsquo;entiers <code>c(2, 3, 5)<\/code>. Il importe de souligner une divergence fonctionnelle majeure entre l&rsquo;extraction indic\u00e9e et le sous-\u00e9chantillonnage bool\u00e9en direct. Si l&rsquo;on \u00e9crit <code>scores[scores &gt; 15]<\/code>, R utilise le masque logique pour filtrer et renvoyer les valeurs scalaires contenues dans le vecteur (soit 18, 25 et 31). En revanche, l&rsquo;appel \u00e0 <code>which()<\/code> renvoie la m\u00e9tadonn\u00e9e positionnelle, c&rsquo;est-\u00e0-dire l&rsquo;adresse ordinale de ces \u00e9l\u00e9ments dans le r\u00e9ceptacle originel. Cette distinction est cruciale : l&rsquo;indice permet de modifier r\u00e9troactivement la structure, d&rsquo;aligner d&rsquo;autres variables ou de proc\u00e9der \u00e0 un audit structural, ce que les valeurs isol\u00e9es ne permettent pas d&rsquo;accomplir de mani\u00e8re biunivoque.<\/p>\n<h3>2.2 Signature formelle et arguments de la fonction<\/h3>\n<p>La signature canonique de la fonction telle qu&rsquo;elle est document\u00e9e au sein de l&rsquo;environnement de base se pr\u00e9sente sous une forme \u00e9pur\u00e9e :<\/p>\n<p><code>which(x, arr.ind = FALSE, useNames = TRUE)<\/code><\/p>\n<p>L&rsquo;argument central, not\u00e9 <code>x<\/code>, doit imp\u00e9rativement \u00eatre un objet de type logique, qu&rsquo;il s&rsquo;agisse d&rsquo;un vecteur, d&rsquo;un tableau ou d&rsquo;un masque bool\u00e9en g\u00e9n\u00e9r\u00e9 par une comparaison relationnelle. Si un argument d&rsquo;une autre nature atomique (num\u00e9rique, caract\u00e8re) est transmis, R proc\u00e8de \u00e0 une coercition implicite selon ses r\u00e8gles habituelles (o\u00f9 toute valeur num\u00e9rique non nulle est assimil\u00e9e \u00e0 <code>TRUE<\/code> et z\u00e9ro \u00e0 <code>FALSE<\/code>), bien que cette pratique soit fortement d\u00e9conseill\u00e9e dans un cadre d&rsquo;analyse formelle en raison des ambigu\u00eft\u00e9s s\u00e9mantiques qu&rsquo;elle introduit.<\/p>\n<p>Le second argument, <code>arr.ind<\/code> (abr\u00e9viation de <em>array indices<\/em>), accepte une valeur bool\u00e9enne qui modifie radicalement la topologie du r\u00e9sultat lorsque l&rsquo;objet d&rsquo;entr\u00e9e poss\u00e8de un attribut de dimension sup\u00e9rieur ou \u00e9gal \u00e0 deux. Si <code>arr.ind = FALSE<\/code> (sa valeur par d\u00e9faut), <code>which()<\/code> traite l&rsquo;objet comme s&rsquo;il s&rsquo;agissait d&rsquo;un vecteur plat d\u00e9pli\u00e9 en ordre col-major et retourne de simples entiers scalaires univari\u00e9s. Si le param\u00e8tre est explicitement configur\u00e9 \u00e0 <code>arr.ind = TRUE<\/code>, la fonction retourne une matrice d&rsquo;entiers dont chaque ligne correspond \u00e0 un \u00e9l\u00e9ment vrai et dont les colonnes renseignent explicitement les coordonn\u00e9es matricielles respectives, typiquement <code>row<\/code> (num\u00e9ro de ligne) et <code>col<\/code> (num\u00e9ro de colonne). Enfin, l&rsquo;argument <code>useNames<\/code> contr\u00f4le si les \u00e9ventuels noms associ\u00e9s aux \u00e9l\u00e9ments du vecteur logique d&rsquo;origine doivent \u00eatre conserv\u00e9s dans le vecteur d&rsquo;entiers r\u00e9sultant.<\/p>\n<h3>2.3 Propri\u00e9t\u00e9s math\u00e9matiques des vecteurs d&rsquo;indices r\u00e9sultants<\/h3>\n<p>Les vecteurs g\u00e9n\u00e9r\u00e9s par la fonction <code>which()<\/code> pr\u00e9sentent des propri\u00e9t\u00e9s math\u00e9matiques et alg\u00e9briques strictes qui en garantissent la pr\u00e9visibilit\u00e9 au sein des cha\u00eenes de calcul. La premi\u00e8re de ces caract\u00e9ristiques est la <em>monotonie strictement croissante<\/em>. L&rsquo;algorithme interne de <code>which()<\/code> parcourt les \u00e9l\u00e9ments du vecteur logique s\u00e9quentiellement, de l&rsquo;indice $1$ jusqu&rsquo;\u00e0 l&rsquo;indice maximal <span class=\"arabpsy-math-inline\" data-latex=\"N\">$N$<\/span>. Par cons\u00e9quent, pour tout couple d&rsquo;indices r\u00e9sultants <span class=\"arabpsy-math-inline\" data-latex=\"(i_k, i_{k+1})\">$(i_k, i_{k+1})$<\/span>, la relation <span class=\"arabpsy-math-inline\" data-latex=\"i_k &lt; i_{k+1}\">$i_k &lt; i_{k+1}$<\/span> est syst\u00e9matiquement v\u00e9rifi\u00e9e. Cette pr\u00e9servation rigoureuse de l&rsquo;ordre d&rsquo;origine est essentielle lorsqu&rsquo;on applique ult\u00e9rieurement des calculs diff\u00e9rentiels ou des analyses de s\u00e9ries temporelles d\u00e9pendantes de la chronologie des enregistrements.<\/p>\n<p>La seconde propri\u00e9t\u00e9 concerne la gestion des ensembles vides. Lorsqu&rsquo;aucun \u00e9l\u00e9ment du vecteur logique ne satisfait la condition prescrite (c&rsquo;est-\u00e0-dire lorsque toutes les positions valent <code>FALSE<\/code>), la fonction ne g\u00e9n\u00e8re ni une erreur d&rsquo;ex\u00e9cution, ni la valeur ind\u00e9termin\u00e9e <code>NA<\/code>, ni le scalaire z\u00e9ro. Elle renvoie tr\u00e8s exactement un vecteur d&rsquo;entiers de longueur nulle, not\u00e9 formellement <code>integer(0)<\/code>. Ce comportement math\u00e9matique respecte la th\u00e9orie axiomatique des ensembles : l&rsquo;ensemble des indices validant une proposition fausse sur tout l&rsquo;espace d&rsquo;\u00e9chantillonnage est l&rsquo;ensemble vide <span class=\"arabpsy-math-inline\" data-latex=\"emptyset\">$emptyset$<\/span>.<\/p>\n<p>Enfin, la fonction b\u00e9n\u00e9ficie d&rsquo;une stabilit\u00e9 computationnelle totale sur des vecteurs de dimension arbitraire. Le r\u00e9sultat est d\u00e9terministe et ne d\u00e9pend d&rsquo;aucun \u00e9tat global mutable du syst\u00e8me, ce qui conf\u00e8re aux scripts d&rsquo;analyse une idempotence indispensable aux publications scientifiques \u00e9valu\u00e9es par les pairs.<\/p>\n<h2>3. Extraction de num\u00e9ros de ligne bas\u00e9e sur un crit\u00e8re d&rsquo;\u00e9galit\u00e9 stricte<\/h2>\n<h3>3.1 Mise en \u0153uvre sur des variables cat\u00e9gorielles et qualitatives<\/h3>\n<p>L&rsquo;une des requ\u00eates les plus r\u00e9currentes dans le pr\u00e9traitement des donn\u00e9es quantitatives consiste \u00e0 identifier les positions des observations appartenant \u00e0 un groupe exp\u00e9rimental d\u00e9fini. L&rsquo;\u00e9valuation s&rsquo;appuie sur l&rsquo;op\u00e9rateur relationnel d&rsquo;\u00e9galit\u00e9 stricte <code>==<\/code>, qui compare chaque \u00e9l\u00e9ment d&rsquo;un vecteur \u00e0 une constante de r\u00e9f\u00e9rence scalaire. La vectorisation native de R garantit que l&rsquo;op\u00e9ration s&rsquo;ex\u00e9cute le long de l&rsquo;ensemble de la colonne sans exiger l&rsquo;\u00e9criture de boucles it\u00e9ratives manuelles.<\/p>\n<p>Imaginons un protocole d&rsquo;\u00e9valuation neuropsychologique mod\u00e9lis\u00e9 par le data frame suivant, comprenant l&rsquo;identifiant du sujet, la modalit\u00e9 d&rsquo;assignation th\u00e9rapeutique et le score au test de rappel diff\u00e9r\u00e9 :<\/p>\n<p><code>donnees_cliniques &lt;- data.frame(<br \/>\n&nbsp;&nbsp;sujet = c(\"S01\", \"S02\", \"S03\", \"S04\", \"S05\", \"S06\"),<br \/>\n&nbsp;&nbsp;groupe = c(\"Controle\", \"Placebo\", \"Traitement\", \"Traitement\", \"Controle\", \"Traitement\"),<br \/>\n&nbsp;&nbsp;score = c(45, 52, 78, 85, 48, 92),<br \/>\n&nbsp;&nbsp;stringsAsFactors = FALSE<br \/>\n)<\/code><\/p>\n<p>Pour r\u00e9cup\u00e9rer l&rsquo;ensemble pr\u00e9cis des num\u00e9ros de ligne occup\u00e9s par les participants ayant b\u00e9n\u00e9fici\u00e9 de la mol\u00e9cule active, la formulation canonique s&rsquo;\u00e9crit :<\/p>\n<p><code>lignes_traitement &lt;- which(donnees_cliniques$groupe == \"Traitement\")<\/code><\/p>\n<p>L&rsquo;ex\u00e9cution de cette instruction renvoie le vecteur num\u00e9rique <code>c(3, 4, 6)<\/code>. Ce r\u00e9sultat signale imm\u00e9diatement au chercheur que les troisi\u00e8me, quatri\u00e8me et sixi\u00e8me lignes de la structure tabulaire originelle correspondent aux individus de la cohorte exp\u00e9rimentale cibl\u00e9e. Ces rangs peuvent \u00eatre stock\u00e9s dans un objet ind\u00e9pendant, servir de points de contr\u00f4le qualit\u00e9, ou \u00eatre mobilis\u00e9s pour inspecter d&rsquo;\u00e9ventuelles covariables annexes sans alt\u00e9rer la topologie de la table ma\u00eetresse.<\/p>\n<h3>3.2 Application aux variables num\u00e9riques et consid\u00e9rations de pr\u00e9cision<\/h3>\n<p>Si la formulation de l&rsquo;\u00e9galit\u00e9 stricte ne soul\u00e8ve aucune ambigu\u00eft\u00e9 conceptuelle sur des cha\u00eenes de caract\u00e8res ou des entiers stricts, son application directe sur des variables num\u00e9riques continues peut mener \u00e0 des d\u00e9convenues analytiques s\u00e9v\u00e8res. Cette fragilit\u00e9 provient de l&rsquo;architecture mat\u00e9rielle sous-jacente des ordinateurs modernes, r\u00e9gie par la norme internationale <a rel=\"noopener noreferrer\" href=\"https:\/\/standards.ieee.org\/ieee\/754\/6210\/\">IEEE 754<\/a> relative \u00e0 l&rsquo;arithm\u00e9tique en virgule flottante en double pr\u00e9cision.<\/p>\n<p>De nombreux nombres d\u00e9cimaux \u00e9l\u00e9mentaires en base 10 (tels que 0.1 ou 0.7) ne poss\u00e8dent pas de repr\u00e9sentation binaire finie en base 2. Il en r\u00e9sulte d&rsquo;in\u00e9vitables erreurs d&rsquo;arrondi infinit\u00e9simales lors des calculs arithm\u00e9tiques. Ainsi, l&rsquo;\u00e9valuation de l&rsquo;expression <code>(0.3 - 0.1) == 0.2<\/code> sous R retourne <code>FALSE<\/code> en raison d&rsquo;une divergence log\u00e9e au niveau du cinquante-troisi\u00e8me bit de mantisse. D\u00e8s lors, tenter de r\u00e9cup\u00e9rer des lignes par une \u00e9galit\u00e9 directe sur un r\u00e9sultat de transformation math\u00e9matique produit des faux n\u00e9gatifs dramatiques :<\/p>\n<p><code>vecteur_mesures &lt;- c(1.0, 0.2, 0.4 - 0.2, 0.8)<br \/>\nwhich(vecteur_mesures == 0.2)<\/code><\/p>\n<p>Dans ce sc\u00e9nario sp\u00e9cifique, la fonction ne renverra fr\u00e9quemment que l&rsquo;indice <code>2<\/code>, ignorant superbement l&rsquo;indice <code>3<\/code> pourtant th\u00e9oriquement identique sur le plan alg\u00e9brique. Pour contourner cette limite intrins\u00e8que \u00e0 la physique du calcul num\u00e9rique, la recherche positionnelle sur des grandeurs continues doit imp\u00e9rativement employer un crit\u00e8re de proximit\u00e9 relative ou absolue adoss\u00e9 \u00e0 un seuil de tol\u00e9rance (epsilon machine). On mobilisera judicieusement la constante <code>.Machine$double.eps<\/code> ou une fonction de comparaison s\u00e9curis\u00e9e :<\/p>\n<p><code>epsilon &lt;- 1e-9<br \/>\nwhich(abs(vecteur_mesures - 0.2) &lt; epsilon)<\/code><\/p>\n<p>Cette syntaxe garantit que toutes les observations situ\u00e9es dans un voisinage infinit\u00e9simal de la valeur th\u00e9orique vis\u00e9e verront leur num\u00e9ro de ligne extrait avec une rigueur statistique irr\u00e9prochable.<\/p>\n<h3>3.3 Diff\u00e9renciation entre facteurs et cha\u00eenes de caract\u00e8res<\/h3>\n<p>Une attention m\u00e9ticuleuse doit \u00eatre port\u00e9e \u00e0 la nature de la variable cat\u00e9gorielle analys\u00e9e, notamment lorsqu&rsquo;il s&rsquo;agit de discriminer entre un vecteur de type cha\u00eene de caract\u00e8res (<code>character<\/code>) et une variable cat\u00e9goris\u00e9e sous forme de facteur (<code>factor<\/code>). Historiquement, les versions de R ant\u00e9rieures \u00e0 la mouture 4.0.0 convertissaient implicitement toute variable textuelle en facteur lors de l&rsquo;instanciation d&rsquo;un data frame via le param\u00e8tre <code>stringsAsFactors = TRUE<\/code>. Bien que cette convention par d\u00e9faut appartienne d\u00e9sormais au pass\u00e9, de multiples biblioth\u00e8ques et flux de travail importent encore les variables nominales sous la classe <code>factor<\/code>.<\/p>\n<p>Un facteur stocke ses donn\u00e9es sous la forme d&rsquo;un vecteur d&rsquo;entiers sous-jacents pointant vers un tableau d&rsquo;\u00e9tiquettes textuelles distinctes nomm\u00e9 <code>levels<\/code>. Lorsqu&rsquo;une comparaison par <code>==<\/code> est effectu\u00e9e entre un facteur et une cha\u00eene litt\u00e9rale, R v\u00e9rifie d&rsquo;abord si la cha\u00eene fait partie int\u00e9grante des modalit\u00e9s autoris\u00e9es. Si l&rsquo;on requiert une modalit\u00e9 inexistante par inadvertance typographique (par exemple <code>which(donnees$groupe == \"Traittement\")<\/code>), le syst\u00e8me g\u00e9n\u00e8re un vecteur logique uniform\u00e9ment faux, assorti dans certains cas d&rsquo;un avertissement circonstanci\u00e9 si la comparaison implique des facteurs de niveaux incompatibles.<\/p>\n<p>Pour immuniser les scripts d&rsquo;extraction contre les incoh\u00e9rences de modalit\u00e9, il est souvent pr\u00e9f\u00e9rable de coercer explicitement la variable cible au format caract\u00e8re au sein du pr\u00e9dicat logique, ou de valider pr\u00e9alablement la pr\u00e9sence de la cha\u00eene au sein de la table de niveaux :<\/p>\n<p><code>which(as.character(donnees_cliniques$groupe) == \"Traitement\")<\/code><\/p>\n<p>Cette pr\u00e9caution d\u00e9samorce tout conflit li\u00e9 aux attributs internes du facteur, garantissant que la r\u00e9solution positionnelle op\u00e8re strictement sur le contenu textuel manifeste de la colonne.<\/p>\n<h2>4. Recherche d&rsquo;appartenance collective \u00e0 l&rsquo;aide de l&rsquo;op\u00e9rateur %in%<\/h2>\n<h3>4.1 Fonctionnement ensembliste de l&rsquo;op\u00e9rateur d&rsquo;inclusion<\/h3>\n<p>Lorsque le crit\u00e8re de s\u00e9lection positionnelle ne repose plus sur une modalit\u00e9 unique mais sur un ensemble discret de conditions acceptables, l&rsquo;usage de l&rsquo;op\u00e9rateur d&rsquo;\u00e9galit\u00e9 stricte devient inop\u00e9rant ou excessivement lourd. L&rsquo;op\u00e9rateur binaire interne <code>%in%<\/code> fournit une interface \u00e9l\u00e9gante, hautement optimis\u00e9e et conceptuellement fond\u00e9e sur la th\u00e9orie des ensembles finis. D&rsquo;un point de vue math\u00e9matique, l&rsquo;expression <code>x %in% table<\/code> \u00e9value la proposition d&rsquo;appartenance <span class=\"arabpsy-math-inline\" data-latex=\"x_i in S\">$x_i in S$<\/span>, o\u00f9 <span class=\"arabpsy-math-inline\" data-latex=\"S\">$S$<\/span> repr\u00e9sente le sous-ensemble des modalit\u00e9s cibles.<\/p>\n<p>D&rsquo;un point de vue syntaxique, substituer une cha\u00eene de disjonctions logiques successives (par exemple <code>x == a | x == b | x == c<\/code>) par une expression ensembliste vectoris\u00e9e <code>x %in% c(a, b, c)<\/code> r\u00e9duit drastiquement le risque d&rsquo;erreurs de frappe et simplifie consid\u00e9rablement la maintenance du code source. L&rsquo;op\u00e9rateur <code>%in%<\/code> encapsule en r\u00e9alit\u00e9 un appel \u00e0 la fonction primitive <code>match()<\/code>, qui impl\u00e9mente une table de hachage interne en langage C pour acc\u00e9l\u00e9rer les correspondances entre vecteurs.<\/p>\n<p>Cette vectorisation native conf\u00e8re \u00e0 l&rsquo;op\u00e9rateur des gains de performance notables par rapport \u00e0 une suite disjonctive d&rsquo;\u00e9galit\u00e9s relationnelles, tout en pr\u00e9servant une lisibilit\u00e9 maximale pour l&rsquo;analyste et les relecteurs du code scientifique.<\/p>\n<h3>4.2 Exemple pratique : identification de sous-groupes exp\u00e9rimentaux multiples<\/h3>\n<p>Consid\u00e9rons une cohorte \u00e9pid\u00e9miologique multicentrique comprenant des patients recrut\u00e9s \u00e0 travers divers h\u00f4pitaux universitaires nationaux. Chaque ligne repr\u00e9sente un sujet inclus, et la variable <code>centre<\/code> d\u00e9signe l&rsquo;\u00e9tablissement d&rsquo;investigation clinique d&rsquo;origine. L&rsquo;investigateur principal souhaite extraire les num\u00e9ros de ligne des patients suivis sp\u00e9cifiquement dans les centres universitaires de Paris, Lyon et Bordeaux pour un audit interm\u00e9diaire :<\/p>\n<p><code>cohorte_nationale &lt;- data.frame(<br \/>\n&nbsp;&nbsp;patient_id = paste0(\"PAT_\", 1001:1008),<br \/>\n&nbsp;&nbsp;centre = c(\"Paris\", \"Marseille\", \"Lyon\", \"Brest\", \"Bordeaux\", \"Paris\", \"Lille\", \"Bordeaux\"),<br \/>\n&nbsp;&nbsp;age = c(54, 62, 41, 73, 58, 65, 49, 38)<br \/>\n)<\/code><\/p>\n<p>La r\u00e9cup\u00e9ration des indices positionnels s&rsquo;effectue en associant harmonieusement <code>which()<\/code> et l&rsquo;op\u00e9rateur d&rsquo;appartenance :<\/p>\n<p><code>centres_prioritaires &lt;- c(\"Paris\", \"Lyon\", \"Bordeaux\")<br \/>\nindices_cibles &lt;- which(cohorte_nationale$centre %in% centres_prioritaires)<\/code><\/p>\n<p>L&rsquo;\u00e9valuation de cette expression g\u00e9n\u00e8re le vecteur num\u00e9rique <code>c(1, 3, 5, 6, 8)<\/code>. Le chercheur dispose d\u00e8s lors de la liste exhaustive et ordonn\u00e9e des rangs de la table correspondant aux unit\u00e9s observationnelles d&rsquo;int\u00e9r\u00eat. Pour valider formellement la compl\u00e9tude de cette extraction, il suffit de v\u00e9rifier que la longueur du vecteur obtenu correspond exactement \u00e0 la somme des effectifs marginaux des trois centres vis\u00e9s, s&rsquo;assurant ainsi qu&rsquo;aucun individu n&rsquo;a \u00e9t\u00e9 ind\u00fbment omis ou dupliqu\u00e9 lors du traitement.<\/p>\n<h3>4.3 Sensibilit\u00e9 \u00e0 la casse et gestion des \u00e9l\u00e9ments non r\u00e9pertori\u00e9s<\/h3>\n<p>L&rsquo;op\u00e9rateur <code>%in%<\/code> traite les cha\u00eenes textuelles avec une sensibilit\u00e9 typographique stricte \u00e0 la casse (distinction imp\u00e9rative entre majuscules et minuscules), conform\u00e9ment aux sp\u00e9cifications des syst\u00e8mes POSIX sous-jacents. Si la table de donn\u00e9es d&rsquo;origine contient des saisies h\u00e9t\u00e9rog\u00e8nes r\u00e9sultant d&rsquo;erreurs humaines \u2014 par exemple <code>\"paris\"<\/code> ou <code>\"PARIS\"<\/code> au lieu du formalisme standard <code>\"Paris\"<\/code> \u2014, l&rsquo;op\u00e9rateur renverra silencieusement <code>FALSE<\/code> pour ces \u00e9l\u00e9ments non r\u00e9pertori\u00e9s dans le vecteur de r\u00e9f\u00e9rence. Les lignes concern\u00e9es seront d\u00e8s lors exclues du vecteur d&rsquo;indices sans lever le moindre message d&rsquo;erreur ou d&rsquo;avertissement.<\/p>\n<p>Pour parer \u00e0 cette d\u00e9rive et garantir une d\u00e9tection exhaustive des num\u00e9ros de ligne, une harmonisation pr\u00e9alable des vecteurs de donn\u00e9es et de comparaison s&rsquo;impose. Le recours syst\u00e9matique aux fonctions primitives <code>tolower()<\/code> ou <code>toupper()<\/code> neutralise totalement la variabilit\u00e9 de casse :<\/p>\n<p><code>which(tolower(cohorte_nationale$centre) %in% tolower(centres_prioritaires))<\/code><\/p>\n<p>Par ailleurs, si le vecteur de r\u00e9f\u00e9rence soumis \u00e0 droite de l&rsquo;op\u00e9rateur <code>%in%<\/code> contient accidentellement des modalit\u00e9s qui ne figurent nulle part dans la table de donn\u00e9es (par exemple un centre d&rsquo;investigation ayant annul\u00e9 sa participation), R n&rsquo;interrompt pas son calcul : il ignore simplement ces \u00e9l\u00e9ments orphelins et extrait uniquement les rangs des modalit\u00e9s effectivement rencontr\u00e9es. Cette tol\u00e9rance ensembliste \u00e9vite les ruptures de pipeline tout en exigeant de l&rsquo;analyste un contr\u00f4le vigilant des dimensions de sortie.<\/p>\n<h2>5. Traitement rigoureux des donn\u00e9es manquantes et valeurs NA<\/h2>\n<h3>5.1 Comportement singulier de which() face aux valeurs ind\u00e9termin\u00e9es<\/h3>\n<p>Dans l&rsquo;architecture de donn\u00e9es de R, la valeur sp\u00e9ciale <code>NA<\/code> (Not Available) n&rsquo;est pas assimil\u00e9e \u00e0 une cha\u00eene de caract\u00e8res ou \u00e0 la valeur num\u00e9rique z\u00e9ro, mais repr\u00e9sente une valeur ontologiquement ind\u00e9termin\u00e9e, mat\u00e9rialisant l&rsquo;absence de mesure ou de renseignement. En vertu des principes de la logique ternaire de Kleene, toute comparaison logique impliquant une valeur ind\u00e9termin\u00e9e produit structurellement une r\u00e9ponse ind\u00e9termin\u00e9e : l&rsquo;\u00e9valuation de <code>NA == 5<\/code> ou de <code>NA &gt; 10<\/code> renvoie in\u00e9luctablement <code>NA<\/code>.<\/p>\n<p>Cette r\u00e8gle logique engendre un \u00e9cueil redoutable lors de l&rsquo;indexation directe d&rsquo;un data frame via la notation \u00e0 crochets. Lorsqu&rsquo;un vecteur bool\u00e9en contenant des valeurs <code>NA<\/code> est directement ins\u00e9r\u00e9 comme s\u00e9lecteur de ligne :<\/p>\n<p><code>df[df$variable == 10, ]<\/code><\/p>\n<p>Le moteur de R ins\u00e8re physiquement dans la table finale des lignes enti\u00e8rement compos\u00e9es de valeurs manquantes (souvent appel\u00e9es lignes fant\u00f4mes) pour chaque position \u00e9valu\u00e9e \u00e0 <code>NA<\/code>. Ce comportement brise l&rsquo;int\u00e9grit\u00e9 de la table, perturbe le calcul des statistiques descriptives subs\u00e9quentes et constitue une source d&rsquo;erreurs r\u00e9currente.<\/p>\n<p>C&rsquo;est pr\u00e9cis\u00e9ment ici que r\u00e9side l&rsquo;un des avantages techniques les plus puissants de la fonction <code>which()<\/code> : <em>elle traite syst\u00e9matiquement les valeurs NA comme des conditions fausses<\/em>. En interne, l&rsquo;algorithme C de <code>which()<\/code> ne conserve que les positions dont le pr\u00e9dicat est strictement et indubitablement <code>TRUE<\/code>. En cons\u00e9quence, l&rsquo;usage de :<\/p>\n<p><code>df[which(df$variable == 10), ]<\/code><\/p>\n<p>Immunise totalement le chercheur contre l&rsquo;apparition de lignes fant\u00f4mes. La fonction ne renvoie que les num\u00e9ros de ligne o\u00f9 l&rsquo;observation est certifi\u00e9e \u00e9gale \u00e0 la constante, rel\u00e9guant les incertitudes statistiques au n\u00e9ant sans contaminer la matrice finale.<\/p>\n<h3>5.2 Localisation cibl\u00e9e des indices de donn\u00e9es manquantes<\/h3>\n<p>Loin de constituer une simple nuisance calculatoire, les donn\u00e9es manquantes repr\u00e9sentent en elles-m\u00eames un objet d&rsquo;\u00e9tude \u00e9pid\u00e9miologique et m\u00e9thodologique critique. Tracer le patron d&rsquo;attrition (Missing Completely at Random, Missing at Random, ou Missing Not at Random) exige de cartographier avec exactitude les rangs des sujets pr\u00e9sentant des d\u00e9faillances de recueil d&rsquo;information.<\/p>\n<p>Pour extraire les num\u00e9ros de ligne affect\u00e9s par une valeur manquante sur une variable biom\u00e9dicale sensible, il est proscrit d&#8217;employer la condition <code>variable == NA<\/code>, qui renverrait un vecteur compos\u00e9 exclusivement de <code>NA<\/code>. On mobilise imp\u00e9rativement la fonction de test unaire <code>is.na()<\/code> imbriqu\u00e9e dans l&rsquo;op\u00e9rateur positionnel :<\/p>\n<p><code>lignes_donnees_perdues &lt;- which(is.na(donnees_cliniques$score))<\/code><\/p>\n<p>Cette instruction renvoie sans ambigu\u00eft\u00e9 les indices des participants pour lesquels la mesure finale fait d\u00e9faut. \u00c0 partir de cette collection d&rsquo;indices, le biostatisticien peut ordonner des protocoles d&rsquo;imputation multiple, auditer les investigateurs cliniques responsables des centres concern\u00e9s ou comparer la distribution des covariables des rangs conserv\u00e9s par rapport aux rangs d\u00e9faillants afin de caract\u00e9riser les biais d&rsquo;attrition.<\/p>\n<h3>5.3 Identification des indices de valeurs compl\u00e8tes<\/h3>\n<p>Dans de nombreuses d\u00e9marches de mod\u00e9lisation param\u00e9trique multivari\u00e9e (telles que les r\u00e9gressions logistiques ou les mod\u00e8les \u00e0 \u00e9quations structurelles), l&rsquo;algorithme d&rsquo;estimation exige un tableau exempt de la moindre case vide, selon le paradigme de l&rsquo;analyse par cas complets (complete-case analysis). Localiser pr\u00e9cis\u00e9ment les rangs d&rsquo;observations int\u00e8gres sur l&rsquo;ensemble du profil multidimensionnel s&rsquo;av\u00e8re alors crucial.<\/p>\n<p>La fonction <code>complete.cases()<\/code> r\u00e9pond \u00e0 cet imp\u00e9ratif en \u00e9valuant simultan\u00e9ment chaque ligne d&rsquo;une matrice ou d&rsquo;un data frame pour retourner un vecteur logique indiquant si l&rsquo;observation est totalement indemne de donn\u00e9es manquantes \u00e0 travers l&rsquo;ensemble de ses colonnes. En encapsulant cette fonction dans <code>which()<\/code>, on obtient les coordonn\u00e9es positionnelles de ces observations sans faille :<\/p>\n<p><code>lignes_cas_complets &lt;- which(complete.cases(donnees_cliniques))<\/code><\/p>\n<p>Ce vecteur d&rsquo;indices permet de quantifier rigoureusement la perte d&rsquo;unit\u00e9s statistiques en amont de la mod\u00e9lisation. La comparaison entre la taille totale de l&rsquo;\u00e9chantillon initial et la longueur du vecteur <code>lignes_cas_complets<\/code> fournit instantan\u00e9ment la mesure de l&rsquo;attrition globale subie par le protocole de recherche, guidant le calcul de la puissance statistique restante pour le test des hypoth\u00e8ses principales.<\/p>\n<h2>6. Combinaison de pr\u00e9dicats logiques multiples et filtrage compos\u00e9<\/h2>\n<h3>6.1 Conjonction logique : l&rsquo;op\u00e9rateur ET (&amp;)<\/h3>\n<p>L&rsquo;investigation empirique requiert quasi syst\u00e9matiquement la s\u00e9lection d&rsquo;observations satisfaisant simultan\u00e9ment plusieurs contraintes ind\u00e9pendantes ou orthogonales. Au sein du langage R, l&rsquo;\u00e9valuation conjointe de plusieurs vecteurs logiques repose sur l&rsquo;op\u00e9rateur unaire \u00e9l\u00e9ment par \u00e9l\u00e9ment <code>&amp;<\/code>, qu&rsquo;il convient de distinguer rigoureusement de l&rsquo;op\u00e9rateur court-circuit scalaire <code>&amp;&amp;<\/code> (exclusivement r\u00e9serv\u00e9 aux structures de contr\u00f4le conditionnel telles que les clauses <code>if<\/code> op\u00e9rant sur des scalaires de longueur 1).<\/p>\n<p>Imaginons une cohorte o\u00f9 l&rsquo;on souhaite isoler les num\u00e9ros de ligne correspondant sp\u00e9cifiquement \u00e0 des patientes de sexe f\u00e9minin \u00e2g\u00e9es de plus de cinquante ans et pr\u00e9sentant un biomarqueur glyc\u00e9mique sup\u00e9rieur \u00e0 une borne clinique d&rsquo;alerte :<\/p>\n<p><code>indices_profil_risque &lt;- which(<br \/>\n&nbsp;&nbsp;(registre$sexe == \"F\") &amp;<br \/>\n&nbsp;&nbsp;(registre$age &gt; 50) &amp;<br \/>\n&nbsp;&nbsp;(registre$glycemie &gt;= 7.0)<br \/>\n)<\/code><\/p>\n<p>La ma\u00eetrise de la pr\u00e9c\u00e9dence des op\u00e9rateurs est capitale dans l&rsquo;\u00e9criture de requ\u00eates compos\u00e9es. En R, les op\u00e9rateurs relationnels (<code>==<\/code>, <code>&gt;<\/code>, etc.) poss\u00e8dent une priorit\u00e9 syntaxique sup\u00e9rieure aux op\u00e9rateurs logiques, mais l&rsquo;usage syst\u00e9matique de parenth\u00e8ses explicites autour de chaque pr\u00e9dicat atomique constitue une r\u00e8gle d&rsquo;or pour pr\u00e9venir toute ambigu\u00eft\u00e9 d&rsquo;\u00e9valuation et faciliter la relecture collaborative du script. La fonction <code>which()<\/code> traite la conjonction finale r\u00e9sultante et retourne un vecteur univari\u00e9 contenant uniquement les indices o\u00f9 l&rsquo;ensemble des trois pr\u00e9dicats a \u00e9t\u00e9 simultan\u00e9ment valid\u00e9.<\/p>\n<h3>6.2 Disjonction logique : l&rsquo;op\u00e9rateur OU (|)<\/h3>\n<p>\u00c0 l&rsquo;oppos\u00e9 de l&rsquo;intersection stricte, la disjonction logique permet de collecter les coordonn\u00e9es de toutes les unit\u00e9s d&rsquo;enregistrement validant au moins une condition parmi un ensemble de crit\u00e8res pr\u00e9\u00e9tablis. L&rsquo;op\u00e9ration vectorielle s&rsquo;effectue via l&rsquo;op\u00e9rateur barre verticale <code>|<\/code>, qui ne doit l\u00e0 encore pas \u00eatre confondu avec l&rsquo;op\u00e9rateur court-circuit <code>||<\/code>.<\/p>\n<p>L&rsquo;analyse des tables de v\u00e9rit\u00e9 sous-jacentes rappelle que l&rsquo;expression <span class=\"arabpsy-math-inline\" data-latex=\"A lor B\">$A lor B$<\/span> renvoie <code>TRUE<\/code> si <span class=\"arabpsy-math-inline\" data-latex=\"A\">$A$<\/span> est vrai, si <span class=\"arabpsy-math-inline\" data-latex=\"B\">$B$<\/span> est vrai, ou si les deux composantes sont simultan\u00e9ment vraies. Par exemple, si l&rsquo;on recherche les lignes d&rsquo;un registre d&rsquo;urgences hospitali\u00e8res correspondant soit \u00e0 une tension art\u00e9rielle systolique critique (sup\u00e9rieure \u00e0 180 mmHg), soit \u00e0 une saturation en oxyg\u00e8ne inf\u00e9rieure \u00e0 90 % :<\/p>\n<p><code>indices_urgence_vitale &lt;- which(<br \/>\n&nbsp;&nbsp;(dossiers$pression_systolique &gt; 180) |<br \/>\n&nbsp;&nbsp;(dossiers$saturation_o2 &lt; 90)<br \/>\n)<\/code><\/p>\n<p>Sur le plan computationnel, l&rsquo;usage de disjonctions multiples sur une m\u00eame variable cat\u00e9gorielle (par exemple <code>statut == \"A\" | statut == \"B\" | statut == \"C\"<\/code>) est nettement moins efficace et plus verbeux que l&#8217;emploi de l&rsquo;op\u00e9rateur d&rsquo;inclusion <code>statut %in% c(\"A\", \"B\", \"C\")<\/code> examin\u00e9 pr\u00e9c\u00e9demment. La disjonction logique pure trouve en r\u00e9alit\u00e9 sa pleine justification m\u00e9thodologique lorsqu&rsquo;elle combine des pr\u00e9dicats portant sur des variables h\u00e9t\u00e9rog\u00e8nes de nature distincte (m\u00e9langeant grandeurs physiologiques, dates et scores psychom\u00e9triques).<\/p>\n<h3>6.3 N\u00e9gation logique et exclusions cibl\u00e9es : l&rsquo;op\u00e9rateur NON (!)<\/h3>\n<p>La d\u00e9limitation d&rsquo;un \u00e9chantillon d&rsquo;analyse exige fr\u00e9quemment l&rsquo;\u00e9viction d\u00e9lib\u00e9r\u00e9e d&rsquo;une sous-population marginale ou d\u00e9viante afin de pr\u00e9server la validit\u00e9 interne des estimations \u00e9conom\u00e9triques ou biostatistiques. L&rsquo;op\u00e9rateur de n\u00e9gation unaire <code>!<\/code> assure l&rsquo;inversion bool\u00e9enne des valeurs de v\u00e9rit\u00e9 : chaque <code>TRUE<\/code> est mut\u00e9 en <code>FALSE<\/code>, et inversement.<\/p>\n<p>Combin\u00e9 \u00e0 la fonction <code>which()<\/code>, l&rsquo;op\u00e9rateur de n\u00e9gation permet d&rsquo;extraire directement les num\u00e9ros de ligne des observations qui <em>\u00e9chappent<\/em> \u00e0 une condition d&rsquo;exclusion d\u00e9finie. Supposons un protocole d&rsquo;o\u00f9 l&rsquo;on doit \u00e9carter les sujets inclus dans une phase pilote pr\u00e9alable :<\/p>\n<p><code>indices_cohorte_principale &lt;- which(!donnees$phase_pilote)<\/code><\/p>\n<p>Une formulation particuli\u00e8rement puissante consiste \u00e0 conjuguer la n\u00e9gation logique avec l&rsquo;op\u00e9rateur d&rsquo;appartenance collective pour exclure une liste de centres d&rsquo;investigation ou de codes postaux jug\u00e9s non conformes lors d&rsquo;un audit de terrain :<\/p>\n<p><code>centres_exclus &lt;- c(\"Centre_04\", \"Centre_12\", \"Centre_99\")<br \/>\nindices_valides &lt;- which(!donnees$identifiant_centre %in% centres_exclus)<\/code><\/p>\n<p>Une bonne pratique de v\u00e9rification consiste \u00e0 s&rsquo;assurer de la partition parfaite de l&rsquo;ensemble d&rsquo;origine. Si <span class=\"arabpsy-math-inline\" data-latex=\"N\">$N$<\/span> repr\u00e9sente le nombre total d&rsquo;observations, la somme arithm\u00e9tique de la longueur du vecteur des indices exclus et de celle du vecteur des indices conserv\u00e9s doit rigoureusement \u00e9galer <span class=\"arabpsy-math-inline\" data-latex=\"N\">$N$<\/span> (en l&rsquo;absence de valeurs ind\u00e9termin\u00e9es dans le crit\u00e8re), attestant qu&rsquo;aucune ligne n&rsquo;a disparu silencieusement durant la phase d&rsquo;aiguillage.<\/p>\n<h2>7. Identification de rangs par seuils num\u00e9riques et conditions relationnelles<\/h2>\n<h3>7.1 Utilisation des in\u00e9galit\u00e9s strictes et larges (&lt;, &lt;=, &gt;, &gt;=)<\/h3>\n<p>Le bornage num\u00e9rique constitue une op\u00e9ration quantitative fondamentale dans le traitement des s\u00e9ries statistiques issues de capteurs physiques, d&rsquo;\u00e9preuves de laboratoire ou de bilans financiers. Les op\u00e9rateurs de comparaison d&rsquo;ordre <code>&lt;<\/code>, <code>&lt;=<\/code>, <code>&gt;<\/code> et <code>&gt;=<\/code> appliquent une relation de tri binaire entre chaque \u00e9l\u00e9ment d&rsquo;un vecteur num\u00e9rique et une valeur critique th\u00e9orique ou empirique.<\/p>\n<p>Consid\u00e9rons l&rsquo;analyse d&rsquo;une cohorte cardiologique o\u00f9 l&rsquo;on souhaite identifier les coordonn\u00e9es de ligne correspondant aux patients dont la clairance r\u00e9nale calcul\u00e9e est strictement inf\u00e9rieure \u00e0 un seuil d&rsquo;insuffisance fix\u00e9 \u00e0 60 mL\/min :<\/p>\n<p><code>lignes_insuffisance &lt;- which(patients$clairance &lt; 60.0)<\/code><\/p>\n<p>Le choix s\u00e9mantique entre une in\u00e9galit\u00e9 stricte (<code>&lt;<\/code> ou <code>&gt;<\/code>) et une in\u00e9galit\u00e9 large (<code>&lt;=<\/code> ou <code>&gt;=<\/code>) rev\u00eat une port\u00e9e m\u00e9thodologique d\u00e9terminante. L&rsquo;inclusion ou l&rsquo;exclusion de la valeur fronti\u00e8re exacte sur une variable discr\u00e8te (par exemple un compte d&rsquo;\u00e9v\u00e9nements ind\u00e9sirables ou un score sommatoire) peut modifier substantiellement la composition des rangs extraits et d\u00e9placer le seuil de significativit\u00e9 des tests d&rsquo;hypoth\u00e8ses men\u00e9s en aval. Le chercheur doit documenter pr\u00e9cis\u00e9ment si les intervalles de s\u00e9lection retenus sont ouverts, ferm\u00e9s ou semi-ouverts.<\/p>\n<h3>7.2 Combinaison d&rsquo;intervalles statistiques et calculs de percentiles<\/h3>\n<p>Dans de nombreuses applications d&rsquo;exploration de donn\u00e9es, les seuils critiques d&rsquo;indexation ne sont pas connus a priori sous forme de constantes absolues, mais doivent \u00eatre calcul\u00e9s de mani\u00e8re endog\u00e8ne \u00e0 partir de la distribution empirique de l&rsquo;\u00e9chantillon lui-m\u00eame. L&rsquo;association de la fonction statistique <code>quantile()<\/code> et de la fonction positionnelle <code>which()<\/code> r\u00e9pond parfaitement \u00e0 cette exigence.<\/p>\n<p>Imaginons un dispositif de d\u00e9tection des scores d&rsquo;anxi\u00e9t\u00e9 extr\u00eames, o\u00f9 l&rsquo;on souhaite isoler les lignes correspondant aux individus se situant dans les d\u00e9ciles sup\u00e9rieur (90e percentile) et inf\u00e9rieur (10e percentile) d&rsquo;une population de r\u00e9f\u00e9rence :<\/p>\n<p><code>bornes &lt;- quantile(donnees$score_anxiete, probs = c(0.10, 0.90), na.rm = TRUE)<br \/>\nindices_extremes &lt;- which(<br \/>\n&nbsp;&nbsp;donnees$score_anxiete &lt;= bornes[1] |<br \/>\n&nbsp;&nbsp;donnees$score_anxiete &gt;= bornes[2]<br \/>\n)<\/code><\/p>\n<p>Cette m\u00e9thodologie d&rsquo;extraction s&rsquo;\u00e9tend naturellement \u00e0 l&rsquo;identification multivari\u00e9e de valeurs aberrantes (outliers) selon le crit\u00e8re classique de John Tukey adoss\u00e9 \u00e0 l&rsquo;\u00e9cart interquartile (IQR). En calculant <code>iqr &lt;- IQR(x, na.rm = TRUE)<\/code>, on peut extraire en une unique ligne de code les rangs de toutes les observations franchissant les barri\u00e8res de Tukey (<span class=\"arabpsy-math-inline\" data-latex=\"Q_1 - 1.5 \\times IQR\">$Q_1 &#8211; 1.5 \\times IQR$<\/span> ou <span class=\"arabpsy-math-inline\" data-latex=\"Q_3 + 1.5 \\times IQR\">$Q_3 + 1.5 \\times IQR$<\/span>). L&rsquo;identification de ces num\u00e9ros de ligne permet une inspection cibl\u00e9e de la feuille de relev\u00e9 avant toute prise de d\u00e9cision concernant une \u00e9ventuelle neutralisation des donn\u00e9es d\u00e9viantes.<\/p>\n<h3>7.3 Identification des valeurs maximales et minimales avec which.max() et which.min()<\/h3>\n<p>Pour le cas sp\u00e9cifique de la recherche du point d&rsquo;inflexion extr\u00eame d&rsquo;une s\u00e9rie num\u00e9rique, R int\u00e8gre deux fonctions primitives hautement optimis\u00e9es : <code>which.max()<\/code> et <code>which.min()<\/code>. Contrairement \u00e0 la combinaison syntaxique g\u00e9n\u00e9rique <code>which(x == max(x))<\/code>, ces fonctions d\u00e9di\u00e9es sont \u00e9crites directement au niveau de la couche syst\u00e8me en langage C, offrant une v\u00e9locit\u00e9 calculatoire incomparable sur des vecteurs massifs.<\/p>\n<p>Une particularit\u00e9 algorithmique capitale de <code>which.max()<\/code> et <code>which.min()<\/code> m\u00e9rite d&rsquo;\u00eatre explicit\u00e9e : <em>en pr\u00e9sence d&rsquo;ex \u00e6quo (ties), elles ne renvoient syst\u00e9matiquement que le premier indice ordinal rencontr\u00e9<\/em>. Si un jeu de donn\u00e9es comprend trois observations partageant exactement la valeur maximale, l&rsquo;instruction suivante ne d\u00e9voilera que la coordonn\u00e9e de la premi\u00e8re occurrence :<\/p>\n<p><code>premier_max_index &lt;- which.max(donnees$chiffre_affaires)<\/code><\/p>\n<p>Si la probl\u00e9matique scientifique ou analytique requiert l&rsquo;identification exhaustive de <em>toutes<\/em> les lignes r\u00e9alisant l&rsquo;optimum math\u00e9matique (par exemple pour rep\u00e9rer tous les candidats ayant obtenu la note parfaite \u00e0 un concours), l&rsquo;analyste ne doit pas recourir \u00e0 <code>which.max()<\/code>, mais formuler explicitement une requ\u00eate d&rsquo;\u00e9galit\u00e9 globale :<\/p>\n<p><code>tous_les_max &lt;- which(donnees<span class=\"arabpsy-math-inline\" data-latex=\"chiffre_affaires == \\max(donnees\">$chiffre_affaires == \\max(donnees$<\/span>chiffre_affaires, na.rm = TRUE))<\/code><\/p>\n<p>Cette distinction s\u00e9mantique fondamentale pr\u00e9vient les biais de s\u00e9lection arbitraires dans les \u00e9tudes comparatives o\u00f9 la multiplicit\u00e9 des extrema locaux v\u00e9hicule un sens exp\u00e9rimental d\u00e9cisif.<\/p>\n<h2>8. Localisation d&rsquo;indices matriciels bidimensionnels avec l&rsquo;argument arr.ind<\/h2>\n<h3>8.1 Principe de fonctionnement du param\u00e8tre arr.ind = TRUE<\/h3>\n<p>Dans le traitement de grilles multidimensionnelles, de panels de capteurs ou de matrices de corr\u00e9lation, l&rsquo;identification d&rsquo;une anomalie ou d&rsquo;un seuil critique sous forme d&rsquo;un simple entier vectoris\u00e9 (scalaire unidimensionnel) s&rsquo;av\u00e8re peu exploitable. Par d\u00e9faut, R aplatit conceptuellement toute matrice en un long vecteur pour les op\u00e9rations d&rsquo;indexation lin\u00e9aire. C&rsquo;est ici qu&rsquo;intervient le param\u00e8tre optionnel <code>arr.ind = TRUE<\/code> de la fonction <code>which()<\/code>.<\/p>\n<p>Consid\u00e9rons une matrice quantitative simulant l&rsquo;enregistrement de biomarqueurs m\u00e9taboliques mesur\u00e9s chez cinq patients \u00e0 travers quatre temps d&rsquo;observation s\u00e9quentiels :<\/p>\n<p><code>matrice_mesures &lt;- matrix(<br \/>\n&nbsp;&nbsp;c(12, 15, 99, 14, 18,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;11, 14, 16, 85, 19,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;10, 13, 15, 17, 95,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;14, 12, 11, 15, 16),<br \/>\n&nbsp;&nbsp;nrow = 5, ncol = 4,<br \/>\n&nbsp;&nbsp;dimnames = list(paste0(\"Pat_\", 1:5), paste0(\"Tps_\", 1:4))<br \/>\n)<\/code><\/p>\n<p>Si l&rsquo;on souhaite d\u00e9tecter toutes les occurrences de valeurs pathologiques aberrantes sup\u00e9rieures ou \u00e9gales \u00e0 80, l&rsquo;invocation conventionnelle renvoie une matrice explicite de coordonn\u00e9es :<\/p>\n<p><code>coordonnees &lt;- which(matrice_mesures &gt;= 80, arr.ind = TRUE)<\/code><\/p>\n<p>L&rsquo;objet r\u00e9sultant est une matrice d&rsquo;entiers \u00e0 deux dimensions munie de colonnes intitul\u00e9es <code>row<\/code> et <code>col<\/code>, accompagn\u00e9e des attributs nominaux de rang\u00e9e si ceux-ci \u00e9taient d\u00e9clar\u00e9s. Chaque ligne de cette matrice de sortie cartographie l&rsquo;intersection cart\u00e9sienne exacte (num\u00e9ro de ligne du patient et num\u00e9ro de colonne du temps de mesure) o\u00f9 le franchissement de seuil a \u00e9t\u00e9 formellement constat\u00e9.<\/p>\n<h3>8.2 Extraction s\u00e9lective de la premi\u00e8re coordonn\u00e9e matricielle<\/h3>\n<p>Dans la plupart des protocoles d&rsquo;assurance qualit\u00e9 des donn\u00e9es, l&rsquo;objectif m\u00e9thodologique ne consiste pas seulement \u00e0 cartographier les cellules d&rsquo;un point de vue spatial, mais \u00e0 identifier la liste univoque des sujets (lignes) ayant pr\u00e9sent\u00e9 <em>au moins une<\/em> d\u00e9faillance de mesure au cours de l&rsquo;exp\u00e9rimentation, peu importe la variable ou le temps de recueil incrimin\u00e9.<\/p>\n<p>\u00c0 partir de la matrice d&rsquo;indices g\u00e9n\u00e9r\u00e9e par <code>which(..., arr.ind = TRUE)<\/code>, il est possible d&rsquo;isoler imm\u00e9diatement le vecteur univari\u00e9 des lignes en indexant la colonne nominative correspondante, puis en appliquant une op\u00e9ration de r\u00e9duction d&rsquo;unicit\u00e9 via la fonction native <code>unique()<\/code> :<\/p>\n<p><code>lignes_affectees &lt;- unique(coordonnees[, \"row\"])<\/code><\/p>\n<p>Cette approche \u00e9l\u00e9gante r\u00e9sout en deux instructions concises un probl\u00e8me algorithmique complexe d&rsquo;agr\u00e9gation conditionnelle. Le vecteur obtenu liste les identifiants de rang des individus compromis, sans duplication inutile d&rsquo;indices, m\u00eame si un sujet donn\u00e9 a produit des valeurs anormales sur plusieurs colonnes successives du dispositif de mesure.<\/p>\n<h3>8.3 Limites et pr\u00e9cautions lors de l&rsquo;usage sur des data frames h\u00e9t\u00e9rog\u00e8nes<\/h3>\n<p>Si la rigueur de <code>arr.ind = TRUE<\/code> brille sur des structures matricielles homog\u00e8nes de type num\u00e9rique, son d\u00e9ploiement sur un objet h\u00e9t\u00e9rog\u00e8ne de classe <code>data.frame<\/code> requiert une vigilance technique absolue. Lorsqu&rsquo;un data frame complet est transmis \u00e0 une expression relationnelle globale (par exemple <code>which(df &gt; 100, arr.ind = TRUE)<\/code>), le moteur d&rsquo;ex\u00e9cution de R tente d&rsquo;abord de coercer implicitement la liste de vecteurs en une matrice unique.<\/p>\n<p>Si le data frame comporte des colonnes textuelles (cha\u00eenes de caract\u00e8res ou identifiants de cohorte), cette coercition mutera l&rsquo;int\u00e9gralit\u00e9 du tableau en une matrice de type caract\u00e8re, en vertu des r\u00e8gles de priorit\u00e9 de type de R. D\u00e8s lors, une condition num\u00e9rique telle que <code>&gt; 100<\/code> se transformera en une comparaison d&rsquo;ordre lexicographique textuelle, induisant des comportements aberrants (la cha\u00eene <code>\"9\"<\/code> \u00e9tant par exemple lexicographiquement sup\u00e9rieure \u00e0 la cha\u00eene <code>\"100\"<\/code>).<\/p>\n<p>La r\u00e8gle m\u00e9thodologique absolue impose donc de restreindre l&rsquo;\u00e9valuation aux seules colonnes strictement num\u00e9riques du tableau. Cette s\u00e9lection pr\u00e9alable s\u00e9curis\u00e9e s&rsquo;orchestre facilement via un sous-ensemble appropri\u00e9 :<\/p>\n<p><code>colonnes_numeriques &lt;- sapply(donnees, is.numeric)<br \/>\nmatrice_indices &lt;- which(<br \/>\n&nbsp;&nbsp;as.matrix(donnees[, colonnes_numeriques]) &gt; 100,<br \/>\n&nbsp;&nbsp;arr.ind = TRUE<br \/>\n)<\/code><\/p>\n<p>Cette pr\u00e9caution isole les colonnes d&rsquo;int\u00e9r\u00eat sans alt\u00e9rer les structures adjacentes, garantissant une localisation spatiale sans faille au sein de l&rsquo;espace de calcul.<\/p>\n<h2>9. Approches modernes au sein de l&rsquo;\u00e9cosyst\u00e8me Tidyverse<\/h2>\n<h3>9.1 G\u00e9n\u00e9ration de num\u00e9ros de ligne explicites avec dplyr::row_number()<\/h3>\n<p>Au sein de la science des donn\u00e9es moderne, l&rsquo;\u00e9cosyst\u00e8me Tidyverse, principalement structur\u00e9 autour de la biblioth\u00e8que <a rel=\"noopener noreferrer\" href=\"https:\/\/dplyr.tidyverse.org\/\">dplyr<\/a> con\u00e7ue par Hadley Wickham, privil\u00e9gie une approche d\u00e9clarative o\u00f9 les attributs de m\u00e9tadonn\u00e9es implicites sont syst\u00e9matiquement convertis en variables explicites au sein de tables plates dites ordonn\u00e9es (tidy data). D\u00e8s lors, la notion d&rsquo;indice positionnel invisible est souvent transform\u00e9e en une colonne d&rsquo;indexation continue int\u00e9gr\u00e9e au flux de travail analytique.<\/p>\n<p>La fonction <code>row_number()<\/code> permet de mat\u00e9rialiser instantan\u00e9ment cette s\u00e9quence ordinale continue sans n\u00e9cessiter d&rsquo;appel externe \u00e0 des compteurs it\u00e9ratifs. Elle s&rsquo;int\u00e8gre naturellement au sein de la fonction de transformation <code>mutate()<\/code> en amont de toute op\u00e9ration destructive de sous-\u00e9chantillonnage :<\/p>\n<p><code>library(dplyr)<br \/>\ndonnees_indexees &lt;- donnees %&gt;%<br \/>\n&nbsp;&nbsp;mutate(rang_origine = row_number())<\/code><\/p>\n<p>Il importe de distinguer formellement <code>row_number()<\/code> des autres fonctions de classement ordinal fournies par dplyr, \u00e0 l&rsquo;instar de <code>min_rank()<\/code> et <code>dense_rank()<\/code>. Si un vecteur contient des valeurs identiques, <code>row_number()<\/code> proc\u00e8de \u00e0 une discrimination positionnelle s\u00e9quentielle sans jamais g\u00e9n\u00e9rer d&rsquo;ex \u00e6quo (assimilant chaque rang \u00e0 un compteur de position physique), tandis que <code>min_rank()<\/code> et <code>dense_rank()<\/code> mod\u00e9lisent des rangs statistiques partag\u00e9s conformes aux canons des tests non param\u00e9triques (comme le test de Wilcoxon-Mann-Whitney).<\/p>\n<h3>9.2 Extraction indic\u00e9e dans les cha\u00eenes de traitement piping<\/h3>\n<p>L&rsquo;int\u00e9gration de l&rsquo;extraction positionnelle au sein des cha\u00eenes de traitement utilisant le tube de programmation (l&rsquo;op\u00e9rateur pipe historique <code>%&gt;%<\/code> de magrittr ou le pipe natif <code>|&gt;<\/code> introduit dans R 4.1.0) assure une parfaite lisibilit\u00e9 s\u00e9quentielle des scripts d&rsquo;analyse reproductible. Lorsqu&rsquo;une succession de transformations conduit \u00e0 isoler des observations aberrantes, l&rsquo;analyste peut extraire directement le vecteur d&rsquo;entiers \u00e0 l&rsquo;aide de la fonction <code>pull()<\/code> :<\/p>\n<p><code>indices_aberrants &lt;- donnees %&gt;%<br \/>\n&nbsp;&nbsp;mutate(numero_ligne = row_number()) %&gt;%<br \/>\n&nbsp;&nbsp;filter(temps_reaction &lt; 150 | temps_reaction &gt; 2500) %&gt;%<br \/>\n&nbsp;&nbsp;pull(numero_ligne)<\/code><\/p>\n<p>Par ailleurs, pour les op\u00e9rations de partitionnement de donn\u00e9es via la directive <code>group_by()<\/code>, dplyr fournit la fonction contextuelle sp\u00e9cialis\u00e9e <code>cur_group_rows()<\/code>. Cette primitive avanc\u00e9e retourne directement les num\u00e9ros de ligne des observations appartenant au groupe en cours de traitement au sein de la structure m\u00e8re non partitionn\u00e9e :<\/p>\n<p><code>donnees %&gt;%<br \/>\n&nbsp;&nbsp;group_by(centre_hospitalier) %&gt;%<br \/>\n&nbsp;&nbsp;summarise(lignes_incluses = list(cur_group_rows()))<\/code><\/p>\n<p>Cette approche hautement expressive permet de g\u00e9n\u00e9rer une table de tra\u00e7abilit\u00e9 compl\u00e8te liant chaque strate d&rsquo;analyse \u00e0 ses rangs physiques d&rsquo;ancrage dans la base m\u00e8re, ce qui simplifie grandement les audits de donn\u00e9es dans les essais multicentriques.<\/p>\n<h3>9.3 Arbitrage m\u00e9thodologique : Syntaxe R de base versus Tidyverse<\/h3>\n<p>Le choix entre l&rsquo;approche R de base (centr\u00e9e sur <code>which()<\/code>) et le paradigme Tidyverse ne rel\u00e8ve pas d&rsquo;une querelle stylistique superficielle, mais d&rsquo;un arbitrage technique d\u00e9lib\u00e9r\u00e9 entre compacit\u00e9, efficacit\u00e9 computationnelle et p\u00e9rennit\u00e9 des environnements de calcul.<\/p>\n<p>La syntaxe de base R pr\u00e9sente l&rsquo;avantage inestimable d&rsquo;une d\u00e9pendance logicielle nulle. Un script r\u00e9dig\u00e9 au moyen de <code>which(df$variable == seuil)<\/code> fonctionne sans n\u00e9cessiter l&rsquo;installation d&rsquo;aucun package externe et offre une garantie de r\u00e9trocompatibilit\u00e9 quasi absolue sur plusieurs d\u00e9cennies. C&rsquo;est la syntaxe d&rsquo;\u00e9lection pour le d\u00e9veloppement de biblioth\u00e8ques logicielles autonomes (packages CRAN ou Bioconductor), les calculs embarqu\u00e9s et les scripts de d\u00e9ploiement en production industrielle critique.<\/p>\n<p>\u00c0 l&rsquo;inverse, l&rsquo;approche Tidyverse met l&rsquo;accent sur la lisibilit\u00e9 cognitive, la modularit\u00e9 et la maintenance collaborative du code au sein des \u00e9quipes de recherche. Pour l&rsquo;analyse exploratoire interactive et la g\u00e9n\u00e9ration de rapports dynamiques, l&rsquo;explicitation des rangs via <code>mutate(id = row_number())<\/code> ins\u00e9r\u00e9e dans une cha\u00eene de verbes d&rsquo;action s&rsquo;av\u00e8re souvent plus intuitive et r\u00e9duit substantiellement les erreurs de lecture humaine au sein de structures conceptuelles imbriqu\u00e9es.<\/p>\n<h2>10. Techniques de haute performance avec data.table et structures massives<\/h2>\n<h3>10.1 Utilisation du symbole sp\u00e9cial .I dans l&rsquo;environnement data.table<\/h3>\n<p>D\u00e8s lors que les corpus de donn\u00e9es atteignent des dimensions massives \u2014 comptant plusieurs dizaines de millions de lignes et plusieurs gigaoctets de m\u00e9moire vive \u2014, les m\u00e9canismes standards d&rsquo;allocation et de copie m\u00e9moire de R atteignent leurs limites structurelles. 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 s&rsquo;impose comme la r\u00e9f\u00e9rence absolue de l&rsquo;ing\u00e9nierie statistique sous R.<\/p>\n<p>Au c\u0153ur du mod\u00e8le syntaxique <code>dt[i, j, by]<\/code> de data.table se trouve un ensemble de symboles r\u00e9serv\u00e9s, parmi lesquels le symbole sp\u00e9cial <code>.I<\/code> joue un r\u00f4le d\u00e9terminant pour la localisation positionnelle. <code>.I<\/code> repr\u00e9sente un vecteur d&rsquo;entiers contenant la s\u00e9quence compl\u00e8te des num\u00e9ros de ligne globaux de la table courante (\u00e9quivalent conceptuel \u00e0 <code>1:nrow(dt)<\/code>). Lorsqu&rsquo;il est utilis\u00e9 en conjonction avec un filtre conditionnel dans la clause <code>i<\/code>, il permet d&rsquo;extraire les coordonn\u00e9es de ligne \u00e0 une vitesse fulgurante sans mat\u00e9rialiser de copie redondante :<\/p>\n<p><code>library(data.table)<br \/>\ndt &lt;- as.data.table(grande_cohorte)<br \/>\nindices_performance &lt;- dt[vitesse_traitement &gt; 120, .I]<\/code><\/p>\n<p>Cette instruction simple renvoie directement le vecteur d&rsquo;entiers correspondant aux lignes validant le crit\u00e8re. L&rsquo;ex\u00e9cution de cette requ\u00eate se caract\u00e9rise par une empreinte m\u00e9moire quasi n\u00e9gligeable, car l&rsquo;op\u00e9ration est vectoris\u00e9e en langage C natif, contournant les surco\u00fbts d&rsquo;\u00e9valuation non standard propres aux structures traditionnelles.<\/p>\n<h3>10.2 Indexation secondaire et cl\u00e9s d&rsquo;acc\u00e8s binaire<\/h3>\n<p>La puissance de <code>data.table<\/code> ne se limite pas \u00e0 son \u00e9criture compacte : elle r\u00e9side principalement dans sa capacit\u00e9 \u00e0 op\u00e9rer des recherches positionnelles en temps logarithmique gr\u00e2ce \u00e0 l&rsquo;indexation secondaire et aux cl\u00e9s d&rsquo;acc\u00e8s primaires. Lorsqu&rsquo;une table de donn\u00e9es conventionnelle est interrog\u00e9e, le syst\u00e8me doit ex\u00e9cuter un balayage s\u00e9quentiel complet de dimension <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{O}(N)\">$\\mathcal{O}(N)$<\/span>. Sur un milliard d&rsquo;enregistrements, ce balayage requiert un temps machine substantiel.<\/p>\n<p>En assignant formellement une cl\u00e9 de tri physique \u00e0 une table via la commande <code>setkey(dt, identifiant)<\/code> ou en cr\u00e9ant un index secondaire avec <code>setindex(dt, code_diagnostic)<\/code>, <code>data.table<\/code> r\u00e9organise les pointeurs internes et d\u00e9ploie un algorithme de recherche binaire optimis\u00e9 de complexit\u00e9 <span class=\"arabpsy-math-inline\" data-latex=\"\\mathcal{O}(\\log N)\">$\\mathcal{O}(\\log N)$<\/span> :<\/p>\n<p><code>setkey(dt, code_diagnostic)<br \/>\nindices_rapides &lt;- dt[\"E11.9\", which = TRUE]<\/code><\/p>\n<p>L&rsquo;argument d\u00e9di\u00e9 <code>which = TRUE<\/code> ordonne explicitement au moteur d&rsquo;ex\u00e9cution de ne pas retourner les enregistrements eux-m\u00eames, mais de restituer uniquement le vecteur des num\u00e9ros de ligne correspondant \u00e0 la cl\u00e9 recherch\u00e9e (ici le code CIM-10 du diab\u00e8te de type 2 sans complication). La recherche binaire identifie les fronti\u00e8res des enregistrements cibles en une fraction infinit\u00e9simale de seconde, offrant des performances plusieurs ordres de grandeur sup\u00e9rieures \u00e0 celles de la fonction <code>which()<\/code> standard sur des volumes massifs.<\/p>\n<h3>10.3 Benchmarking comparatif des approches sur grands volumes de donn\u00e9es<\/h3>\n<p>Afin de quantifier empiriquement les disparit\u00e9s de performance entre ces diff\u00e9rentes approches, examinons les r\u00e9sultats types d&rsquo;un protocole de micro-\u00e9valuation temporelle (benchmarking) men\u00e9 sur une table synth\u00e9tique de 10 millions d&rsquo;observations via le package de profilage <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/web\/packages\/microbenchmark\/\">microbenchmark<\/a>. Les trois strat\u00e9gies en comp\u00e9tition sont : <code>which()<\/code> en R de base, <code>dplyr::filter() %&gt;% pull()<\/code>, et <code>data.table<\/code> exploitant le symbole <code>.I<\/code> ou sa cl\u00e9 binaire.<\/p>\n<p>Les chronom\u00e9trages r\u00e9v\u00e8lent des profils de performance hautement contrast\u00e9s :<\/p>\n<ul>\n<li><strong>R de base :<\/strong> L&rsquo;\u00e9valuation <code>which(dt$valeur &gt; 80)<\/code> affiche un temps m\u00e9dian oscillant g\u00e9n\u00e9ralement autour de 35 \u00e0 45 millisecondes, d\u00e9montrant l&rsquo;efficacit\u00e9 remarquable du code C compil\u00e9 sous-jacent de la distribution officielle de R.<\/li>\n<li><strong>Tidyverse (dplyr) :<\/strong> La combinaison <code>filter()<\/code> et <code>pull()<\/code> induit une surcharge temporelle mesur\u00e9e entre 120 et 180 millisecondes, cons\u00e9cutive aux v\u00e9rifications formelles de structure, \u00e0 la r\u00e9conciliation des m\u00e9tadonn\u00e9es et \u00e0 l&rsquo;instanciation temporaire de structures interm\u00e9diaires en m\u00e9moire.<\/li>\n<li><strong>data.table avec cl\u00e9 :<\/strong> L&rsquo;interrogation <code>dt[.(valeur_cible), which = TRUE]<\/code> sur une table pr\u00e9alablement index\u00e9e s&rsquo;ex\u00e9cute en moins de 0,5 milliseconde, r\u00e9duisant la latence calculatoire \u00e0 un seuil imperceptible.<\/li>\n<\/ul>\n<p>Ces constatations exp\u00e9rimentales d\u00e9montrent avec force que d\u00e8s lors que la volum\u00e9trie d\u00e9passe le seuil critique du million de lignes ou que les requ\u00eates sont int\u00e9gr\u00e9es dans des boucles de r\u00e9-\u00e9chantillonnage intensives (bootstrap, validations crois\u00e9es it\u00e9r\u00e9es), l&rsquo;adoption d&rsquo;architectures index\u00e9es de type <code>data.table<\/code> constitue un imp\u00e9ratif d&rsquo;ing\u00e9nierie logicielle incontournable.<\/p>\n<h2>11. Applications pratiques dans le traitement de donn\u00e9es psychom\u00e9triques et exp\u00e9rimentales<\/h2>\n<h3>11.1 D\u00e9tection des r\u00e9ponses invariantes sur \u00e9chelles de Likert<\/h3>\n<p>Dans l&rsquo;analyse des questionnaires psychologiques et des \u00e9chelles de mesure d&rsquo;attitude reposant sur des gradations de type Likert (par exemple de 1 \u00e0 7), la pr\u00e9sence de participants adoptant un comportement d&rsquo;inattention caract\u00e9ris\u00e9 par des r\u00e9ponses invariantes (straightlining ou acquiescence syst\u00e9matique) biaise lourdement les matrices de covariance et fausse l&rsquo;estimation des indices de fid\u00e9lit\u00e9 tels que l&rsquo;alpha de Cronbach ou l&rsquo;om\u00e9ga de McDonald.<\/p>\n<p>Pour rep\u00e9rer les rangs de ces r\u00e9pondants non fiables, l&rsquo;analyste peut calculer la variance intra-individuelle \u00e0 travers la batterie d&rsquo;items. Un participant ayant syst\u00e9matiquement s\u00e9lectionn\u00e9 la m\u00eame modalit\u00e9 (par exemple cochant 4 \u00e0 l&rsquo;int\u00e9gralit\u00e9 des quarante questions d&rsquo;un inventaire de personnalit\u00e9) pr\u00e9sentera une variance strictement \u00e9gale \u00e0 z\u00e9ro :<\/p>\n<p><code>variances_participants &lt;- apply(matrice_items, 1, var, na.rm = TRUE)<br \/>\nlignes_reponses_invariantes &lt;- which(variances_participants == 0)<\/code><\/p>\n<p>L&rsquo;extraction de ce vecteur de num\u00e9ros de ligne permet d&rsquo;isoler imm\u00e9diatement les observations suspectes. Dans le compte rendu m\u00e9thodologique de l&rsquo;\u00e9tude empirique, le statisticien peut consigner avec une pr\u00e9cision chirurgicale l&rsquo;exclusion de ces rangs d\u00e9termin\u00e9s, pr\u00e9servant la tra\u00e7abilit\u00e9 int\u00e9grale de l&rsquo;\u00e9puration de l&rsquo;\u00e9chantillon tout en garantissant la stricte reproductibilit\u00e9 du protocole psychom\u00e9trique.<\/p>\n<h3>11.2 Filtrage des temps de r\u00e9action aberrants en psychologie cognitive<\/h3>\n<p>L&rsquo;exp\u00e9rimentation en psychologie cognitive et en neurosciences computationnelles repose abondamment sur la mesure des temps de r\u00e9action (TR) lors de t\u00e2ches de d\u00e9cision lexicale ou de d\u00e9tection d&rsquo;indices spatiaux (paradigme de Posner). Ces mesures sont syst\u00e9matiquement pollu\u00e9es par deux types de d\u00e9viations physiologiques : les r\u00e9ponses pr\u00e9matur\u00e9es ou anticipatoires survenant avant le traitement sensoriel minimal (TR inf\u00e9rieur \u00e0 150 millisecondes), et les \u00e9pisodes de distraction attentionnelle majeure (TR sup\u00e9rieur \u00e0 3000 millisecondes).<\/p>\n<p>L&rsquo;identification positionnelle des essais exp\u00e9rimentaux \u00e0 exclure s&rsquo;articule autour d&rsquo;une double condition relationnelle disjonctive appliqu\u00e9e \u00e0 la table de donn\u00e9es d&rsquo;enregistrement continu :<\/p>\n<p><code>essais_invalides &lt;- which(<br \/>\n&nbsp;&nbsp;log_experimental$temps_reaction &lt; 150 |<br \/>\n&nbsp;&nbsp;log_experimental$temps_reaction &gt; 3000<br \/>\n)<\/code><\/p>\n<p>Disposer des num\u00e9ros de ligne exacts de ces essais aberrants permet de ne pas d\u00e9truire aveugl\u00e9ment les donn\u00e9es. Le chercheur peut v\u00e9rifier si ces anomalies se concentrent s\u00e9quentiellement \u00e0 la fin de la session de test (signalant un \u00e9puisement cognitif du participant) ou au d\u00e9but (effet d&rsquo;apprentissage non stabilis\u00e9). Les indices r\u00e9cup\u00e9r\u00e9s autorisent ainsi des analyses de sensibilit\u00e9 pouss\u00e9es comparant les mod\u00e8les lin\u00e9aires mixtes avec et sans ces essais, renfor\u00e7ant la solidit\u00e9 scientifique des conclusions inf\u00e9r\u00e9es.<\/p>\n<h3>11.3 Suivi longitudinal et identification des profils d&rsquo;attrition<\/h3>\n<p>Les \u00e9tudes observationnelles prospectives de cohortes et les protocoles longitudinaux de suivi th\u00e9rapeutique subissent in\u00e9vitablement le ph\u00e9nom\u00e8ne d&rsquo;attrition temporelle (perte de vue de patients entre les diff\u00e9rentes vagues d&rsquo;\u00e9valuation). Localiser avec exactitude les rangs des sujets d\u00e9crocheurs au sein des matrices de donn\u00e9es r\u00e9capitulatives permet de documenter les caract\u00e9ristiques basales pr\u00e9dictives de l&rsquo;abandon de suivi.<\/p>\n<p>Imaginons un suivi clinique structur\u00e9 en trois temps s\u00e9quentiels : inclusion initiale (T1), suivi \u00e0 six mois (T2), et \u00e9valuation finale \u00e0 douze mois (T3). Pour identifier les sujets ayant compl\u00e9t\u00e9 l&rsquo;\u00e9valuation initiale mais ayant fait d\u00e9faut d\u00e8s l&rsquo;\u00e9tape T2, on croise des crit\u00e8res de pr\u00e9sence et d&rsquo;absence :<\/p>\n<p><code>indices_decrochage_t2 &lt;- which(<br \/>\n&nbsp;&nbsp;!is.na(cohorte$score_t1) &amp;<br \/>\n&nbsp;&nbsp;is.na(cohorte$score_t2)<br \/>\n)<\/code><\/p>\n<p>La r\u00e9cup\u00e9ration de ces positions permet d&rsquo;extraire la sous-cohorte des participants concern\u00e9s afin d&rsquo;alimenter une r\u00e9gression logistique binaire visant \u00e0 mod\u00e9liser la probabilit\u00e9 d&rsquo;attrition en fonction des covariables d&rsquo;inclusion (\u00e2ge, milieu socio-\u00e9conomique, s\u00e9v\u00e9rit\u00e9 clinique inaugurale). La gestion pr\u00e9cise des num\u00e9ros de ligne garantit l&rsquo;alignement rigoureux des variables explicatives entre le sous-groupe des observ\u00e9s et le sous-groupe des perdus de vue.<\/p>\n<h2>12. Erreurs courantes, pi\u00e8ges syntaxiques et bonnes pratiques de programmation<\/h2>\n<h3>12.1 Confusion entre indices positionnels et noms de lignes (row.names)<\/h3>\n<p>L&rsquo;un des pi\u00e8ges les plus insidieux du langage R r\u00e9side dans l&rsquo;homonymie visuelle entre les indices ordinaux r\u00e9els d&rsquo;un data frame et les \u00e9tiquettes textuelles port\u00e9es par l&rsquo;attribut <code>row.names<\/code>. Cette ambigu\u00eft\u00e9 se manifeste avec une acuit\u00e9 particuli\u00e8re apr\u00e8s une premi\u00e8re op\u00e9ration de filtrage ou de r\u00e9ordonnancement du jeu de donn\u00e9es originel.<\/p>\n<p>Consid\u00e9rons un data frame de dix observations dont on extrait les lignes paires. La nouvelle structure fille contient d\u00e9sormais cinq observations, mais les \u00e9tiquettes textuelles de <code>row.names<\/code> conservent leurs d\u00e9signations historiques d&rsquo;origine : <code>\"2\"<\/code>, <code>\"4\"<\/code>, <code>\"6\"<\/code>, <code>\"8\"<\/code>, <code>\"10\"<\/code>. Si l&rsquo;analyste ex\u00e9cute une s\u00e9lection par crochet sans pr\u00eater attention \u00e0 la syntaxe :<\/p>\n<ul>\n<li><code>df[5, ]<\/code> : cette instruction appelle la <em>cinqui\u00e8me ligne physique<\/em> de la structure fille actuelle (qui correspond en fait \u00e0 l&rsquo;observation portant le nom d&rsquo;origine <code>\"10\"<\/code>).<\/li>\n<li><code>df[\"5\", ]<\/code> : cette instruction recherche l&rsquo;\u00e9l\u00e9ment dont l&rsquo;\u00e9tiquette textuelle de nom est <code>\"5\"<\/code>, renvoyant ici une ligne enti\u00e8rement vide de <code>NA<\/code> puisque cette modalit\u00e9 n&rsquo;existe plus dans le tableau sous-\u00e9chantillonn\u00e9.<\/li>\n<\/ul>\n<p>Pour immuniser les pipelines de traitement contre cette source critique d&rsquo;incoh\u00e9rence m\u00e9thodologique, il est imp\u00e9ratif de r\u00e9initialiser syst\u00e9matiquement les noms de lignes \u00e0 l&rsquo;\u00e9tat compact par d\u00e9faut apr\u00e8s toute op\u00e9ration de modification dimensionnelle d&rsquo;une table :<\/p>\n<p><code>rownames(donnees_filtrees) &lt;- NULL<\/code><\/p>\n<p>Cette commande d\u00e9truit les \u00e9tiquettes r\u00e9siduelles et force R \u00e0 restaurer un indexage positionnel entier standard num\u00e9rot\u00e9 de 1 \u00e0 <span class=\"arabpsy-math-inline\" data-latex=\"N\">$N$<\/span>, \u00e9liminant tout d\u00e9calage entre les coordonn\u00e9es de rang et les acc\u00e8s par cha\u00eenes de caract\u00e8res.<\/p>\n<h3>12.2 Pi\u00e8ges li\u00e9s \u00e0 la gestion du vecteur vide integer(0)<\/h3>\n<p>Comme nous l&rsquo;avons th\u00e9oris\u00e9 dans les fondements logiques de ce manuel, lorsqu&rsquo;aucune observation ne valide la condition transmise \u00e0 <code>which()<\/code>, la fonction retourne le vecteur d&rsquo;entiers de longueur nulle <code>integer(0)<\/code>. Si ce comportement s&rsquo;av\u00e8re math\u00e9matiquement irr\u00e9prochable, son utilisation directe et non contr\u00f4l\u00e9e en tant qu&rsquo;indice de s\u00e9lection matricielle produit des comportements pathologiques hautement d\u00e9stabilisants.<\/p>\n<p>En effet, l&rsquo;ex\u00e9cution de l&rsquo;expression <code>df[which(condition), ]<\/code> lorsque la condition est uniform\u00e9ment fausse renvoie un data frame vide comportant z\u00e9ro ligne tout en conservant les d\u00e9finitions de colonnes. Toutefois, si cette extraction s&rsquo;int\u00e8gre au sein d&rsquo;une boucle it\u00e9rative ou d&rsquo;un calcul vectoriel n\u00e9cessitant une valeur scalaire (par exemple une assignation conditionnelle ou une fonction statistique exigeant un minimum de donn\u00e9es), la pr\u00e9sence de <code>integer(0)<\/code> provoque fr\u00e9quemment l&rsquo;interruption brutale de l&rsquo;ex\u00e9cution ou l&rsquo;injection de valeurs scalaires aberrantes de longueur nulle :<\/p>\n<p><code>idx &lt;- which(df$score &gt; 1000)<br \/>\n# Mauvaise pratique vuln\u00e9rable :<br \/>\nscore_cible &lt;- df$score[idx[1]] # Renvoie NA silencieusement<\/code><\/p>\n<p>La programmation d\u00e9fensive exige la v\u00e9rification syst\u00e9matique de la cardinalit\u00e9 du vecteur d&rsquo;indices avant toute exploitation substantielle dans les fonctions critiques. Le test pr\u00e9alable \u00e0 l&rsquo;aide de la fonction <code>length()<\/code> constitue la protection canonique universelle :<\/p>\n<p><code>indices_trouves &lt;- which(donnees$score &gt; seuil_critique)<br \/>\nif (length(indices_trouves) &gt; 0) {<br \/>\n&nbsp;&nbsp;# Traitement des lignes identifi\u00e9es<br \/>\n&nbsp;&nbsp;observations_critiques &lt;- donnees[indices_trouves, ]<br \/>\n} else {<br \/>\n&nbsp;&nbsp;message(\"Aucune observation ne franchit le seuil fix\u00e9.\")<br \/>\n}<\/code><\/p>\n<p>Cette construction algorithmique conditionnelle s\u00e9curise les scripts automatis\u00e9s et pr\u00e9vient les \u00e9checs d&rsquo;ex\u00e9cution silencieux au sein des environnements d&rsquo;analyse \u00e0 grande \u00e9chelle.<\/p>\n<h3>12.3 Synth\u00e8se des recommandations pour un code scientifique robuste et reproductible<\/h3>\n<p>La ma\u00eetrise de l&rsquo;extraction des num\u00e9ros de ligne dans R transcende la simple aisance syntaxique : elle refl\u00e8te la rigueur de l&rsquo;architecture m\u00e9thodologique d\u00e9ploy\u00e9e par le chercheur. Pour consolider la reproductibilit\u00e9 et la robustesse des analyses quantitatives, un protocole m\u00e9thodique articul\u00e9 autour des directives suivantes doit \u00eatre instaur\u00e9 :<\/p>\n<ul>\n<li><strong>Harmonisation du paradigme logiciel :<\/strong> \u00c9vitez de m\u00ealer de fa\u00e7on erratique la syntaxe de base <code>which()<\/code>, les verbes d\u00e9claratifs de <code>dplyr<\/code> et les expressions matricielles de <code>data.table<\/code> au sein d&rsquo;un m\u00eame script. D\u00e9finissez une convention d&rsquo;architecture logicielle claire d\u00e8s la conception du projet (base R pour les packages et la performance autonome, Tidyverse pour l&rsquo;exploration p\u00e9dagogique et interactive, data.table pour les cohortes massives).<\/li>\n<li><strong>Annotation explicite des conditions :<\/strong> Ne laissez jamais une clause de filtrage logique complexe sans justification analytique textuelle dans le corps du code. Documentez formellement la rationalit\u00e9 empirique sous-jacente au choix des seuils critiques, des inclusions ensemblistes et des r\u00e8gles d&rsquo;exclusion de lignes.<\/li>\n<li><strong>Audit syst\u00e9matique des dimensions :<\/strong> Apr\u00e8s chaque extraction indic\u00e9e et sous-\u00e9chantillonnage, v\u00e9rifiez syst\u00e9matiquement les dimensions de la structure r\u00e9sultante via <code>dim()<\/code> ou <code>nrow()<\/code>. Comparez ces grandeurs aux effectifs marginaux th\u00e9oriques anticip\u00e9s afin d&rsquo;intercepter imm\u00e9diatement toute d\u00e9rive li\u00e9e \u00e0 la pr\u00e9sence insidieuse de valeurs <code>NA<\/code> ou \u00e0 des d\u00e9calages d&rsquo;indices.<\/li>\n<li><strong>Pr\u00e9servation stricte des matrices brutes :<\/strong> Ne modifiez jamais destructivement un jeu de donn\u00e9es de r\u00e9f\u00e9rence sur la base d&rsquo;indices de ligne sans avoir pr\u00e9alablement sauvegard\u00e9 une image fig\u00e9e et immuable de la structure originelle. Les num\u00e9ros de ligne constituent des coordonn\u00e9es relatives \u00e0 un \u00e9tat de la m\u00e9moire ; toute mutation physique alt\u00e8re la topologie de r\u00e9f\u00e9rence.<\/li>\n<\/ul>\n<p>En observant scrupuleusement ces principes directeurs de programmation scientifique, les praticiens de la recherche empirique s&rsquo;assurent d&rsquo;une tra\u00e7abilit\u00e9 irr\u00e9prochable de leurs donn\u00e9es, garantissant des inf\u00e9rences statistiques cr\u00e9dibles, auditables et pleinement conformes aux standards d&rsquo;excellence de la science ouverte.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<p>Chambers, J. M. (2008). <em>Software for data analysis: Programming with R<\/em>. Springer. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1007\/978-0-387-75936-4\">https:\/\/doi.org\/10.1007\/978-0-387-75936-4<\/a><\/p>\n<p>Dowle, M., &amp; Srinivasan, A. (2023). <em>data.table: Extension of `data.frame`<\/em> (R package version 1.14.8). CRAN. <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=data.table\">https:\/\/cran.r-project.org\/package=data.table<\/a><\/p>\n<p>IEEE Computer Society. (2019). <em>IEEE standard for floating-point arithmetic<\/em> (IEEE Std 754-2019). IEEE. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1109\/IEEESTD.2019.8766229\">https:\/\/doi.org\/10.1109\/IEEESTD.2019.8766229<\/a><\/p>\n<p>Ihaka, R., &amp; Gentleman, R. (1996). R: A language for data analysis and graphics. <em>Journal of Computational and Graphical Statistics<\/em>, 5(3), 299\u2013314. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1080\/10618600.1996.10474713\">https:\/\/doi.org\/10.1080\/10618600.1996.10474713<\/a><\/p>\n<p>R Core Team. (2024). <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><\/p>\n<p>Tukey, J. W. (1977). <em>Exploratory data analysis<\/em>. Addison-Wesley.<\/p>\n<p>Wickham, H. (2019). <em>Advanced R<\/em> (2nd ed.). Chapman and Hall\/CRC. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.1201\/9781351201315\">https:\/\/doi.org\/10.1201\/9781351201315<\/a><\/p>\n<p>Wickham, H., Fran\u00e7ois, R., Henry, L., &amp; M\u00fcller, K. (2023). <em>dplyr: A grammar of data manipulation<\/em> (R package version 1.1.4). CRAN. <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=dplyr\">https:\/\/cran.r-project.org\/package=dplyr<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Guide acad\u00e9mique complet pour identifier et extraire les num\u00e9ros de ligne sous R \u00e0 l&rsquo;aide de which(), des op\u00e9rateurs logiques et du Tidyverse avec exemples.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[1829,2193],"tags":[1884,3703,2470,2658,6809],"class_list":["post-4841","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-statistique","category-programmation-r","tag-analyse-de-donnees","tag-data-frame","tag-indexation","tag-r","tag-which"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4841","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=4841"}],"version-history":[{"count":0,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4841\/revisions"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}