{"id":4809,"date":"2026-10-14T18:01:18","date_gmt":"2026-10-14T18:01:18","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-compter-valeurs-distinctes-dplyr-exemples\/"},"modified":"2026-10-14T18:01:18","modified_gmt":"2026-10-14T18:01:18","slug":"comment-compter-valeurs-distinctes-dplyr-exemples","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-compter-valeurs-distinctes-dplyr-exemples","title":{"rendered":"Comment compter les valeurs distinctes avec dplyr (avec exemples)"},"content":{"rendered":"<p>Dans le paysage contemporain de l&rsquo;ing\u00e9nierie des donn\u00e9es et de la mod\u00e9lisation statistique sous l&rsquo;environnement R, l&rsquo;\u00e9valuation de la cardinalit\u00e9 d&rsquo;un ensemble d&rsquo;observations constitue un jalon analytique fondamental. La quantification pr\u00e9cise du nombre d&rsquo;entit\u00e9s uniques au sein d&rsquo;une variable conditionne non seulement la pertinence des strat\u00e9gies d&rsquo;\u00e9chantillonnage, mais oriente \u00e9galement le choix des architectures algorithmiques adapt\u00e9es \u00e0 la fouille de donn\u00e9es complexes. Que l&rsquo;analyste se trouve confront\u00e9 \u00e0 des cohortes \u00e9pid\u00e9miologiques longitudinales, des inventaires transactionnels d&rsquo;envergure industrielle ou des batteries de tests psychom\u00e9triques standardis\u00e9s, l&rsquo;identification du nombre d&rsquo;unit\u00e9s statistiques distinctes permet de cartographier la structure intrins\u00e8que de l&rsquo;information brute avant tout traitement d&rsquo;inf\u00e9rence.<\/p>\n<p>Historiquement, le langage de programmation statistique R proposait des m\u00e9canismes canoniques fond\u00e9s sur l&rsquo;imbrication des fonctions de base, notamment l&rsquo;association classique entre l&rsquo;\u00e9valuation de la longueur d&rsquo;un objet et l&rsquo;extraction de ses \u00e9l\u00e9ments singuliers. Si cette approche proc\u00e9durale a longtemps suffi aux besoins acad\u00e9miques traditionnels, l&rsquo;av\u00e8nement de flux de donn\u00e9es massifs a mis en exergue ses limites intrins\u00e8ques sur le plan de la lisibilit\u00e9 syntaxique et de l&rsquo;efficience algorithmique. L&rsquo;\u00e9mergence du <a rel=\"noopener noreferrer\" href=\"https:\/\/www.tidyverse.org\/\">Tidyverse<\/a>, initi\u00e9 par les travaux de Hadley Wickham, a profond\u00e9ment refondu ce paradigme en introduisant une grammaire d\u00e9clarative et coh\u00e9rente de manipulation tabulaire, au centre de laquelle r\u00e9side le package <strong>dplyr<\/strong>.<\/p>\n<p>Le pr\u00e9sent trait\u00e9 propose une investigation exhaustive des m\u00e9canismes permettant de d\u00e9nombrer les valeurs distinctes au moyen des fonctions sp\u00e9cialis\u00e9es de l&rsquo;\u00e9cosyst\u00e8me <strong>dplyr<\/strong>, avec une focalisation pr\u00e9pond\u00e9rante sur l&rsquo;op\u00e9rateur <code>n_distinct()<\/code>. \u00c0 travers un parcours didactique rigoureux, nous explorerons les fondements computationnels de cette fonction, ses multiples d\u00e9clinaisons op\u00e9rationnelles au sein de pipelines analytiques structur\u00e9s, ainsi que les strat\u00e9gies avanc\u00e9es de traitement par groupe et sur des matrices multidimensionnelles. Ce guide s&rsquo;attache \u00e0 combiner rigueur conceptuelle, analyse de la complexit\u00e9 algorithmique et illustrations appliqu\u00e9es aux donn\u00e9es r\u00e9elles, afin d&rsquo;armer le data scientist d&rsquo;un corpus m\u00e9thodologique complet et p\u00e9renne.<\/p>\n<h2>1. Introduction \u00e0 l&rsquo;analyse de cardinalit\u00e9 et au comptage distinct avec dplyr<\/h2>\n<h3>1.1 Importance de la cardinalit\u00e9 dans le traitement des donn\u00e9es quantitatives<\/h3>\n<p>En analyse statistique et en th\u00e9orie des bases de donn\u00e9es relationnelles, la cardinalit\u00e9 repr\u00e9sente le nombre absolu d&rsquo;\u00e9l\u00e9ments uniques contenus au sein d&rsquo;un ensemble math\u00e9matique discret. Appliqu\u00e9e \u00e0 une colonne d&rsquo;un tableau d&rsquo;observations rectangulaire, cette notion quantifie la diversit\u00e9 des modalit\u00e9s effectives qu&rsquo;une variable al\u00e9atoire manifeste au cours de son recueil empirique. L&rsquo;\u00e9valuation de la cardinalit\u00e9 d\u00e9passe le simple inventaire descriptif : elle constitue un diagnostic exploratoire critique guidant l&rsquo;ensemble de la cha\u00eene de pr\u00e9traitement. Un statisticien chevronn\u00e9 mesure la cardinalit\u00e9 afin de juger du caract\u00e8re informatif d&rsquo;une dimension, de d\u00e9tecter d&rsquo;\u00e9ventuelles redondances de capture et de v\u00e9rifier l&rsquo;absence d&rsquo;incoh\u00e9rences structurelles issues de l&rsquo;encodage textuel.<\/p>\n<p>Sur le plan de la taxonomie des donn\u00e9es, la cardinalit\u00e9 joue un r\u00f4le de d\u00e9marcation conceptuelle direct entre les variables qualitatives nominales, les \u00e9chelles ordinales et les identifiants univoques du sch\u00e9ma de donn\u00e9es. Une variable pr\u00e9sentant une cardinalit\u00e9 strictement \u00e9gale \u00e0 l&rsquo;unit\u00e9 est une constante invariante, d\u00e9nu\u00e9e de tout pouvoir discriminant pour l&rsquo;analyse pr\u00e9dictive, qui doit g\u00e9n\u00e9ralement \u00eatre \u00e9cart\u00e9e des matrices de r\u00e9gression. \u00c0 l&rsquo;inverse, une variable dont la cardinalit\u00e9 \u00e9gale le nombre total de lignes observ\u00e9es poss\u00e8de un ratio d&rsquo;unicit\u00e9 de 100 %, ce qui caract\u00e9rise formellement un identifiant primaire ou une cl\u00e9 candidate. Entre ces deux bornes se d\u00e9ploient les variables cat\u00e9gorielles \u00e0 cardinalit\u00e9 faible ou \u00e9lev\u00e9e, dont la distribution des fr\u00e9quences conditionne la robustesse des estimateurs statistiques.<\/p>\n<p>Enfin, la m\u00e9connaissance du nombre d&rsquo;unit\u00e9s statistiques distinctes introduit des biais majeurs dans la construction de mod\u00e8les \u00e9conom\u00e9triques ou psychom\u00e9triques. Dans le cadre de mod\u00e9lisations hi\u00e9rarchiques lin\u00e9aires ou de mod\u00e8les \u00e0 effets mixtes, l&rsquo;estimation des composantes de la variance d\u00e9pend intimement du nombre de groupes distincts identifiables dans les donn\u00e9es de panel. Une cardinalit\u00e9 trop restreinte au niveau des clusters peut conduire \u00e0 des erreurs standard asymptotiquement biais\u00e9es, tandis qu&rsquo;une cardinalit\u00e9 excessive sur des pr\u00e9dicteurs cat\u00e9goriels entra\u00eene l&rsquo;explosion de l&rsquo;espace dimensionnel lors de la binarisation en variables muettes, acc\u00e9l\u00e9rant ainsi le fl\u00e9au de la dimensionnalit\u00e9.<\/p>\n<h3>1.2 Positionnement de dplyr au sein du Tidyverse pour l&rsquo;exploration de donn\u00e9es<\/h3>\n<p>Le package <a rel=\"noopener noreferrer\" href=\"https:\/\/dplyr.tidyverse.org\/\">dplyr<\/a> constitue le pilier architectural de la manipulation de donn\u00e9es au sein de l&rsquo;\u00e9cosyst\u00e8me Tidyverse. Con\u00e7u selon les principes de la s\u00e9mantique d\u00e9clarative th\u00e9oris\u00e9e par Hadley Wickham, <strong>dplyr<\/strong> r\u00e9articule les op\u00e9rations courantes de transformation tabulaire autour d&rsquo;un ensemble restreint de verbes \u00e9l\u00e9mentaires traduisant directement l&rsquo;intention analytique de l&rsquo;utilisateur. Cette formalisation linguistique permet de convertir des calculs complexes et verbeux en pipelines de traitement hautement lisibles, o\u00f9 le flux des transformations suit une trajectoire lin\u00e9aire et transparente, minimisant la charge cognitive requise pour la compr\u00e9hension du script.<\/p>\n<p>Au-del\u00e0 de son \u00e9l\u00e9gance syntaxique, <strong>dplyr<\/strong> apporte des gains computationnels substantiels par rapport aux fonctions natives de R de base. Les concepteurs de l&rsquo;outil ont massivement r\u00e9\u00e9crit les c\u0153urs op\u00e9rationnels des verbes en langage compil\u00e9, tirant parti des biblioth\u00e8ques C++ sous-jacentes pour contourner les limitations d&rsquo;interpr\u00e9tation inh\u00e9rentes au moteur dynamique de R. Les algorithmes d&rsquo;indexation, de partitionnement et d&rsquo;\u00e9valuation masqu\u00e9e des expressions garantissent une allocation m\u00e9moire optimis\u00e9e et une r\u00e9duction spectaculaire des temps de calcul sur les grands volumes de donn\u00e9es. La manipulation d&rsquo;objets de classe <code>tibble<\/code> renforce cette rigueur en imposant des contr\u00f4les de typage stricts et en \u00e9liminant les comportements impr\u00e9visibles de simplification dimensionnelle fr\u00e9quents avec les objets <code>data.frame<\/code> conventionnels.<\/p>\n<p>La transition conceptuelle du langage de base vers l&rsquo;univers <strong>dplyr<\/strong> modifie profond\u00e9ment la posture du praticien face au d\u00e9nombrement de valeurs distinctes. Alors que l&rsquo;approche traditionnelle repose sur des indexations par crochets et des appels r\u00e9cursifs parfois opaques, le formalisme Tidyverse int\u00e8gre le d\u00e9nombrement au c\u0153ur m\u00eame des cha\u00eenes de calcul via le verbe <code>summarise()<\/code> et l&rsquo;op\u00e9rateur de cha\u00eenage s\u00e9quentiel. Cette coh\u00e9rence structurelle offre un cadre unifi\u00e9 permettant d&rsquo;interroger simultan\u00e9ment la granularit\u00e9 locale d&rsquo;un sous-groupe et la topologie globale d&rsquo;une infrastructure relationnelle sans rupture d&rsquo;environnement.<\/p>\n<h3>1.3 Objectifs m\u00e9thodologiques et structure du guide d&rsquo;apprentissage<\/h3>\n<p>Ce guide magistral a pour objectif de doter les analystes, biostatisticiens et ing\u00e9nieurs de donn\u00e9es d&rsquo;une compr\u00e9hension doctrinale et op\u00e9rationnelle du comptage distinct sous R. Il vise \u00e0 d\u00e9mystifier les m\u00e9canismes internes d&rsquo;\u00e9valuation de la cardinalit\u00e9 tout en d\u00e9livrant des recettes pragmatiques imm\u00e9diatement transposables dans des contextes de production exigeants. En explorant l&rsquo;\u00e9ventail des fonctions disponibles, nous chercherons constamment \u00e0 concilier deux imp\u00e9ratifs souvent antagonistes de l&rsquo;informatique d\u00e9cisionnelle : l&rsquo;\u00e9l\u00e9gance d\u00e9clarative du code source et son efficience computationnelle maximale.<\/p>\n<p>Le d\u00e9veloppement m\u00e9thodologique s&rsquo;articulera autour de trois strat\u00e9gies cardinales. La premi\u00e8re examine l&rsquo;isolation d&rsquo;une variable sp\u00e9cifique pour une quantification cibl\u00e9e, r\u00e9pondant aux exigences des v\u00e9rifications d&rsquo;int\u00e9grit\u00e9 pr\u00e9liminaires. La seconde approche aborde le balayage syst\u00e9matique de toutes les colonnes d&rsquo;une matrice, automatisant l&rsquo;audit structurel d&rsquo;un jeu de donn\u00e9es inconnu. La troisi\u00e8me m\u00e9thode traite de l&rsquo;\u00e9valuation conditionnelle par sous-groupes, fondement de la statistique descriptive stratifi\u00e9e et de l&rsquo;analyse comparative inter-groupes.<\/p>\n<p>Le champ d&rsquo;investigation couvrira des architectures de donn\u00e9es allant des simples structures plates en m\u00e9moire jusqu&rsquo;aux jeux de donn\u00e9es relationnels volumineux pr\u00e9sentant des irr\u00e9gularit\u00e9s morphologiques, telles que la pr\u00e9sence diffuse de valeurs manquantes ou des discordances de typage scalaire. Chaque \u00e9tape analytique fera l&rsquo;objet d&rsquo;une formalisation math\u00e9matique rigoureuse et d&rsquo;un \u00e9talonnage de ses performances pour garantir l&rsquo;autonomie critique du lecteur dans ses choix architecturaux futurs.<\/p>\n<h2>2. Fondements th\u00e9oriques et syntaxiques de la fonction n_distinct()<\/h2>\n<h3>2.1 Architecture interne et m\u00e9canique d&rsquo;\u00e9valuation de n_distinct()<\/h3>\n<p>La fonction <code>n_distinct()<\/code> d\u00e9velopp\u00e9e au sein de <strong>dplyr<\/strong> ne se contente pas d&rsquo;envelopper une syntaxe \u00e9l\u00e9gante autour d&rsquo;instructions existantes : elle constitue une r\u00e9impl\u00e9mentation bas niveau hautement optimis\u00e9e de l&rsquo;algorithme de d\u00e9nombrement des \u00e9l\u00e9ments uniques. Dans l&rsquo;\u00e9cosyst\u00e8me R canonique, l&rsquo;\u00e9valuation du nombre de modalit\u00e9s singuli\u00e8res s&rsquo;obtient traditionnellement par l&rsquo;expression compos\u00e9e <code>length(unique(x))<\/code>. Cette formulation classique oblige l&rsquo;interpr\u00e9teur \u00e0 mat\u00e9rialiser en m\u00e9moire un vecteur interm\u00e9diaire complet contenant chaque valeur distincte identifi\u00e9e lors du balayage, avant de calculer la dimension de ce vecteur d\u00e9riv\u00e9. Ce m\u00e9canisme g\u00e9n\u00e8re une surcharge d&rsquo;allocation m\u00e9moire consid\u00e9rable lorsque la cardinalit\u00e9 de l&rsquo;objet inspect\u00e9 atteint des millions d&rsquo;unit\u00e9s.<\/p>\n<p>\u00c0 l&rsquo;inverse, l&rsquo;architecture interne de <code>n_distinct()<\/code> s&rsquo;appuie sur le framework <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=Rcpp\">Rcpp<\/a>, d\u00e9l\u00e9guant la travers\u00e9e des vecteurs \u00e0 un code compil\u00e9 C++ d&rsquo;une extr\u00eame rapidit\u00e9. L&rsquo;algorithme recourt \u00e0 des structures de tables de hachage associatives optimis\u00e9es, calibr\u00e9es sp\u00e9cifiquement selon le type primitif des donn\u00e9es d&rsquo;entr\u00e9e. Au lieu d&rsquo;allouer un vecteur de stockage pour les valeurs d\u00e9doublonn\u00e9es, le composant C++ ins\u00e8re les \u00e9l\u00e9ments rencontr\u00e9s dans un conteneur hach\u00e9 non ordonn\u00e9 et incr\u00e9mente un simple compteur scalaire \u00e0 chaque collision n\u00e9gative. Cette m\u00e9thode \u00e9vite l&rsquo;instanciation superflue d&rsquo;objets lourds sur le tas et permet une sortie instantan\u00e9e d\u00e8s que le vecteur a \u00e9t\u00e9 parcouru lin\u00e9airement.<\/p>\n<p>Face aux structures de donn\u00e9es atomiques telles que les vecteurs d&rsquo;entiers, de cha\u00eenes de caract\u00e8res textuelles ou de r\u00e9els en virgule flottante double pr\u00e9cision, <code>n_distinct()<\/code> adapte dynamiquement sa strat\u00e9gie d&rsquo;\u00e9valuation. Pour les entiers cons\u00e9cutifs ou born\u00e9s, des tableaux de bits peuvent \u00eatre employ\u00e9s en m\u00e9moire interne pour v\u00e9rifier l&rsquo;apparition des valeurs en temps constant, garantissant une complexit\u00e9 algorithmique asymptotique optimale de l&rsquo;ordre de O(N), o\u00f9 N repr\u00e9sente le nombre total d&rsquo;observations du vecteur analys\u00e9.<\/p>\n<h3>2.2 Param\u00e8tres fondamentaux et options d&rsquo;ajustement<\/h3>\n<p>L&rsquo;interface fonctionnelle de <code>n_distinct()<\/code> se distingue par une sobri\u00e9t\u00e9 remarquable dissimulant une flexibilit\u00e9 param\u00e9trique \u00e9tendue. La signature principale de la fonction se pr\u00e9sente sous la forme <code>n_distinct(..., na.rm = FALSE)<\/code>. Le premier argument, formalis\u00e9 par une ellipse typologique (trois points de suspension), stipule que l&rsquo;op\u00e9rateur peut recevoir non pas un seul vecteur atomique, mais une pluralit\u00e9 de vecteurs de longueur identique, ouvrant la voie \u00e0 des calculs de cardinalit\u00e9 combinatoire directe sans n\u00e9cessiter de concat\u00e9nation textuelle pr\u00e9alable.<\/p>\n<p>Le param\u00e8tre bool\u00e9en <code>na.rm<\/code> constitue le levier d&rsquo;ajustement principal r\u00e9gissant le traitement des observations incompl\u00e8tes. Par d\u00e9faut, sa valeur est rigoureusement fix\u00e9e \u00e0 <code>FALSE<\/code>, ce qui implique que le marqueur d&rsquo;absence de donn\u00e9es <code>NA<\/code> est assimil\u00e9 \u00e0 une modalit\u00e9 statistique distincte \u00e0 part enti\u00e8re. Lorsque <code>na.rm = TRUE<\/code> est express\u00e9ment sp\u00e9cifi\u00e9 par l&rsquo;analyste, toute occurrence de la valeur manquante est soustraite du processus d&rsquo;inscription dans la table de hachage, emp\u00eachant le marqueur d&rsquo;incr\u00e9menter le registre d&rsquo;unicit\u00e9. Cette distinction s\u00e9mantique s&rsquo;av\u00e8re critique pour \u00e9viter des sur\u00e9valuations de la cardinalit\u00e9 empirique au sein de corpus de donn\u00e9es lacunaires.<\/p>\n<p>Sur le plan de l&rsquo;int\u00e9grit\u00e9 structurelle des types, <code>n_distinct()<\/code> se conforme aux standards les plus stricts de l&rsquo;informatique d\u00e9cisionnelle en renvoyant immanquablement un scalaire de type <code>integer<\/code> ou un entier de grande capacit\u00e9 lorsque les extensions adapt\u00e9es sont sollicit\u00e9es. Cette pr\u00e9servation de l&rsquo;atome scalaire garantit que le r\u00e9sultat num\u00e9rique s&rsquo;int\u00e8gre harmonieusement dans les op\u00e9rations arithm\u00e9tiques ult\u00e9rieures, les projections matricielles ou les fonctions d&rsquo;assertion automatis\u00e9es au sein de pipelines de production industrielle.<\/p>\n<h2>3. Configuration de l&rsquo;environnement de travail et construction du jeu de donn\u00e9es<\/h2>\n<h3>3.1 Installation et chargement des biblioth\u00e8ques n\u00e9cessaires<\/h3>\n<p>Pour assurer la parfaite reproductibilit\u00e9 des protocoles de calcul expos\u00e9s tout au long de cette monographie, il est imp\u00e9ratif de configurer l&rsquo;espace de travail R en s&rsquo;appuyant sur des versions logicielles \u00e9prouv\u00e9es. Bien que l&rsquo;ensemble d&rsquo;outils <code>dplyr<\/code> puisse \u00eatre d\u00e9ploy\u00e9 de fa\u00e7on autonome, l&rsquo;importation de l&rsquo;int\u00e9gralit\u00e9 du m\u00e9tapackage <code>tidyverse<\/code> permet de mobiliser conjointement les biblioth\u00e8ques d&rsquo;entr\u00e9es-sorties, de mise en forme tabulaire et de manipulation textuelle. L&rsquo;installation s&rsquo;ex\u00e9cute \u00e0 l&rsquo;aide de l&rsquo;infrastructure de distribution logicielle du <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/\">Comprehensive R Archive Network (CRAN)<\/a>.<\/p>\n<p>La commande canonique d&rsquo;installation s&rsquo;\u00e9nonce comme suit au sein de la console R :<\/p>\n<p><code>install.packages(\"dplyr\")<\/code><\/p>\n<p>Une fois les binaires d\u00e9ploy\u00e9s sur le syst\u00e8me local, le chargement en m\u00e9moire vive s&rsquo;effectue via l&rsquo;instruction :<\/p>\n<p><code>library(dplyr)<\/code><\/p>\n<p>Lors de l&rsquo;attachement du package, l&rsquo;interpr\u00e9teur R affiche des notifications relatives au masquage potentiel de fonctions fondamentales. Les fonctions <code>filter()<\/code> et <code>lag()<\/code> issues du package natif <code>stats<\/code> sont syst\u00e9matiquement masqu\u00e9es par les verbes homonymes de <code>dplyr<\/code>. Pour pr\u00e9venir tout conflit d&rsquo;ex\u00e9cution au sein de scripts institutionnels p\u00e9rennes, le recours ponctuel \u00e0 l&rsquo;op\u00e9rateur de double deux-points, par exemple <code>dplyr::filter()<\/code> ou <code>dplyr::n_distinct()<\/code>, repr\u00e9sente une r\u00e8gle d&rsquo;ing\u00e9nierie logicielle d\u00e9fensive hautement recommand\u00e9e, \u00e9liminant toute ambigu\u00eft\u00e9 sur la provenance du symbole ex\u00e9cut\u00e9.<\/p>\n<h3>3.2 D\u00e9finition programmatique du jeu de donn\u00e9es de r\u00e9f\u00e9rence<\/h3>\n<p>Afin de contextualiser nos exp\u00e9rimentations sur une structure tabulaire standardis\u00e9e et imm\u00e9diatement appr\u00e9hendable, nous formulons un jeu de donn\u00e9es simulant les performances sportives de diff\u00e9rents comp\u00e9titeurs rattach\u00e9s \u00e0 des collectifs distincts. Ce sch\u00e9ma synth\u00e9tique concentre les principales difficult\u00e9s rencontr\u00e9es lors de l&rsquo;ingestion de donn\u00e9es r\u00e9elles : pr\u00e9sence de modalit\u00e9s textuelles r\u00e9p\u00e9t\u00e9es, duplications intentionnelles de valeurs num\u00e9riques discr\u00e8tes et possibilit\u00e9 de variations d&rsquo;h\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9 selon les strates d&rsquo;agr\u00e9gation.<\/p>\n<p>La construction de ce tableau de donn\u00e9es repose sur l&rsquo;instanciation d&rsquo;un objet de classe <code>data.frame<\/code>, converti si n\u00e9cessaire en <code>tibble<\/code> pour une inspection ergonomique :<\/p>\n<p><code>df_sports &lt;- data.frame(<br \/>\n&nbsp;&nbsp;team = c(\"A\", \"A\", \"A\", \"A\", \"B\", \"B\", \"B\", \"B\"),<br \/>\n&nbsp;&nbsp;points = c(10, 10, 12, 14, 20, 22, 25, 25),<br \/>\n&nbsp;&nbsp;assists = c(2, 4, 4, 5, 7, 7, 8, 9)<br \/>\n)<\/code><\/p>\n<p>La structure dimensionnelle de ce tableau comprend huit rang\u00e9es d&rsquo;observations et trois variables distinctes. L&rsquo;utilisation conjointe de la fonction d&rsquo;inspection <code>glimpse(df_sports)<\/code> permet de corroborer le typage scalaire des colonnes. La variable <code>team<\/code> est identifi\u00e9e sous la forme d&rsquo;un vecteur de cha\u00eenes de caract\u00e8res textuelles (type <code>character<\/code>), tandis que les variables <code>points<\/code> et <code>assists<\/code> rel\u00e8vent de la classe des r\u00e9els en virgule flottante double pr\u00e9cision (type <code>numeric<\/code> ou <code>double<\/code>). Ce tableau forme l&rsquo;assise exp\u00e9rimentale sur laquelle l&rsquo;ensemble de nos protocoles d&rsquo;investigation seront d\u00e9ploy\u00e9s.<\/p>\n<h3>3.3 Exploration descriptive et inspection visuelle pr\u00e9alable<\/h3>\n<p>Pr\u00e9alablement \u00e0 toute invocation des fonctions de comptage algorithmique, l&rsquo;analyste rigoureux proc\u00e8de \u00e0 un inventaire manuel des propri\u00e9t\u00e9s de cardinalit\u00e9 de son \u00e9chantillon, formalisant ainsi les attentes th\u00e9oriques permettant de contr\u00f4ler la validit\u00e9 des scripts. L&rsquo;observation directe de la colonne <code>team<\/code> r\u00e9v\u00e8le la r\u00e9currence de deux labels nominaux exclusifs : les symboles alphab\u00e9tiques \u00ab\u00a0A\u00a0\u00bb et \u00ab\u00a0B\u00a0\u00bb. Bien que la colonne s&rsquo;\u00e9tende sur huit lignes, sa cardinalit\u00e9 th\u00e9orique exacte s&rsquo;\u00e9tablit strictement \u00e0 la valeur 2.<\/p>\n<p>L&rsquo;examen de la dimension <code>points<\/code> met en lumi\u00e8re des \u00e9galit\u00e9s num\u00e9riques locales. Les deux premi\u00e8res observations du collectif \u00ab\u00a0A\u00a0\u00bb affichent un score identique de 10 points, tandis que les deux derni\u00e8res observations du collectif \u00ab\u00a0B\u00a0\u00bb partagent un score conjoint de 25 points. Les valeurs observables s&rsquo;ordonnent selon la suite {10, 12, 14, 20, 22, 25}. Par cons\u00e9quent, sur les huit \u00e9l\u00e9ments du vecteur, nous identifions pr\u00e9cis\u00e9ment 6 scores singuliers. La cardinalit\u00e9 th\u00e9orique de cette variable est donc de 6.<\/p>\n<p>Quant \u00e0 la variable <code>assists<\/code>, elle exhibe des r\u00e9p\u00e9titions distinctes des pr\u00e9c\u00e9dentes. La valeur 4 appara\u00eet deux fois pour l&rsquo;\u00e9quipe \u00ab\u00a0A\u00a0\u00bb, et la valeur 7 est relev\u00e9e \u00e0 deux reprises pour l&rsquo;\u00e9quipe \u00ab\u00a0B\u00a0\u00bb. La s\u00e9rie des valeurs uniques correspond \u00e0 l&rsquo;ensemble {2, 4, 5, 7, 8, 9}, totalisant \u00e9galement une cardinalit\u00e9 exacte de 6. Ces constats empiriques fournissent le socle de v\u00e9rit\u00e9 terrain indispensable \u00e0 la validation de nos impl\u00e9mentations programmatiques ult\u00e9rieures.<\/p>\n<h2>4. M\u00e9thode 1 : D\u00e9nombrement des valeurs distinctes dans une colonne sp\u00e9cifique<\/h2>\n<h3>4.1 Syntaxe directe par extraction vectorielle via l&rsquo;op\u00e9rateur dollar<\/h3>\n<p>La mani\u00e8re la plus imm\u00e9diate d&rsquo;interroger la cardinalit\u00e9 d&rsquo;un attribut r\u00e9side dans l&rsquo;application directe de <code>n_distinct()<\/code> sur un vecteur extrait de sa structure matricielle parente \u00e0 l&rsquo;aide de l&rsquo;op\u00e9rateur d&rsquo;indexation vectorielle <code>$<\/code>. Cette formulation isole la composante unidimensionnelle sans engager l&rsquo;infrastructure d&rsquo;\u00e9valuation contextuelle propre aux verbes de manipulation tabulaire, ce qui en fait un instrument de choix pour les routines de validation rapide ou les assertions unitaires.<\/p>\n<p>Pour mesurer la cardinalit\u00e9 de la variable <code>team<\/code>, l&rsquo;instruction s&rsquo;ex\u00e9cute ainsi :<\/p>\n<p><code>n_distinct(df_sports$team)<\/code><\/p>\n<p>L&rsquo;\u00e9valuation par le moteur R renvoie instantan\u00e9ment la valeur enti\u00e8re <code>[1] 2<\/code>. Le m\u00e9canisme sous-jacent op\u00e8re sans cr\u00e9er de copie superficielle de la matrice environnante : le pointeur m\u00e9moire associ\u00e9 au vecteur <code>team<\/code> est transmis directement au code C++ compil\u00e9 de <code>n_distinct()<\/code>, assurant une r\u00e9ponse computationnelle quasi instantan\u00e9e m\u00eame lorsque la table d&rsquo;origine renferme plusieurs dizaines de champs annexes.<\/p>\n<p>Ce paradigme vectoriel direct convient remarquablement bien \u00e0 l&rsquo;\u00e9criture de tests de coh\u00e9rence au sein de scripts de contr\u00f4le qualit\u00e9 pr\u00e9-analytiques, par exemple au moyen du package <code>testthat<\/code>. Un ing\u00e9nieur de donn\u00e9es peut ainsi formuler une assertion stipulant <code>stopifnot(n_distinct(df_sports$team) == 2)<\/code> afin d&rsquo;interrompre l&rsquo;ex\u00e9cution d&rsquo;un traitement si le sch\u00e9ma exp\u00e9rimental pr\u00e9sente un d\u00e9doublement anormal ou l&rsquo;introduction d&rsquo;un label erron\u00e9 lors de l&rsquo;acquisition des flux.<\/p>\n<h3>4.2 Int\u00e9gration au sein d&rsquo;une s\u00e9quence d&rsquo;instructions avec le pipe Tidyverse<\/h3>\n<p>Bien que l&rsquo;extraction par l&rsquo;op\u00e9rateur dollar s&rsquo;av\u00e8re efficace pour des diagnostics ad hoc, elle brise la continuit\u00e9 conceptuelle des pipelines analytiques. L&rsquo;approche idiomatique pr\u00e9conis\u00e9e par l&rsquo;\u00e9cosyst\u00e8me Tidyverse r\u00e9side dans l&rsquo;incorporation de <code>n_distinct()<\/code> \u00e0 l&rsquo;int\u00e9rieur du verbe d&rsquo;agr\u00e9gation <code>summarise()<\/code> (ou son \u00e9quivalent orthographique am\u00e9ricain <code>summarize()<\/code>), articul\u00e9 \u00e0 la source de donn\u00e9es par le biais d&rsquo;un op\u00e9rateur de cha\u00eenage s\u00e9quentiel.<\/p>\n<p>Dans la syntaxe classique reposant sur le pipe historique de <a rel=\"noopener noreferrer\" href=\"https:\/\/magrittr.tidyverse.org\/\">magrittr<\/a> (<code>%&gt;%<\/code>), la requ\u00eate se formule de la mani\u00e8re suivante :<\/p>\n<p><code>df_sports %&gt;%<br \/>\n&nbsp;&nbsp;summarise(equipes_distinctes = n_distinct(team))<\/code><\/p>\n<p>Depuis la publication de la version 4.1.0 du langage R, l&rsquo;op\u00e9rateur de cha\u00eenage natif <code>|&gt;<\/code> offre une alternative standardis\u00e9e int\u00e9gr\u00e9e au moteur lexical fondamental. L&rsquo;expression se transpose alors sans modification structurelle majeure :<\/p>\n<p><code>df_sports |&gt;<br \/>\n&nbsp;&nbsp;summarise(equipes_distinctes = n_distinct(team))<\/code><\/p>\n<p>\u00c0 la diff\u00e9rence de l&rsquo;extraction vectorielle qui restitue un scalaire d\u00e9contextualis\u00e9, l&rsquo;utilisation de <code>summarise()<\/code> engendre un nouvel objet rectangulaire de type <code>data.frame<\/code> ou <code>tibble<\/code> compos\u00e9 d&rsquo;une seule ligne et d&rsquo;une seule colonne explicitement nomm\u00e9e <code>equipes_distinctes<\/code>. Cette pr\u00e9servation de l&rsquo;architecture tabulaire pr\u00e9sente des vertus documentaires inestimables : la valeur calcul\u00e9e demeure assortie de ses m\u00e9tadonn\u00e9es descriptives, ce qui simplifie son exportation vers des bases de donn\u00e9es SQL ou sa transmission \u00e0 des moteurs de restitution graphique.<\/p>\n<h3>4.3 Analyse comparative sur variables num\u00e9riques et cat\u00e9gorielles<\/h3>\n<p>L&rsquo;application de la m\u00e9thode univari\u00e9e aux diff\u00e9rentes variables de notre jeu d&rsquo;essai illustre avec clart\u00e9 la mani\u00e8re dont <code>n_distinct()<\/code> assimile les divergences de typage scalaire. En soumettant la variable num\u00e9rique <code>points<\/code> au verbe d&rsquo;agr\u00e9gation :<\/p>\n<p><code>df_sports |&gt;<br \/>\n&nbsp;&nbsp;summarise(points_distincts = n_distinct(points))<\/code><\/p>\n<p>La console restitue une cardinalit\u00e9 de 6, confirmant scrupuleusement le d\u00e9compte manuel formul\u00e9 lors de notre phase d&rsquo;inspection pr\u00e9liminaire. Les deux scores r\u00e9currents (10 et 25) ont \u00e9t\u00e9 fusionn\u00e9s au sein du registre d&rsquo;unicit\u00e9. De fa\u00e7on analogue, le calcul ex\u00e9cut\u00e9 sur la variable <code>assists<\/code> retourne \u00e9galement la valeur 6, illustrant la neutralit\u00e9 de l&rsquo;algorithme face aux contextes s\u00e9mantiques distincts des variables quantitatives.<\/p>\n<p>Il importe toutefois de souligner une distinction technique majeure li\u00e9e \u00e0 la repr\u00e9sentation interne des nombres en virgule flottante double pr\u00e9cision (<code>double<\/code>) par rapport aux entiers rigoureux (<code>integer<\/code>). Lors de calculs scientifiques complexes, des impr\u00e9cisions d&rsquo;arrondi infinit\u00e9simales inh\u00e9rentes au standard IEEE 754 peuvent conduire deux valeurs th\u00e9oriquement identiques \u00e0 diff\u00e9rer d&rsquo;une fraction infinit\u00e9simale (de l&rsquo;ordre de 1e-16). Dans de telles circonstances, <code>n_distinct()<\/code>, op\u00e9rant par comparaison binaire stricte, comptabilisera ces observations comme des entit\u00e9s distinctes. Lorsque l&rsquo;analyste traite des grandeurs continues issues d&rsquo;int\u00e9grations num\u00e9riques, il convient de tronquer ou d&rsquo;arrondir explicitement la variable cible via la fonction <code>round()<\/code> avant d&rsquo;en calculer la cardinalit\u00e9 empirique.<\/p>\n<h2>5. M\u00e9thode 2 : D\u00e9nombrement syst\u00e9matique sur l&rsquo;ensemble des colonnes<\/h2>\n<h3>5.1 Approche fonctionnelle classique \u00e0 l&rsquo;aide de sapply()<\/h3>\n<p>Lors de la r\u00e9ception d&rsquo;une base de donn\u00e9es inconnue comportant un grand nombre de variables, l&rsquo;\u00e9valuation s\u00e9quentielle de chaque colonne par une commande manuelle devient rapidement fastidieuse et propice aux erreurs de transcription. Une d\u00e9marche diagnostique globale s&rsquo;impose alors pour caract\u00e9riser l&rsquo;ensemble des dimensions en un unique appel d&rsquo;instruction. La programmation fonctionnelle native de R apporte une r\u00e9ponse imm\u00e9diate gr\u00e2ce \u00e0 la famille des fonctions d&rsquo;application vectorielle, et singuli\u00e8rement la fonction <code>sapply()<\/code>.<\/p>\n<p>Consid\u00e9rant qu&rsquo;un objet de classe <code>data.frame<\/code> est conceptuellement une liste ordonn\u00e9e de vecteurs colonnes de longueur identique, l&rsquo;instruction <code>sapply()<\/code> traverse chaque \u00e9l\u00e9ment de cette liste pour lui appliquer uniform\u00e9ment une fonction pass\u00e9e en argument. La structure d\u00e9clarative compl\u00e8te s&rsquo;\u00e9nonce ainsi :<\/p>\n<p><code>sapply(df_sports, function(x) n_distinct(x))<\/code><\/p>\n<p>Cette expression peut faire l&rsquo;objet d&rsquo;une simplification syntaxique \u00e9l\u00e9gante par passage direct du symbole fonctionnel, exploitant le principe de la r\u00e9duction eta :<\/p>\n<p><code>sapply(df_sports, n_distinct)<\/code><\/p>\n<p>L&rsquo;ex\u00e9cution de cette directive produit en sortie un vecteur nomm\u00e9 contenant la cardinalit\u00e9 exacte de chacune des dimensions de la structure d&rsquo;entr\u00e9e :<\/p>\n<p><code>team&nbsp;&nbsp;points&nbsp;&nbsp;assists<br \/>\n&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6<\/code><\/p>\n<p>Ce vecteur synth\u00e9tique fournit un aper\u00e7u instantan\u00e9 de la topologie de l&rsquo;information. L&rsquo;analyste identifie imm\u00e9diatement que la premi\u00e8re colonne est de nature cat\u00e9gorielle restreinte, tandis que les deux dimensions suivantes manifestent une dispersion nettement sup\u00e9rieure, fournissant une premi\u00e8re boussole pour le partitionnement des analyses subs\u00e9quentes.<\/p>\n<h3>5.2 Variantes avec lapply() et vapply() pour une robustesse accrue<\/h3>\n<p>Bien que <code>sapply()<\/code> soit pl\u00e9biscit\u00e9e dans les sessions interactives pour sa propension \u00e0 simplifier automatiquement le format de sortie, cette flexibilit\u00e9 comportementale constitue une vuln\u00e9rabilit\u00e9 reconnue dans le cadre d&rsquo;applications automatis\u00e9es d\u00e9ploy\u00e9es en environnement de production. En effet, si le tableau d&rsquo;entr\u00e9e venait \u00e0 \u00eatre vide ou \u00e0 pr\u00e9senter des attributs non conformes, la sortie de <code>sapply()<\/code> pourrait commuter de fa\u00e7on impr\u00e9visible entre un vecteur, une matrice ou une liste vide, provoquant l&rsquo;interruption en cascade des modules d\u00e9pendants.<\/p>\n<p>Pour rem\u00e9dier \u00e0 cette incertitude, le recours \u00e0 la fonction <code>vapply()<\/code> incarne la norme d&rsquo;excellence en programmation d\u00e9fensive sous R. Cette fonction impose la sp\u00e9cification formelle de la signature du type de retour attendu pour chaque it\u00e9ration gr\u00e2ce \u00e0 son troisi\u00e8me argument <code>FUN.VALUE<\/code>. L&rsquo;instruction s&rsquo;\u00e9crit de la mani\u00e8re suivante :<\/p>\n<p><code>vapply(df_sports, n_distinct, integer(1))<\/code><\/p>\n<p>Par cette formulation explicite, le d\u00e9veloppeur certifie \u00e0 l&rsquo;interpr\u00e9teur que chaque \u00e9valuation univari\u00e9e de <code>n_distinct()<\/code> doit obligatoirement produire un vecteur d&rsquo;entiers d&rsquo;une longueur scalaire \u00e9gale \u00e0 1. Si une anomalie de typage survient au cours de l&rsquo;it\u00e9ration, l&rsquo;ex\u00e9cution s&rsquo;interrompt imm\u00e9diatement par un message d&rsquo;erreur document\u00e9, garantissant l&rsquo;int\u00e9grit\u00e9 absolue des flux en aval.<\/p>\n<p>D&rsquo;un autre point de vue m\u00e9thodologique, l&rsquo;usage de <code>lapply(df_sports, n_distinct)<\/code> pr\u00e9serve la nature de conteneur en retournant syst\u00e9matiquement une liste d&rsquo;\u00e9l\u00e9ments \u00e9tiquet\u00e9s. Cette variante se r\u00e9v\u00e8le particuli\u00e8rement appropri\u00e9e lorsque le script analytique pr\u00e9voit d&rsquo;injecter subs\u00e9quemment les r\u00e9sultats de cardinalit\u00e9 au sein de pipelines de transformation it\u00e9rative articul\u00e9s autour des fonctionnalit\u00e9s du package <a rel=\"noopener noreferrer\" href=\"https:\/\/purrr.tidyverse.org\/\">purrr<\/a>.<\/p>\n<h3>5.3 G\u00e9n\u00e9ration d&rsquo;un tableau r\u00e9capitulatif de cardinalit\u00e9 globale<\/h3>\n<p>Pour finaliser l&rsquo;audit structurel d&rsquo;un jeu d&rsquo;observations et formaliser les r\u00e9sultats dans un livrable de synth\u00e8se directement int\u00e9grable \u00e0 un rapport de recherche reproductible sous Quarto ou R Markdown, il est opportun de convertir le r\u00e9sultat d&rsquo;application vectorielle en un tableau de bord rectangulaire enrichi d&rsquo;indicateurs de dispersion relative.<\/p>\n<p>L&rsquo;encha\u00eenement d&rsquo;instructions suivant orchestre cette transformation en cr\u00e9ant un <code>tibble<\/code> structur\u00e9 :<\/p>\n<p><code>cardinalite_synthese &lt;- data.frame(<br \/>\n&nbsp;&nbsp;variable = names(df_sports),<br \/>\n&nbsp;&nbsp;nb_distinct = vapply(df_sports, n_distinct, integer(1)),<br \/>\n&nbsp;&nbsp;nb_total = nrow(df_sports)<br \/>\n) |&gt;<br \/>\n&nbsp;&nbsp;mutate(ratio_unicite = nb_distinct \/ nb_total)<\/code><\/p>\n<p>L&rsquo;inspection du tableau r\u00e9sultant r\u00e9v\u00e8le une perspective analytique d\u00e9cisive gr\u00e2ce au m\u00e9trique <code>ratio_unicite<\/code> :<\/p>\n<p><code>&nbsp;&nbsp;variable nb_distinct nb_total ratio_unicite<br \/>\n1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;team&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.250<br \/>\n2&nbsp;&nbsp;&nbsp;points&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.750<br \/>\n3&nbsp;&nbsp;assists&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0.750<\/code><\/p>\n<p>La m\u00e9trique <code>ratio_unicite<\/code> normalise le nombre de modalit\u00e9s singuli\u00e8res par le volume global des lignes enregistr\u00e9es, \u00e9tablissant un indice born\u00e9 sur l&rsquo;intervalle semi-ouvert ]0, 1]. Un ratio approchant de z\u00e9ro signale une concentration morphologique extr\u00eame, propice aux regroupements cat\u00e9goriels ou aux analyses de variance. Inversement, un ratio proche de l&rsquo;unit\u00e9 alerte sur une quasi-singularit\u00e9 des donn\u00e9es, excluant d&#8217;embl\u00e9e l&rsquo;utilisation directe de ces colonnes comme facteurs de stratification au sein d&rsquo;arbres de d\u00e9cision ou de r\u00e9gressions logistiques.<\/p>\n<h2>6. M\u00e9thode 3 : Calcul conditionnel et d\u00e9nombrement distinct par groupe<\/h2>\n<h3>6.1 Agr\u00e9gation partitionn\u00e9e avec group_by() et summarize()<\/h3>\n<p>L&rsquo;une des manifestations les plus \u00e9clatantes de la puissance conceptuelle de <strong>dplyr<\/strong> r\u00e9side dans l&rsquo;application transparente du paradigme m\u00e9thodologique \u00ab Scinder-Appliquer-Combiner \u00bb (<a rel=\"noopener noreferrer\" href=\"https:\/\/www.jstatsoft.org\/article\/view\/v040i01\">Split-Apply-Combine<\/a>), th\u00e9oris\u00e9 par Hadley Wickham. Ce principe consiste \u00e0 partitionner un jeu de donn\u00e9es complexe en sous-ensembles homog\u00e8nes selon les modalit\u00e9s d&rsquo;une variable de stratification, d&rsquo;ex\u00e9cuter de fa\u00e7on autonome des fonctions statistiques sur chacun de ces fragments, puis de fusionner les synth\u00e8ses calcul\u00e9es dans un tableau unifi\u00e9 unique.<\/p>\n<p>L&rsquo;op\u00e9ration conjointe de <code>group_by()<\/code> et <code>summarise()<\/code> r\u00e9alise cette man\u0153uvre avec une fluidit\u00e9 syntaxique remarquable pour \u00e9valuer le comportement intra-groupe de la cardinalit\u00e9. Si l&rsquo;on souhaite quantifier le nombre distinct de points enregistr\u00e9s s\u00e9par\u00e9ment au sein de chaque collectif sportif, l&rsquo;expression s&rsquo;\u00e9nonce comme suit :<\/p>\n<p><code>df_sports |&gt;<br \/>\n&nbsp;&nbsp;group_by(team) |&gt;<br \/>\n&nbsp;&nbsp;summarise(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;points_distincts = n_distinct(points),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;.groups = \"drop\"<br \/>\n&nbsp;&nbsp;)<\/code><\/p>\n<p>L&rsquo;\u00e9valuation produit la table de contingence agr\u00e9g\u00e9e suivante :<\/p>\n<p><code># A tibble: 2 x 2<br \/>\n&nbsp;&nbsp;team&nbsp;&nbsp;points_distincts<br \/>\n&nbsp;&nbsp;&lt;chr&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;int&gt;<br \/>\n1 A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3<br \/>\n2 B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3<\/code><\/p>\n<p>L&rsquo;analyse de ce r\u00e9sultat confirme que l&rsquo;\u00e9quipe \u00ab\u00a0A\u00a0\u00bb, bien que cumulant quatre occurrences globales, ne totalise que 3 scores de points uniques (10, 12 et 14, la valeur 10 apparaissant \u00e0 deux reprises). De m\u00eame, l&rsquo;\u00e9quipe \u00ab\u00a0B\u00a0\u00bb compile pr\u00e9cis\u00e9ment 3 r\u00e9alisations distinctes (20, 22 et 25). L&rsquo;adjonction syst\u00e9matique du param\u00e8tre <code>.groups = \"drop\"<\/code> repr\u00e9sente une bonne pratique d\u00e9terminante : elle neutralise le statut de regroupement r\u00e9siduel de la structure r\u00e9sultante, pr\u00e9munissant l&rsquo;analyste contre des effets de bord involontaires lors des manipulations ult\u00e9rieures de la table.<\/p>\n<h3>6.2 Agr\u00e9gations multivari\u00e9es et indicateurs multiples par modalit\u00e9<\/h3>\n<p>La statistique inf\u00e9rentielle et l&rsquo;analyse exploratoire exigent rarement l&rsquo;\u00e9valuation isol\u00e9e d&rsquo;un indice unique. L&rsquo;int\u00e9r\u00eat m\u00e9thodologique du verbe <code>summarise()<\/code> s&rsquo;exprime pleinement dans sa capacit\u00e9 \u00e0 orchestrer de front des batteries d&rsquo;indicateurs h\u00e9t\u00e9rog\u00e8nes appliqu\u00e9s simultan\u00e9ment \u00e0 de multiples colonnes au sein des strates configur\u00e9es.<\/p>\n<p>Il est particuli\u00e8rement instructif de confronter, au sein d&rsquo;une m\u00eame commande de synth\u00e8se, l&rsquo;effectif total d&rsquo;occurrences fourni par la fonction <code>n()<\/code> avec la cardinalit\u00e9 effective issue de <code>n_distinct()<\/code>, tout en observant en parall\u00e8le les variations survenant sur une variable auxiliaire telle que <code>assists<\/code> :<\/p>\n<p><code>synthese_multivariee &lt;- df_sports |&gt;<br \/>\n&nbsp;&nbsp;group_by(team) |&gt;<br \/>\n&nbsp;&nbsp;summarise(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;effectif_total = n(),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;pts_distincts = n_distinct(points),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;ast_distincts = n_distinct(assists),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;.groups = \"drop\"<br \/>\n&nbsp;&nbsp;)<\/code><\/p>\n<p>L&rsquo;ex\u00e9cution de cet agencement produit un profil descriptif multivari\u00e9 structur\u00e9 :<\/p>\n<p><code># A tibble: 2 x 4<br \/>\n&nbsp;&nbsp;team&nbsp;&nbsp;effectif_total pts_distincts ast_distincts<br \/>\n&nbsp;&nbsp;&lt;chr&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;int&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;int&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;int&gt;<br \/>\n1 A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3<br \/>\n2 B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3<\/code><\/p>\n<p>Ce comparatif met en \u00e9vidence une parfaite sym\u00e9trie morphologique entre les deux sous-populations \u00e9tudi\u00e9es. Chaque strate r\u00e9unit quatre observations individuelles tout en maintenant une r\u00e9duction de dispersion \u00e9quivalente (exactement 3 modalit\u00e9s uniques sur chaque indicateur de performance). Cette confrontation entre le volume global et le volume singularis\u00e9 est indispensable pour \u00e9valuer l&rsquo;h\u00e9t\u00e9rog\u00e9n\u00e9it\u00e9 des mesures au sein de dispositifs exp\u00e9rimentaux stratifi\u00e9s.<\/p>\n<h3>6.3 Regroupement hi\u00e9rarchique sur plusieurs variables de stratification<\/h3>\n<p>Dans de nombreuses situations empiriques, les donn\u00e9es s&rsquo;inscrivent au sein d&rsquo;architectures multiniveaux impliquant plusieurs variables de classification embo\u00eet\u00e9es ou crois\u00e9es. L&rsquo;op\u00e9rateur <code>group_by()<\/code> accepte une liste \u00e9tendue de symboles, configurant une combinatoire de sous-groupes selon le produit cart\u00e9sien des modalit\u00e9s de chaque variable de stratification.<\/p>\n<p>Afin de visualiser la dynamique d&rsquo;une stratification factorielle crois\u00e9e, simulons l&rsquo;adjonction d&rsquo;une dimension temporelle relative \u00e0 la p\u00e9riode d&rsquo;enregistrement (variable <code>period<\/code> prenant les valeurs \u00ab\u00a0P1\u00a0\u00bb et \u00ab\u00a0P2\u00a0\u00bb) au sein de notre structure d&rsquo;essai :<\/p>\n<p><code>df_temporel &lt;- df_sports |&gt;<br \/>\n&nbsp;&nbsp;mutate(period = c(\"P1\", \"P1\", \"P2\", \"P2\", \"P1\", \"P1\", \"P2\", \"P2\"))<\/code><\/p>\n<p>L&rsquo;\u00e9valuation partitionn\u00e9e de la cardinalit\u00e9 de <code>points<\/code> selon les deux facteurs combin\u00e9s <code>team<\/code> et <code>period<\/code> se formalise alors ainsi :<\/p>\n<p><code>df_temporel |&gt;<br \/>\n&nbsp;&nbsp;group_by(team, period) |&gt;<br \/>\n&nbsp;&nbsp;summarise(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;points_distincts = n_distinct(points),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;observations = n(),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;.groups = \"drop\"<br \/>\n&nbsp;&nbsp;)<\/code><\/p>\n<p>L&rsquo;ex\u00e9cution restitue le d\u00e9tail de chaque cellule exp\u00e9rimentale :<\/p>\n<p><code># A tibble: 4 x 4<br \/>\n&nbsp;&nbsp;team&nbsp;&nbsp;period points_distincts observations<br \/>\n&nbsp;&nbsp;&lt;chr&gt; &lt;chr&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;int&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;int&gt;<br \/>\n1 A&nbsp;&nbsp;&nbsp;&nbsp; P1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<br \/>\n2 A&nbsp;&nbsp;&nbsp;&nbsp; P2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<br \/>\n3 B&nbsp;&nbsp;&nbsp;&nbsp; P1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<br \/>\n4 B&nbsp;&nbsp;&nbsp;&nbsp; P2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2<\/code><\/p>\n<p>Cette d\u00e9composition hi\u00e9rarchique d\u00e9voile des singularit\u00e9s invisibles lors des agr\u00e9gations de niveau sup\u00e9rieur. Pour le collectif \u00ab\u00a0A\u00a0\u00bb durant la p\u00e9riode \u00ab\u00a0P1\u00a0\u00bb, les deux observations partagent rigoureusement le m\u00eame score (cardinalit\u00e9 unitaire pour deux lignes observ\u00e9es), traduisant une invariance locale absolue. \u00c0 l&rsquo;inverse, durant la p\u00e9riode \u00ab\u00a0P2\u00a0\u00bb, les deux observations se d\u00e9marquent int\u00e9gralement (cardinalit\u00e9 de 2 pour deux lignes). La granularit\u00e9 fine offerte par le groupement multivari\u00e9 s&rsquo;av\u00e8re donc essentielle pour cartographier pr\u00e9cis\u00e9ment la variabilit\u00e9 locale au sein des plans d&rsquo;exp\u00e9riences complexes.<\/p>\n<h2>7. Modernisation du code : int\u00e9gration avanc\u00e9e de across() avec n_distinct()<\/h2>\n<h3>7.1 Transition des fonctions scoped (summarise_all, summarise_at) vers across()<\/h3>\n<p>L&rsquo;\u00e9volution chronologique du package <strong>dplyr<\/strong> a \u00e9t\u00e9 marqu\u00e9e par une qu\u00eate constante de concision sans compromettre l&rsquo;expressivit\u00e9 conceptuelle. Dans les versions ant\u00e9rieures \u00e0 l&rsquo;it\u00e9ration majeure 1.0.0, l&rsquo;application it\u00e9rative d&rsquo;une fonction \u00e0 de multiples colonnes n\u00e9cessitait l&#8217;emploi d&rsquo;une famille \u00e9tendue de verbes dits contextuels ou \u00ab scoped \u00bb : <code>summarise_all()<\/code> pour l&rsquo;int\u00e9gralit\u00e9 des colonnes, <code>summarise_at()<\/code> pour un vecteur d\u00e9sign\u00e9 de variables, et <code>summarise_if()<\/code> pour les colonnes r\u00e9pondant \u00e0 un pr\u00e9dicat logique.<\/p>\n<p>Bien que fonctionnelles, ces fonctions multipliaient de mani\u00e8re excessive le vocabulaire de l&rsquo;interface et souffraient d&rsquo;un manque criant de modularit\u00e9 lorsqu&rsquo;il s&rsquo;agissait de combiner plusieurs op\u00e9rations h\u00e9t\u00e9rog\u00e8nes au sein d&rsquo;un verbe unique. Pour r\u00e9soudre cette dispersion syntaxique, les concepteurs de <strong>dplyr<\/strong> ont d\u00e9pr\u00e9ci\u00e9 ces suffixes sp\u00e9cialis\u00e9s au profit d&rsquo;un op\u00e9rateur universel d&rsquo;une flexibilit\u00e9 sup\u00e9rieure : la fonction <code>across()<\/code>.<\/p>\n<p>D\u00e9sormais, <code>across()<\/code> s&rsquo;instancie directement \u00e0 l&rsquo;int\u00e9rieur des verbes conventionnels comme <code>summarise()<\/code> ou <code>mutate()<\/code>, encapsulant deux param\u00e8tres primordiaux : un s\u00e9lecteur de colonnes s&rsquo;appuyant sur la grammaire \u00e9tendue du package <a rel=\"noopener noreferrer\" href=\"https:\/\/tidyselect.r-lib.org\/\">tidyselect<\/a>, et la ou les fonctions statistiques \u00e0 ex\u00e9cuter. Pour transposer l&rsquo;\u00e9valuation de cardinalit\u00e9 sur l&rsquo;int\u00e9gralit\u00e9 du jeu de donn\u00e9es dans la syntaxe contemporaine, l&rsquo;\u00e9criture se formalise ainsi :<\/p>\n<p><code>df_sports |&gt;<br \/>\n&nbsp;&nbsp;summarise(across(everything(), n_distinct))<\/code><\/p>\n<p>Cette formulation produit un tibble d&rsquo;une seule rang\u00e9e contenant le d\u00e9compte unitaire de chaque dimension, alliant la clart\u00e9 d\u00e9clarative du Tidyverse \u00e0 la robustesse d&rsquo;un calcul optimis\u00e9 sous le capot.<\/p>\n<h3>7.2 Application cibl\u00e9e \u00e0 des sous-ensembles de variables selon leur type<\/h3>\n<p>La puissance intrins\u00e8que de <code>across()<\/code> \u00e9clate v\u00e9ritablement lors de son couplage avec les s\u00e9lecteurs conditionnels dynamiques de <code>tidyselect<\/code>. Dans le cadre d&rsquo;audits conduits sur des tables riches en m\u00e9tadonn\u00e9es textuelles et en m\u00e9triques continues, l&rsquo;analyste peut souhaiter restreindre le calcul de cardinalit\u00e9 aux seules dimensions quantitatives, ou cibler sp\u00e9cifiquement un faisceau lexical pr\u00e9cis d\u00e9termin\u00e9 par les conventions de nommage du dictionnaire des variables.<\/p>\n<p>La s\u00e9lection bas\u00e9e sur un pr\u00e9dicat de typage s&rsquo;op\u00e8re par l&rsquo;interm\u00e9diaire de l&rsquo;op\u00e9rateur auxiliaire <code>where()<\/code>. Si l&rsquo;on souhaite quantifier la cardinalit\u00e9 exclusivement sur les dimensions continues de notre jeu d&rsquo;essai, le script se r\u00e9dige ainsi :<\/p>\n<p><code>df_sports |&gt;<br \/>\n&nbsp;&nbsp;summarise(across(where(is.numeric), n_distinct))<\/code><\/p>\n<p>Le moteur d&rsquo;\u00e9valuation inspecte au pr\u00e9alable la nature intrins\u00e8que de chaque vecteur : la colonne textuelle <code>team<\/code> est ignor\u00e9e en amont sans g\u00e9n\u00e9rer d&rsquo;avertissement superflu, et le calcul se concentre strictement sur <code>points<\/code> et <code>assists<\/code>.<\/p>\n<p>Parall\u00e8lement, la s\u00e9lection par motifs textuels offre une granularit\u00e9 op\u00e9rationnelle pr\u00e9cieuse pour traiter des questionnaires psychom\u00e9triques structur\u00e9s o\u00f9 les libell\u00e9s de variables partagent un radical commun. Des instructions s&rsquo;appuyant sur des s\u00e9lecteurs comme <code>starts_with(\"item_\")<\/code>, <code>ends_with(\"_score\")<\/code> ou des expressions r\u00e9guli\u00e8res compil\u00e9es via <code>matches(\"^(pts|ast)\")<\/code> permettent de focaliser instantan\u00e9ment l&rsquo;algorithme <code>n_distinct()<\/code> sur les seuls indicateurs d&rsquo;int\u00e9r\u00eat au sein de gigantesques bases de donn\u00e9es multidimensionnelles.<\/p>\n<h3>7.3 D\u00e9ploiement conjoint du regroupement et de across()<\/h3>\n<p>L&rsquo;articulation la plus sophistiqu\u00e9e de la manipulation de donn\u00e9es moderne consiste \u00e0 fusionner la puissance de la stratification factorielle garantie par <code>group_by()<\/code> avec la compacit\u00e9 de balayage offerte par le couple <code>across()<\/code> et <code>n_distinct()<\/code>. Cette alliance permet d&rsquo;\u00e9tablir en une seule ligne de code un diagnostic structurel complet de l&rsquo;ensemble des dimensions de la table selon chaque modalit\u00e9 d&rsquo;un groupe de r\u00e9f\u00e9rence.<\/p>\n<p>Pour auditer l&rsquo;int\u00e9gralit\u00e9 des variables num\u00e9riques r\u00e9siduelles au sein de chaque collectif sportif tout en contr\u00f4lant la nomenclature explicite des colonnes d\u00e9riv\u00e9es, nous d\u00e9ployons la syntaxe suivante :<\/p>\n<p><code>df_sports |&gt;<br \/>\n&nbsp;&nbsp;group_by(team) |&gt;<br \/>\n&nbsp;&nbsp;summarise(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;across(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;where(is.numeric),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;n_distinct,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.names = \"cardinalite_{.col}\"<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;.groups = \"drop\"<br \/>\n&nbsp;&nbsp;)<\/code><\/p>\n<p>L&rsquo;utilisation judicieuse de l&rsquo;argument d&rsquo;interpolation textuelle <code>.names = \"cardinalite_{.col}\"<\/code> garantit que les nouvelles colonnes g\u00e9n\u00e9r\u00e9es adopteront un libell\u00e9 parfaitement univoque, pr\u00e9venant toute collision d&rsquo;identifiants avec les donn\u00e9es sources :<\/p>\n<p><code># A tibble: 2 x 3<br \/>\n&nbsp;&nbsp;team&nbsp;&nbsp;cardinalite_points cardinalite_assists<br \/>\n&nbsp;&nbsp;&lt;chr&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;int&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;int&gt;<br \/>\n1 A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3<br \/>\n2 B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3<\/code><\/p>\n<p>Ce r\u00e9sultat illustre l&rsquo;aboutissement de la grammaire moderne de manipulation sous R : une expressivit\u00e9 analytique absolue condens\u00e9e dans une architecture d&rsquo;une \u00e9l\u00e9gance formelle irr\u00e9prochable, assurant une parfaite reproductibilit\u00e9 sur des ensembles de donn\u00e9es de plusieurs centaines de dimensions.<\/p>\n<h2>8. Gestion rigoureuse des valeurs manquantes et des cas particuliers<\/h2>\n<h3>8.1 Comportement de n_distinct() face aux valeurs manquantes (NA)<\/h3>\n<p>L&rsquo;un des d\u00e9fis les plus constants lors du traitement de donn\u00e9es empiriques r\u00e9side dans la gestion des donn\u00e9es incompl\u00e8tes ou manquantes, symbolis\u00e9es sous le langage R par la constante logique <code>NA<\/code> (Not Available). L&rsquo;analyste doit imp\u00e9rativement ma\u00eetriser la s\u00e9mantique computationnelle adopt\u00e9e par <code>n_distinct()<\/code> face \u00e0 ces \u00e9l\u00e9ments, sous peine de fausser substantiellement l&rsquo;\u00e9valuation de la cardinalit\u00e9 de ses variables.<\/p>\n<p>Par d\u00e9faut, l&rsquo;argument formel <code>na.rm<\/code> est param\u00e9tr\u00e9 sur <code>FALSE<\/code>. Conform\u00e9ment aux principes de la logique tri-valu\u00e9e, <code>n_distinct()<\/code> consid\u00e8re par d\u00e9faut qu&rsquo;une valeur manquante repr\u00e9sente une modalit\u00e9 d&rsquo;observation singuli\u00e8re \u00e0 part enti\u00e8re. D\u00e8s lors, si un vecteur comporte des observations num\u00e9riques ainsi qu&rsquo;au moins une occurrence de <code>NA<\/code>, cette derni\u00e8re incr\u00e9mentera le registre d&rsquo;unicit\u00e9 d&rsquo;une unit\u00e9 enti\u00e8re.<\/p>\n<p>Pour illustrer empiriquement cette dynamique et mesurer ses r\u00e9percussions, injectons d\u00e9lib\u00e9r\u00e9ment une valeur manquante au sein du vecteur <code>points<\/code> de notre jeu d&rsquo;essai :<\/p>\n<p><code>df_lacunaire &lt;- df_sports<br \/>\ndf_lacunaire$points[1] &lt;- NA<\/code><\/p>\n<p>Proc\u00e9dons alors \u00e0 la confrontation directe des deux modes d&rsquo;\u00e9valuation :<\/p>\n<p><code>card_avec_na &lt;- n_distinct(df_lacunaire$points, na.rm = FALSE)<br \/>\ncard_sans_na &lt;- n_distinct(df_lacunaire$points, na.rm = TRUE)<\/code><\/p>\n<p>L&rsquo;inspection des objets scalaires ainsi cr\u00e9\u00e9s r\u00e9v\u00e8le que <code>card_avec_na<\/code> renvoie la valeur 6 (comprenant les valeurs 10, 12, 14, 20, 22, 25 et le marqueur <code>NA<\/code>, sachant que l&rsquo;une des deux occurrences initiales de 10 a \u00e9t\u00e9 \u00e9cras\u00e9e), tandis que <code>card_sans_na<\/code> renvoie la valeur 5. L&rsquo;omission de la directive <code>na.rm = TRUE<\/code> dans un rapport de fouille de donn\u00e9es peut donc introduire un biais syst\u00e9matique de sur-d\u00e9nombrement, particuli\u00e8rement pernicieux lorsque la pr\u00e9sence de valeurs manquantes proc\u00e8de d&rsquo;un m\u00e9canisme d&rsquo;attrition non al\u00e9atoire.<\/p>\n<h3>8.2 Gestion des vecteurs vides, des listes et des types particuliers<\/h3>\n<p>La robustesse d&rsquo;un algorithme de comptage se mesure \u00e9galement \u00e0 sa capacit\u00e9 \u00e0 g\u00e9rer de fa\u00e7on pr\u00e9visible les cas limites, tels que les structures d\u00e9g\u00e9n\u00e9r\u00e9es ou les types scalaires complexes. Face \u00e0 un vecteur atomique rigoureusement vide, par exemple un vecteur num\u00e9rique initialis\u00e9 sans observation via <code>numeric(0)<\/code> ou une entit\u00e9 non allou\u00e9e <code>NULL<\/code>, <code>n_distinct()<\/code> renvoie fid\u00e8lement la valeur scalaire enti\u00e8re <code>0<\/code>, sans d\u00e9clencher d&rsquo;exception logicielle bloquante, l\u00e0 o\u00f9 des compositions personnalis\u00e9es bas\u00e9es sur <code>unique()<\/code> peuvent parfois g\u00e9n\u00e9rer des retours ind\u00e9termin\u00e9s.<\/p>\n<p>En ce qui concerne les structures temporelles hautement typ\u00e9es, telles que les objets de classe chronologique <code>Date<\/code> ou les estampilles temporelles haute pr\u00e9cision <code>POSIXct<\/code>, <code>n_distinct()<\/code> pr\u00e9serve rigoureusement la m\u00e9trique sous-jacente. L&rsquo;algorithme se fonde sur la repr\u00e9sentation interne de l&rsquo;horodatage (nombre de secondes \u00e9coul\u00e9es depuis le temps d&rsquo;origine ou \u00e9poque POSIX) pour d\u00e9terminer l&rsquo;\u00e9galit\u00e9 stricte des \u00e9v\u00e9nements, \u00e9liminant les al\u00e9as d&rsquo;affichage textuel induits par les fuseaux horaires locaux.<\/p>\n<p>Une attention m\u00e9thodologique scrupuleuse doit cependant \u00eatre accord\u00e9e aux variables cat\u00e9gorielles encod\u00e9es sous forme de facteurs ordonn\u00e9s ou non (classe <code>factor<\/code>). Les facteurs sous R poss\u00e8dent un attribut technique d\u00e9finissant leurs niveaux autoris\u00e9s (les <code>levels<\/code>). Or, lorsqu&rsquo;un tableau de donn\u00e9es est filtr\u00e9 ou amput\u00e9 de certaines observations, certains niveaux d&rsquo;un facteur peuvent ne plus compter aucun repr\u00e9sentant effectif dans les donn\u00e9es actives : on parle alors de niveaux inutilis\u00e9s (\u00ab unused levels \u00bb). Contrairement \u00e0 des fonctions sommaires qui inspectent uniquement les m\u00e9tadonn\u00e9es du dictionnaire des niveaux, <code>n_distinct()<\/code> explore la distribution empirique r\u00e9elle des donn\u00e9es et ne comptabilise que les modalit\u00e9s concr\u00e8tement observ\u00e9es, assurant une parfaite sinc\u00e9rit\u00e9 statistique du calcul de cardinalit\u00e9.<\/p>\n<h3>8.3 Calcul de la cardinalit\u00e9 conjointe sur plusieurs colonnes<\/h3>\n<p>Dans de nombreuses probl\u00e9matiques d&rsquo;architecture de donn\u00e9es, la cardinalit\u00e9 univari\u00e9e s&rsquo;av\u00e8re insuffisante pour cerner l&rsquo;unicit\u00e9 des enregistrements. L&rsquo;ing\u00e9nieur doit fr\u00e9quemment d\u00e9terminer si la conjonction de deux ou plusieurs attributs permet d&rsquo;isoler des unit\u00e9s statistiques sans \u00e9quivoque, ce qui correspond formellement \u00e0 la d\u00e9tection de cl\u00e9s composites candidates au sein d&rsquo;une relation tabulaire.<\/p>\n<p>Gr\u00e2ce \u00e0 la prise en charge des ellipses d&rsquo;arguments au sein de sa signature, <code>n_distinct()<\/code> permet d&rsquo;\u00e9valuer simultan\u00e9ment un n-uplet de variables, r\u00e9alisant le calcul de la cardinalit\u00e9 de leur produit sans contraindre le statisticien \u00e0 une concat\u00e9nation manuelle par collage textuel (qui serait consommatrice de cycles processeur et vuln\u00e9rable aux collisions de cha\u00eenes). L&rsquo;analyse combin\u00e9e des dimensions <code>team<\/code> et <code>points<\/code> s&rsquo;ex\u00e9cute ainsi :<\/p>\n<p><code>df_sports |&gt;<br \/>\n&nbsp;&nbsp;summarise(combinaisons_uniques = n_distinct(team, points))<\/code><\/p>\n<p>Le r\u00e9sultat produit la valeur scalaire 6. Il est primordial de souligner la disjonction math\u00e9matique fondamentale entre la somme des cardinalit\u00e9s individuelles et la cardinalit\u00e9 conjointe de leur union multidimensionnelle. Alors que la somme arithm\u00e9tique s\u00e9par\u00e9e des cardinalit\u00e9s produit <code>2 + 6 = 8<\/code>, la cardinalit\u00e9 conjointe ne s&rsquo;\u00e9l\u00e8ve qu&rsquo;\u00e0 6. Cette divergence quantifie directement le degr\u00e9 de covariance ou de d\u00e9pendance structurelle existant entre les dimensions examin\u00e9es : deux scores n&rsquo;apparaissant que dans une seule et unique \u00e9quipe, la combinaison <code>(team, points)<\/code> ne g\u00e9n\u00e8re aucun d\u00e9doublement crois\u00e9 suppl\u00e9mentaire au-del\u00e0 des valeurs propres observ\u00e9es.<\/p>\n<h2>9. Comparatif m\u00e9thodologique et benchmark de performance computationnelle<\/h2>\n<h3>9.1 dplyr::n_distinct() face aux solutions de base R<\/h3>\n<p>L&rsquo;adoption pr\u00e9f\u00e9rentielle d&rsquo;un verbe sp\u00e9cialis\u00e9 au d\u00e9triment des idiomes traditionnels du langage h\u00f4te doit \u00eatre justifi\u00e9e par un examen objectif de son efficience computationnelle et de sa consommation d&rsquo;infrastructure m\u00e9moire. Dans l&rsquo;\u00e9cosyst\u00e8me R canonique, l&rsquo;\u00e9valuation de cardinalit\u00e9 s&rsquo;op\u00e8re usuellement par la formulation <code>length(unique(x))<\/code>, ou par l&rsquo;instruction matricielle <code>nrow(unique(df))<\/code> pour des structures multidimensionnelles.<\/p>\n<p>Pour mesurer rigoureusement l&rsquo;\u00e9cart de performance entre ces deux approches, nous sollicitons le package d&rsquo;\u00e9talonnage nanom\u00e9trique <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=microbenchmark\">microbenchmark<\/a> sur un vecteur num\u00e9rique massif simulant 10 millions d&rsquo;observations continues comportant une proportion contr\u00f4l\u00e9e de r\u00e9p\u00e9titions :<\/p>\n<p><code>library(microbenchmark)<\/p>\n<p>set.seed(42)<br \/>\nvecteur_massif &lt;- sample(1:500000, size = 1e7, replace = TRUE)<\/p>\n<p>resultat_benchmark &lt;- microbenchmark(<br \/>\n&nbsp;&nbsp;base_r = length(unique(vecteur_massif)),<br \/>\n&nbsp;&nbsp;dplyr_opt = n_distinct(vecteur_massif),<br \/>\n&nbsp;&nbsp;times = 20<br \/>\n)<\/code><\/p>\n<p>L&rsquo;analyse des profils temporels met en \u00e9vidence une sup\u00e9riorit\u00e9 substantielle de l&rsquo;impl\u00e9mentation <code>dplyr::n_distinct()<\/code>. En moyenne, l&rsquo;algorithme C++ de <code>n_distinct()<\/code> r\u00e9alise l&rsquo;\u00e9valuation de cardinalit\u00e9 deux \u00e0 trois fois plus rapidement que la composition de base R. Cette divergence s&rsquo;explique par la m\u00e9canique interne de la fonction : <code>unique()<\/code> alloue un vecteur interm\u00e9diaire d&rsquo;une dimension \u00e9quivalente au nombre d&rsquo;\u00e9l\u00e9ments singuliers (ici 500 000 entiers), engageant le ramasse-miettes (garbage collector) de R pour nettoyer l&rsquo;espace m\u00e9moire apr\u00e8s l&rsquo;ex\u00e9cution de <code>length()<\/code>. En s&rsquo;affranchissant totalement de cette mat\u00e9rialisation superflue, <code>n_distinct()<\/code> minimise l&#8217;empreinte r\u00e9sidente en m\u00e9moire vive et acc\u00e9l\u00e8re drastiquement le d\u00e9bit de traitement.<\/p>\n<h3>9.2 \u00c9valuation comparative avec le formalisme data.table<\/h3>\n<p>Lorsque la volum\u00e9trie des donn\u00e9es franchit le seuil des dizaines de millions de lignes et que les ressources temporelles de calcul deviennent un facteur critique de production, 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 en mati\u00e8re de vitesse brute sous R. Ce package dispose de son propre op\u00e9rateur d\u00e9di\u00e9 au d\u00e9nombrement de valeurs distinctes : la fonction <code>uniqueN()<\/code>.<\/p>\n<p>La fonction <code>uniqueN()<\/code> repose sur un algorithme d&rsquo;indexation par hachage direct et tri adress\u00e9 r\u00e9dig\u00e9 en langage C pur, hautement vectoris\u00e9 et exempt de toute surcharge li\u00e9e aux paradigmes d&rsquo;\u00e9valuation masqu\u00e9e du Tidyverse. Sur des vecteurs atomiques simples, les benchmarks d&rsquo;ex\u00e9cution r\u00e9v\u00e8lent que <code>uniqueN()<\/code> surpasse marginalement <code>n_distinct()<\/code>, enregistrant des temps de r\u00e9ponse inf\u00e9rieurs de 15 % \u00e0 30 % sur des \u00e9chantillons massifs.<\/p>\n<p>Toutefois, le choix entre <strong>dplyr<\/strong> et <strong>data.table<\/strong> ne saurait se r\u00e9duire \u00e0 un simple arbitrage de nanosecondes. L&rsquo;\u00e9cosyst\u00e8me <strong>dplyr<\/strong> privil\u00e9gie une coh\u00e9rence syntaxique globale, une int\u00e9gration transparente avec l&rsquo;architecture Tidyverse (notamment pour la mod\u00e9lisation statistique en aval via <code>tidymodels<\/code>) et une lisibilit\u00e9 collaborative exceptionnelle. Dans la majorit\u00e9 des sc\u00e9narios d&rsquo;analyse de donn\u00e9es o\u00f9 le volume n&rsquo;atteint pas des dizaines de gigaoctets, l&rsquo;\u00e9l\u00e9gance d\u00e9clarative de <code>n_distinct()<\/code> compense tr\u00e8s largement le diff\u00e9rentiel marginal de temps d&rsquo;ex\u00e9cution face \u00e0 <code>data.table::uniqueN()<\/code>.<\/p>\n<h3>9.3 Recommandations selon la volum\u00e9trie des donn\u00e9es<\/h3>\n<p>L&rsquo;ing\u00e9nierie des donn\u00e9es moderne impose une adaptation continue des outils en fonction de la taille critique des matrices trait\u00e9es. Afin de guider le praticien dans ses arbitrages architecturaux, plusieurs paliers de volum\u00e9trie peuvent \u00eatre formellement \u00e9tablis :<\/p>\n<ul>\n<li><strong>Volum\u00e9trie mod\u00e9r\u00e9e (moins de 5 millions de lignes) :<\/strong> L&rsquo;utilisation int\u00e9grale de <code>dplyr::n_distinct()<\/code> combin\u00e9e aux verbes conventionnels <code>summarise()<\/code> et <code>group_by()<\/code> repr\u00e9sente l&rsquo;optimum ergonomique et computationnel. Les temps de calcul demeurent sous la seconde, autorisant une fluidit\u00e9 analytique interactive totale.<\/li>\n<li><strong>Volum\u00e9trie interm\u00e9diaire (5 \u00e0 50 millions de lignes) :<\/strong> Le recours \u00e0 <code>dplyr<\/code> demeure parfaitement viable, sous r\u00e9serve de doter l&rsquo;environnement d&rsquo;une m\u00e9moire vive confortable. L&rsquo;analyste gagne n\u00e9anmoins \u00e0 \u00e9valuer l&rsquo;interfa\u00e7age avec le package <code>dtplyr<\/code>, qui traduit automatiquement les expressions syntaxiques de <strong>dplyr<\/strong> en requ\u00eates <strong>data.table<\/strong> hautement performantes lors de l&rsquo;ex\u00e9cution.<\/li>\n<li><strong>Volum\u00e9trie extr\u00eame (au-del\u00e0 de 50 millions de lignes ou donn\u00e9es de flux continus) :<\/strong> Les algorithmes de hachage d\u00e9terministes atteignent leurs limites d&rsquo;absorption m\u00e9moire. Il devient imp\u00e9ratif de se tourner soit vers l&rsquo;infrastructure distribu\u00e9e avec <code>sparklyr<\/code>, soit vers des algorithmes d&rsquo;estimation probabiliste de cardinalit\u00e9. L&rsquo;algorithme <a rel=\"noopener noreferrer\" href=\"https:\/\/en.wikipedia.org\/wiki\/HyperLogLog\">HyperLogLog<\/a> (disponible via des extensions R sp\u00e9cialis\u00e9es) permet alors d&rsquo;estimer le nombre distinct d&rsquo;\u00e9l\u00e9ments avec une marge d&rsquo;erreur param\u00e9trable inf\u00e9rieure \u00e0 1 %, tout en mobilisant une quantit\u00e9 fixe et n\u00e9gligeable de m\u00e9moire vive.<\/li>\n<\/ul>\n<h2>10. Applications pratiques en psychom\u00e9trie et analyse des donn\u00e9es comportementales<\/h2>\n<h3>10.1 V\u00e9rification de l&rsquo;assiduit\u00e9 et comptage de participants uniques dans les protocoles longitudinaux<\/h3>\n<p>Les protocoles de recherche en psychologie cognitive, en psychiatrie et en \u00e9pid\u00e9miologie comportementale reposent massivement sur des devis longitudinaux comportant des mesures r\u00e9p\u00e9t\u00e9es dans le temps (vagues exp\u00e9rimentales t0, t1, t2, &#8230;, tn). Dans ces architectures complexes, chaque ligne d&rsquo;une table longue correspond g\u00e9n\u00e9ralement \u00e0 une interaction de mesure unique et non \u00e0 un sujet individuel. D\u00e8s lors, le simple d\u00e9nombrement des lignes d&rsquo;un tableau surestime grossi\u00e8rement l&rsquo;assise empirique de la cohorte suivie.<\/p>\n<p>L&rsquo;utilisation de <code>n_distinct()<\/code> sur la variable d&rsquo;identification des participants (<code>subject_id<\/code>) permet d&rsquo;\u00e9tablir imm\u00e9diatement le volume de recrutement effectif de l&rsquo;\u00e9tude. De surcro\u00eet, le croisement de cette mesure avec le num\u00e9ro de session au moyen d&rsquo;un partitionnement par <code>group_by(wave)<\/code> permet de cartographier avec exactitude l&rsquo;attrition exp\u00e9rimentale, c&rsquo;est-\u00e0-dire l&rsquo;\u00e9rosion progressive du nombre de sujets uniques observant scrupuleusement le protocole clinique au fil des \u00e9tapes successives :<\/p>\n<p><code>taux_attrition &lt;- df_longitudinal |&gt;<br \/>\n&nbsp;&nbsp;group_by(session_id) |&gt;<br \/>\n&nbsp;&nbsp;summarise(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;participants_actifs = n_distinct(subject_id),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;.groups = \"drop\"<br \/>\n&nbsp;&nbsp;) |&gt;<br \/>\n&nbsp;&nbsp;mutate(retention = participants_actifs \/ max(participants_actifs))<\/code><\/p>\n<p>Cette m\u00e9trique automatis\u00e9e facilite la d\u00e9tection rapide d&rsquo;\u00e9ventuelles anomalies d&rsquo;encodage, telles que la saisie accidentelle de doublons typographiques au niveau des identifiants participants, fiabilisant la phase d&rsquo;apurement avant tout ajustement de mod\u00e8les mixtes \u00e0 effets al\u00e9atoires.<\/p>\n<h3>10.2 Analyse de la variabilit\u00e9 des r\u00e9ponses aux \u00e9chelles d&rsquo;\u00e9valuation psychologique<\/h3>\n<p>Lors de l&rsquo;administration de batteries de questionnaires standardis\u00e9s mobilisant des \u00e9chelles de Likert ordinales \u00e0 5 ou 7 points, les psychom\u00e9triciens font face \u00e0 des biais de r\u00e9ponse pernicieux susceptibles de fausser les propri\u00e9t\u00e9s de fid\u00e9lit\u00e9 des instruments. L&rsquo;un des artefacts les plus document\u00e9s est le ph\u00e9nom\u00e8ne d&rsquo;acquiescement passif ou de r\u00e9ponse uniforme, o\u00f9 le participant coche invariablement le m\u00eame \u00e9chelon num\u00e9rique sur l&rsquo;ensemble des items composant l&rsquo;inventaire psychologique.<\/p>\n<p>L&rsquo;\u00e9valuation de la cardinalit\u00e9 intra-individuelle des scores fournit un indicateur diagnostique remarquable pour d\u00e9tecter et \u00e9carter automatiquement ces profils suspects. En regroupant la matrice de passation par sujet et en appliquant <code>n_distinct()<\/code> \u00e0 la variable contenant la valeur de r\u00e9ponse (<code>score_item<\/code>) :<\/p>\n<p><code>profils_reponses &lt;- df_questionnaire |&gt;<br \/>\n&nbsp;&nbsp;group_by(subject_id) |&gt;<br \/>\n&nbsp;&nbsp;summarise(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;nb_echelons_utilises = n_distinct(score_item),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;total_items = n(),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;.groups = \"drop\"<br \/>\n&nbsp;&nbsp;)<\/code><\/p>\n<p>Tout individu affichant une valeur <code>nb_echelons_utilises == 1<\/code> sur une batterie de quarante items r\u00e9v\u00e8le une variance intra-individuelle nulle, trahissant un d\u00e9sengagement total ou une strat\u00e9gie de r\u00e9ponse machinale. Cette quantification distincte permet d&rsquo;isoler objectivement ces observations aberrantes sans introduire d&rsquo;arbitraire manuel dans les crit\u00e8res d&rsquo;exclusion d&rsquo;\u00e9chantillon.<\/p>\n<p>Dans un registre connexe, lors de t\u00e2ches de fluence verbale ou de rappel libre de stimuli mn\u00e9siques, <code>n_distinct()<\/code> s&rsquo;av\u00e8re irrempla\u00e7able pour quantifier l&rsquo;\u00e9tendue du r\u00e9pertoire lexical mobilis\u00e9 par un sujet, en calculant instantan\u00e9ment le nombre de lemmes singuliers produits ind\u00e9pendamment des pers\u00e9v\u00e9rations cognitives r\u00e9p\u00e9t\u00e9es au cours de la phase de test.<\/p>\n<h3>10.3 Contr\u00f4le de conformit\u00e9 des plans exp\u00e9rimentaux factoriels<\/h3>\n<p>La validit\u00e9 interne des inf\u00e9rences causales formul\u00e9es en psychologie exp\u00e9rimentale d\u00e9pend strictement du strict respect du plan de randomisation et de l&rsquo;\u00e9quilibrage des conditions exp\u00e9rimentales assign\u00e9es aux diff\u00e9rents groupes de participants. Avant de proc\u00e9der \u00e0 des analyses de variance (ANOVA) ou \u00e0 des mod\u00e9lisations par \u00e9quations structurelles, le statisticien se doit de v\u00e9rifier l&rsquo;orthogonalit\u00e9 empirique de son devis factoriel.<\/p>\n<p>En mobilisant <code>n_distinct()<\/code> sur les identifiants de stimuli administr\u00e9s crois\u00e9s avec les modalit\u00e9s de traitement, le chercheur s&rsquo;assure qu&rsquo;aucun artefact d&rsquo;assignation n&rsquo;est venu corrompre la mise en \u0153uvre du protocole. L&rsquo;instruction combin\u00e9e :<\/p>\n<p><code>df_experience |&gt;<br \/>\n&nbsp;&nbsp;group_by(condition_experimentale) |&gt;<br \/>\n&nbsp;&nbsp;summarise(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;stimuli_uniques = n_distinct(stimulus_id),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;sujets_exposes = n_distinct(subject_id),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;.groups = \"drop\"<br \/>\n&nbsp;&nbsp;)<\/code><\/p>\n<p>Cette v\u00e9rification confirme sans \u00e9quivoque que chaque bras exp\u00e9rimental a \u00e9t\u00e9 expos\u00e9 \u00e0 une diversit\u00e9 strictement identique de mat\u00e9riel perceptif ou s\u00e9mantique. Une dissym\u00e9trie inattendue dans la cardinalit\u00e9 des stimuli r\u00e9v\u00e9lerait une faille dans la programmation du moteur de randomisation logicielle (tel que PsychoPy ou OpenSesame), pr\u00e9venant ainsi la publication de conclusions scientifiques compromises \u00e0 la source.<\/p>\n<h2>11. Erreurs courantes, pi\u00e8ges statistiques et strat\u00e9gies de d\u00e9bogage<\/h2>\n<h3>11.1 Confusion entre fonctions de comptage : n(), n_distinct() et count()<\/h3>\n<p>L&rsquo;une des sources de confusion les plus persistantes chez les analystes en transition vers <strong>dplyr<\/strong> provient de la proximit\u00e9 lexicale entre plusieurs fonctions vou\u00e9es au d\u00e9nombrement. Les symboles <code>n()<\/code>, <code>n_distinct()<\/code> et <code>count()<\/code> r\u00e9pondent \u00e0 des finalit\u00e9s statistiques profond\u00e9ment dissemblables qui ne sauraient \u00eatre interverties sans alt\u00e9rer radicalement le sens des mesures obtenues.<\/p>\n<p>La fonction contextuelle <code>n()<\/code> ne prend aucun argument vectoriel et quantifie exclusivement l&rsquo;effectif brut d&rsquo;observations (le nombre absolu de lignes) au sein du tableau courant ou de la strate d\u00e9finie par <code>group_by()<\/code>. Elle \u00e9quivaut sur le plan fonctionnel \u00e0 la fonction <code>nrow()<\/code>. \u00c0 l&rsquo;inverse, <code>n_distinct(x)<\/code> inspecte scrupuleusement la variance des valeurs log\u00e9es \u00e0 l&rsquo;int\u00e9rieur du vecteur sp\u00e9cifique <code>x<\/code> pour n&rsquo;en retenir que la cardinalit\u00e9 singuli\u00e8re.<\/p>\n<p>Quant au verbe <code>count()<\/code>, il s&rsquo;agit d&rsquo;un raccourci algorithmique de haut niveau encapsulant successivement un appel \u00e0 <code>group_by()<\/code> suivi d&rsquo;un appel \u00e0 <code>summarise(n = n())<\/code>. D\u00e8s lors, ex\u00e9cuter <code>df |&gt; count(team)<\/code> produit un tableau de fr\u00e9quences ventilant le nombre de lignes associ\u00e9es \u00e0 chaque \u00e9quipe. Chercher \u00e0 injecter <code>n_distinct()<\/code> au sein de <code>count()<\/code> sans discernement produit fr\u00e9quemment des structures aberrantes o\u00f9 la cardinalit\u00e9 est calcul\u00e9e sur les fr\u00e9quences marginales pr\u00e9alablement consolid\u00e9es, faussant irr\u00e9m\u00e9diablement l&rsquo;interpr\u00e9tation des effectifs r\u00e9els.<\/p>\n<h3>11.2 Effets pervers de l&rsquo;\u00e9valuation paresseuse et des contextes de regroupement<\/h3>\n<p>L&rsquo;environnement <strong>dplyr<\/strong> tire son efficacit\u00e9 de l&rsquo;\u00e9valuation non standard et du maintien d&rsquo;attributs de regroupement dynamiques au sein des structures de donn\u00e9es. Cependant, cette persistance contextuelle se transforme en pi\u00e8ge redoutable lorsque l&rsquo;analyste omet de neutraliser explicitement les groupes apr\u00e8s l&rsquo;ex\u00e9cution d&rsquo;une instruction d&rsquo;agr\u00e9gation partitionn\u00e9e.<\/p>\n<p>Lorsqu&rsquo;un jeu de donn\u00e9es est partitionn\u00e9 par deux facteurs successifs, par exemple <code>group_by(facteur_A, facteur_B)<\/code>, l&rsquo;application d&rsquo;un verbe <code>summarise()<\/code> op\u00e8re l&rsquo;agr\u00e9gation sur le niveau le plus fin (<code>facteur_B<\/code>), mais pr\u00e9serve par d\u00e9faut le regroupement sur le niveau r\u00e9siduel <code>facteur_A<\/code>. Si le statisticien applique subs\u00e9quemment un second appel \u00e0 <code>n_distinct()<\/code> en pensant op\u00e9rer sur la globalit\u00e9 de sa table, l&rsquo;\u00e9valuation s&rsquo;ex\u00e9cutera \u00e0 son insu \u00e0 l&rsquo;int\u00e9rieur des sous-groupes d\u00e9finis par <code>facteur_A<\/code>, produisant des m\u00e9triques parcellaires erron\u00e9es.<\/p>\n<p>L&rsquo;int\u00e9gration de la commande <code>ungroup()<\/code> en aval de toute cha\u00eene d&rsquo;agr\u00e9gation, ou la fixation rigoureuse de l&rsquo;argument <code>.groups = \"drop\"<\/code> directement au sein de <code>summarise()<\/code>, constitue le contrepoison m\u00e9thodologique indispensable. Cette discipline d&rsquo;ing\u00e9nierie logicielle garantit que les structures tabulaires circulant d&rsquo;un module analytique \u00e0 l&rsquo;autre sont r\u00e9initialis\u00e9es dans un \u00e9tat neutre d\u00e9nu\u00e9 d&rsquo;attributs invisibles susceptibles de biaiser les calculs ult\u00e9rieurs.<\/p>\n<h3>11.3 Anomalies caus\u00e9es par le codage des caract\u00e8res et les espaces invisibles<\/h3>\n<p>Lors de l&rsquo;ingestion de corpus textuels ou d&rsquo;enqu\u00eates en ligne, les variables qualitatives de type <code>character<\/code> constituent le foyer privil\u00e9gi\u00e9 des erreurs de sur-d\u00e9nombrement masqu\u00e9. Deux cha\u00eenes de caract\u00e8res paraissant rigoureusement identiques \u00e0 l&rsquo;\u0153il nu lors d&rsquo;une inspection visuelle sommaire sur la console peuvent en r\u00e9alit\u00e9 encapsuler des repr\u00e9sentations binaires divergentes.<\/p>\n<p>La pr\u00e9sence d&rsquo;espaces ins\u00e9cables, de tabulations de fin de ligne ou d&rsquo;espaces typographiques accidentels (par exemple la divergence subtile entre <code>\"Equipe_A\"<\/code> et <code>\"Equipe_A \"<\/code>) pousse inexorablement <code>n_distinct()<\/code> \u00e0 comptabiliser deux entit\u00e9s autonomes. De m\u00eame, les variations de casse typographique (minuscules oppos\u00e9es aux majuscules) induisent un d\u00e9doublement artificiel de la cardinalit\u00e9 sur les syst\u00e8mes respectant la sensibilit\u00e9 \u00e0 la casse.<\/p>\n<p>Pour immuniser les scripts d&rsquo;exploration contre ces artefacts de saisie, l&rsquo;analyste doit syst\u00e9matiser le pr\u00e9traitement des colonnes textuelles en amont de tout d\u00e9nombrement en mobilisant les fonctionnalit\u00e9s du package <a rel=\"noopener noreferrer\" href=\"https:\/\/stringr.tidyverse.org\/\">stringr<\/a>. La mise en \u0153uvre d&rsquo;une s\u00e9quence normalisatrice s&rsquo;av\u00e8re salutaire :<\/p>\n<p><code>df_nettoye &lt;- df_sports |&gt;<br \/>\n&nbsp;&nbsp;mutate(team = stringr::str_squish(stringr::str_to_lower(team)))<\/code><\/p>\n<p>La combinaison de <code>str_to_lower()<\/code> (harmonisation de la casse) et de <code>str_squish()<\/code> (suppression int\u00e9grale des espaces superflus en d\u00e9but, milieu et fin de cha\u00eene) assure que le calcul de cardinalit\u00e9 ult\u00e9rieur refl\u00e8te rigoureusement la diversit\u00e9 s\u00e9mantique des concepts, et non les al\u00e9as de transcription dactylographique.<\/p>\n<h2>12. Synth\u00e8se g\u00e9n\u00e9rale et bonnes pratiques pour l&rsquo;ing\u00e9nierie des donn\u00e9es sous R<\/h2>\n<h3>12.1 Arbre d\u00e9cisionnel pour le choix de la m\u00e9thode optimale<\/h3>\n<p>Au terme de cette exploration transversale des protocoles de comptage de valeurs distinctes, il est b\u00e9n\u00e9fique de condenser les orientations m\u00e9thodologiques au sein d&rsquo;une grille de d\u00e9cision formalis\u00e9e, orientant le choix de l&rsquo;analyste en fonction de ses imp\u00e9ratifs d&rsquo;ing\u00e9nierie logicielle et de la topologie de ses donn\u00e9es.<\/p>\n<p>Le choix de l&rsquo;architecture de calcul peut \u00eatre r\u00e9sum\u00e9 selon les directives op\u00e9rationnelles suivantes :<\/p>\n<ul>\n<li><strong>V\u00e9rification scalaire univari\u00e9e isol\u00e9e :<\/strong> Recourir \u00e0 l&rsquo;extraction directe <code>n_distinct(df$colonne, na.rm = TRUE)<\/code>. Id\u00e9ale pour les assertions d&rsquo;int\u00e9grit\u00e9, les conditions logiques au sein de structures <code>if()<\/code> ou les contr\u00f4les pr\u00e9alables de non-vacuit\u00e9.<\/li>\n<li><strong>Agr\u00e9gation tabulaire au sein d&rsquo;un pipeline Tidyverse :<\/strong> Privil\u00e9gier <code>df |&gt; summarise(nb = n_distinct(colonne))<\/code>. Cette formulation s&rsquo;impose lorsque le r\u00e9sultat doit alimenter des tableaux r\u00e9capitulatifs, des jointures relationnelles ou des cha\u00eenes de transformation uniformis\u00e9es.<\/li>\n<li><strong>Audit exhaustif et balayage multi-colonnes :<\/strong> D\u00e9ployer l&rsquo;op\u00e9rateur moderne <code>df |&gt; summarise(across(everything(), n_distinct))<\/code> ou cibler par typage avec <code>across(where(is.numeric), n_distinct)<\/code>. Pour une programmation d\u00e9fensive stricte au sein d&rsquo;un package R, l&rsquo;alternative <code>vapply(df, n_distinct, integer(1))<\/code> demeure la solution de pr\u00e9dilection.<\/li>\n<li><strong>Analyse comparative stratifi\u00e9e par groupes :<\/strong> Orchestrer l&rsquo;association <code>df |&gt; group_by(groupe) |&gt; summarise(nb = n_distinct(cible), .groups = \"drop\")<\/code>, garantissant l&rsquo;isolation computationnelle des sous-ensembles sans propagation de m\u00e9tadonn\u00e9es parasites.<\/li>\n<\/ul>\n<p>Ce sch\u00e9ma m\u00e9thodologique rationalise l&rsquo;activit\u00e9 de programmation en \u00e9liminant les h\u00e9sitations syntaxiques au profit d&rsquo;une d\u00e9marche d&rsquo;ing\u00e9nierie reproductible et \u00e9prouv\u00e9e.<\/p>\n<h3>12.2 Directives de r\u00e9daction pour un code analytique robuste et p\u00e9renne<\/h3>\n<p>La p\u00e9rennit\u00e9 d&rsquo;un pipeline d&rsquo;analyse de donn\u00e9es repose sur l&rsquo;adh\u00e9sion collective \u00e0 des conventions de style document\u00e9es et sur l&rsquo;anticipation rigoureuse des d\u00e9rives m\u00e9thodologiques. La maintenance d&rsquo;un socle de code exige une discipline de formalisation d\u00e8s l&rsquo;\u00e9criture des premi\u00e8res instructions de nettoyage.<\/p>\n<p>Il est imp\u00e9ratif d&rsquo;adopter des d\u00e9nominations explicites pour les m\u00e9triques de cardinalit\u00e9 cr\u00e9\u00e9es. Des libell\u00e9s g\u00e9n\u00e9riques tels que <code>count<\/code> ou <code>val<\/code> doivent \u00eatre proscrits au profit de qualificatifs s\u00e9mantiquement transparents tels que <code>nb_patients_distincts<\/code> ou <code>cardinalite_items<\/code>. Cette transparence terminologique \u00e9pargne aux collaborateurs scientifiques toute ambigu\u00eft\u00e9 d&rsquo;interpr\u00e9tation lors de la relecture des synth\u00e8ses chiffr\u00e9es.<\/p>\n<p>De plus, chaque invocation de <code>n_distinct()<\/code> au sein d&rsquo;un script d&rsquo;analyse destin\u00e9 \u00e0 la publication doit faire l&rsquo;objet d&rsquo;un commentaire m\u00e9thodologique justifiant formellement l&rsquo;arbitrage retenu pour l&rsquo;argument <code>na.rm<\/code>. Pr\u00e9ciser express\u00e9ment si l&rsquo;exclusion des valeurs manquantes correspond \u00e0 une hypoth\u00e8se de donn\u00e9es manquantes compl\u00e8tement al\u00e9atoires (MCAR) ou si le marqueur <code>NA<\/code> doit \u00eatre trac\u00e9 en tant qu&rsquo;\u00e9tat informatif constitue une exigence d\u00e9ontologique en science des donn\u00e9es.<\/p>\n<p>Enfin, l&rsquo;inclusion syst\u00e9matique de tests unitaires v\u00e9rifiant la stabilit\u00e9 de la cardinalit\u00e9 au sein des pipelines d&rsquo;int\u00e9gration continue assure la d\u00e9tection pr\u00e9coce des corruptions de sch\u00e9mas tabulaires. En \u00e9levant l&rsquo;\u00e9valuation de la cardinalit\u00e9 au rang de barom\u00e8tre fondamental de la qualit\u00e9 des donn\u00e9es, le statisticien sous R garantit la solidit\u00e9, la fiabilit\u00e9 et la reproductibilit\u00e9 de l&rsquo;ensemble de ses constructions inf\u00e9rentielles.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<p>Dowle, M., &amp; Srinivasan, A. (2023). <em>data.table: Extension of `data.frame`<\/em> (Version 1.14.8) [Logiciel informatique]. 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>Eddelbuettel, D., &amp; Fran\u00e7ois, R. (2011). Rcpp: Seamless R and C++ integration. <em>Journal of Statistical Software<\/em>, 40(8), 1\u201318. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.18637\/jss.v040.i08\">https:\/\/doi.org\/10.18637\/jss.v040.i08<\/a><\/p>\n<p>Flajolet, P., Fusy, \u00c9., Gandouet, O., &amp; Meunier, F. (2007). HyperLogLog: The analysis of a near-optimal cardinality estimation algorithm. <em>Discrete Mathematics and Theoretical Computer Science<\/em>, AH, 137\u2013156. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.46298\/dmtcs.3545\">https:\/\/doi.org\/10.46298\/dmtcs.3545<\/a><\/p>\n<p>R Core Team. (2024). <em>R: A language and environment for statistical computing<\/em>. R Foundation for Statistical Computing, Vienna, Austria. <a rel=\"noopener noreferrer\" href=\"https:\/\/www.R-project.org\/\">https:\/\/www.R-project.org\/<\/a><\/p>\n<p>Wickham, H. (2011). The split-apply-combine strategy for data analysis. <em>Journal of Statistical Software<\/em>, 40(1), 1\u201329. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.18637\/jss.v040.i01\">https:\/\/doi.org\/10.18637\/jss.v040.i01<\/a><\/p>\n<p>Wickham, H. (2014). Tidy data. <em>Journal of Statistical Software<\/em>, 59(10), 1\u201323. <a rel=\"noopener noreferrer\" href=\"https:\/\/doi.org\/10.18637\/jss.v059.i10\">https:\/\/doi.org\/10.18637\/jss.v059.i10<\/a><\/p>\n<p>Wickham, H., \u00c7etinkaya-Rundel, M., &amp; Grolemund, G. (2023). <em>R for data science: Import, tidy, transform, visualize, and model data<\/em> (2e \u00e9d.). O&rsquo;Reilly Media. <a rel=\"noopener noreferrer\" href=\"https:\/\/r4ds.hadley.nz\/\">https:\/\/r4ds.hadley.nz\/<\/a><\/p>\n<p>Wickham, H., Fran\u00e7ois, R., Henry, L., M\u00fcller, K., &amp; Vaughan, D. (2023). <em>dplyr: A grammar of data manipulation<\/em> (Version 1.1.4) [Logiciel informatique]. 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 complet pour compter les valeurs uniques dans R avec dplyr : d\u00e9couvrez l&rsquo;utilisation de n_distinct() par colonne, par groupe et sur un tableau entier.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[2193,2464],"tags":[2690,2469,6780,2658,3060],"class_list":["post-4809","psych_stat","type-psych_stat","status-publish","hentry","category-programmation-r","category-science-des-donnees","tag-dplyr","tag-manipulation-de-donnees","tag-n_distinct","tag-r","tag-tidyverse"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4809","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=4809"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4809\/revisions"}],"predecessor-version":[{"id":16690,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/4809\/revisions\/16690"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=4809"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=4809"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=4809"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}