{"id":3168,"date":"2026-10-14T18:00:59","date_gmt":"2026-10-14T18:00:59","guid":{"rendered":"http:\/\/french.arabpsychology.com\/statistics\/comment-importer-fichiers-sas-dans-r-etape-par-etape\/"},"modified":"2026-10-14T18:00:59","modified_gmt":"2026-10-14T18:00:59","slug":"comment-importer-fichiers-sas-dans-r-etape-par-etape","status":"publish","type":"psych_stat","link":"https:\/\/french.arabpsychology.com\/?psych_stat=comment-importer-fichiers-sas-dans-r-etape-par-etape","title":{"rendered":"Comment importer des fichiers SAS dans R (\u00e9tape par \u00e9tape)"},"content":{"rendered":"<p>Dans le domaine des sciences statistiques contemporaines, de l\u2019\u00e9conom\u00e9trie appliqu\u00e9e, de l\u2019\u00e9pid\u00e9miologie et de la recherche en sciences sociales, la gestion efficace et rigoureuse des corpus de donn\u00e9es constitue le socle indispensable \u00e0 toute inf\u00e9rence robuste. Pendant plusieurs d\u00e9cennies, le Statistical Analysis System (SAS), d\u00e9velopp\u00e9 \u00e0 l\u2019origine par l\u2019Universit\u00e9 d\u2019\u00c9tat de Caroline du Nord et commercialis\u00e9 par le SAS Institute, a r\u00e9gn\u00e9 en ma\u00eetre incontest\u00e9 sur les infrastructures d\u2019analyse des institutions publiques, des agences de r\u00e9gulation pharmaceutique et des grands groupes industriels. Sa robustesse transactionnelle, sa capacit\u00e9 historique \u00e0 traiter de volumineuses banques de donn\u00e9es sans solliciter excessivement la m\u00e9moire vive et ses proc\u00e9dures hautement standardis\u00e9es lui ont conf\u00e9r\u00e9 une l\u00e9gitimit\u00e9 institutionnelle quasi universelle.<\/p>\n<p>Toutefois, l&rsquo;av\u00e8nement et la maturation spectaculaire de l\u2019environnement open-source <a rel=\"noopener noreferrer\" href=\"https:\/\/www.r-project.org\/\">R Project for Statistical Computing<\/a>, catalys\u00e9s par l&rsquo;expansion de l&rsquo;\u00e9cosyst\u00e8me Tidyverse, ont profond\u00e9ment boulevers\u00e9 ce paradigme informatique. Les chercheurs et les analystes quantitatifs sont aujourd&rsquo;hui tr\u00e8s fr\u00e9quemment confront\u00e9s \u00e0 des archives documentaires patrimoniales, des cohortes cliniques longitudinales ou des enqu\u00eates sociologiques massives encapsul\u00e9es dans des formats propri\u00e9taires SAS, tout en devant d\u00e9ployer des mod\u00e9lisations statistiques novatrices, des algorithmes d&rsquo;apprentissage automatique ou des protocoles de visualisation dynamique au sein de R. Ce transfert m\u00e9thodologique n&rsquo;est pas un simple exercice d&rsquo;ing\u00e9nierie logicielle ; il conditionne la reproductibilit\u00e9 computationnelle et la validit\u00e9 scientifique des analyses ult\u00e9rieures.<\/p>\n<p>Le pr\u00e9sent guide a pour vocation de d\u00e9tailler, de mani\u00e8re exhaustive et rigoureuse, l&rsquo;ensemble des m\u00e9canismes th\u00e9oriques, m\u00e9thodologiques et programmatiques n\u00e9cessaires \u00e0 l&rsquo;importation sans perte de donn\u00e9es issues des formats SAS vers R. En explorant l&rsquo;architecture interne des fichiers binaires, les divergences s\u00e9mantiques entre structures tabulaires, la pr\u00e9servation minutieuse des dictionnaires de m\u00e9tadonn\u00e9es et la r\u00e9solution des probl\u00e9matiques d&rsquo;encodage de caract\u00e8res, cet article offre un protocole pas-\u00e0-pas \u00e0 l&rsquo;attention des chercheurs m\u00e9thodologues, des biostatisticiens et des scientifiques des donn\u00e9es soucieux d&rsquo;atteindre une int\u00e9grit\u00e9 analytique sans faille.<\/p>\n<h2>1. Introduction \u00e0 l&rsquo;interop\u00e9rabilit\u00e9 entre SAS et R dans la recherche empirique<\/h2>\n<h3>1.1 Contexte de la transition logicielle en analyse de donn\u00e9es<\/h3>\n<p>L&rsquo;\u00e9volution des pratiques computationnelles au cours des deux derni\u00e8res d\u00e9cennies se caract\u00e9rise par un mouvement de transition massif des logiciels statistiques propri\u00e9taires et compil\u00e9s vers des langages interpr\u00e9t\u00e9s, modulaires et distribu\u00e9s sous licences libres. Longtemps, SAS s&rsquo;est impos\u00e9 comme l&rsquo;\u00e9talon-or, particuli\u00e8rement dans les contextes o\u00f9 la tra\u00e7abilit\u00e9 des op\u00e9rations logicielles devait satisfaire aux exigences drastiques de directives institutionnelles telles que le titre 21 du <em>Code of Federal Regulations<\/em> (Partie 11) de la Food and Drug Administration (FDA) aux \u00c9tats-Unis. Ce statut privil\u00e9gi\u00e9 a conduit \u00e0 la s\u00e9dimentation d&rsquo;immenses entrep\u00f4ts de donn\u00e9es au format propri\u00e9taire au sein d&rsquo;instituts de sondage, de laboratoires pharmaceutiques et d&rsquo;organismes de statistiques publiques tels que l&rsquo;INSEE en France ou Statistique Canada.<\/p>\n<p>Parall\u00e8lement, la mont\u00e9e en puissance de la science ouverte (<em>Open Science<\/em>) a soulign\u00e9 l&rsquo;urgence d&rsquo;une reproductibilit\u00e9 int\u00e9grale des cha\u00eenes de traitement statistique, depuis la collecte brute jusqu&rsquo;\u00e0 la publication des r\u00e9sultats. R s&rsquo;est impos\u00e9 comme le v\u00e9hicule privil\u00e9gi\u00e9 de cette transformation gr\u00e2ce \u00e0 son syst\u00e8me de packages \u00e9valu\u00e9s par les pairs via le Comprehensive R Archive Network (CRAN), sa flexibilit\u00e9 syntaxique et son int\u00e9gration transparente avec des outils de r\u00e9daction scientifique reproductible tels que Quarto et R Markdown. Cependant, cette transition ne saurait s&rsquo;op\u00e9rer par une rupture brutale avec le pass\u00e9 ; l&rsquo;exigence m\u00e9thodologique impose de garantir que la migration d&rsquo;un syst\u00e8me \u00e0 un autre pr\u00e9serve l&rsquo;int\u00e9grit\u00e9 num\u00e9rique stricte des vecteurs de donn\u00e9es, sans alt\u00e9ration des arrondis flottants, des horodatages ni des structures classificatoires pr\u00e9existantes.<\/p>\n<p>En outre, l&rsquo;\u00e9cosyst\u00e8me R offre des capacit\u00e9s d&rsquo;extension analytique sans commune mesure avec les cycles de mise \u00e0 jour traditionnels des logiciels commerciaux. Qu&rsquo;il s&rsquo;agisse de d\u00e9ployer des mod\u00e8les mixtes g\u00e9n\u00e9ralis\u00e9s non lin\u00e9aires, des m\u00e9thodes de bootstrap non param\u00e9trique ou des inf\u00e9rences bay\u00e9siennes via Stan, R offre aux m\u00e9thodologues un terrain d&rsquo;investigation d&rsquo;une richesse exceptionnelle. Par cons\u00e9quent, assurer une passerelle computationnelle fluide entre les bases SAS historiques et l&rsquo;environnement R contemporain ne rel\u00e8ve pas du simple confort technique, mais d&rsquo;une imp\u00e9rieuse n\u00e9cessit\u00e9 acad\u00e9mique et professionnelle.<\/p>\n<h3>1.2 D\u00e9fis structurels du format propri\u00e9taire SAS<\/h3>\n<p>L&rsquo;extraction de donn\u00e9es depuis un format propri\u00e9taire vers un environnement ouvert se heurte d&#8217;embl\u00e9e \u00e0 la nature ferm\u00e9e des sp\u00e9cifications d&rsquo;ing\u00e9nierie sous-jacentes. Les fichiers de tables de donn\u00e9es SAS, portant traditionnellement l&rsquo;extension <code>.sas7bdat<\/code>, reposent sur une architecture binaire propri\u00e9taire sp\u00e9cifiquement optimis\u00e9e pour le moteur d&rsquo;ex\u00e9cution s\u00e9quentiel de SAS. Contrairement aux formats textuels d\u00e9limit\u00e9s tels que le CSV (<em>Comma-Separated Values<\/em>), un fichier binaire SAS encapsule dans un m\u00eame conteneur physique les donn\u00e9es matricielles brutes, la d\u00e9finition des types de colonnes, des pointeurs internes d&rsquo;alignement m\u00e9moire, des drapeaux d&rsquo;\u00e9tat d&rsquo;indexation, ainsi que d&rsquo;\u00e9ventuels algorithmes de compression propri\u00e9taires, \u00e0 l&rsquo;instar des algorithmes RLE (<em>Run-Length Encoding<\/em>) ou Ross Data Compression (RDC).<\/p>\n<p>L&rsquo;un des d\u00e9fis majeurs r\u00e9side dans la s\u00e9paration fonctionnelle qu&rsquo;op\u00e8re SAS entre la donn\u00e9e purement num\u00e9rique ou textuelle et sa repr\u00e9sentation s\u00e9miotique. Dans la philosophie SAS, une variable num\u00e9rique cod\u00e9e sous la forme d&rsquo;un entier scalaire peut \u00eatre reli\u00e9e \u00e0 un dictionnaire externe d&rsquo;\u00e9tiquettes de format (<em>User-Defined Formats<\/em>), ce qui permet \u00e0 l&rsquo;utilisateur de visualiser une modalit\u00e9 cat\u00e9gorielle descriptive (par exemple \u00ab Fortement en d\u00e9saccord \u00bb) alors que le disque ne stocke fondamentalement que la valeur arithm\u00e9tique sous-jacente. Si le transfert vers R se contente d&rsquo;extraire la matrice brute sans reconstituer cette topologie de m\u00e9tadonn\u00e9es, la s\u00e9mantique de l&rsquo;\u00e9tude s&rsquo;en trouve instantan\u00e9ment amput\u00e9e, compromettant la validit\u00e9 des inf\u00e9rences futures.<\/p>\n<p>Cette probl\u00e9matique devient particuli\u00e8rement aigu\u00eb dans le champ des enqu\u00eates psychosociales, des observatoires longitudinaux et des essais cliniques randomis\u00e9s. Dans ces contextes, la perte d&rsquo;un dictionnaire de variables ou l&rsquo;interpr\u00e9tation erron\u00e9e d&rsquo;un sch\u00e9ma de codage des valeurs manquantes peut invalider des mois de travail empirique. La tra\u00e7abilit\u00e9 scientifique impose donc que le parseur employ\u00e9 dans R soit capable de lire avec une exactitude math\u00e9matique la charge utile du fichier binaire, d&rsquo;interpr\u00e9ter les m\u00e9tadonn\u00e9es int\u00e9gr\u00e9es aux segments d&rsquo;en-t\u00eate et de r\u00e9concilier, le cas \u00e9ch\u00e9ant, les catalogues de formats externes pour reconstituer la richesse d&rsquo;origine du dispositif d&rsquo;observation.<\/p>\n<h2>2. Comprendre les sp\u00e9cificit\u00e9s des formats de fichiers SAS<\/h2>\n<h3>2.1 Structure interne du fichier .sas7bdat<\/h3>\n<p>Pour appr\u00e9hender les m\u00e9canismes d&rsquo;ing\u00e9nierie inverse mis en \u0153uvre lors de l&rsquo;importation dans R, il convient de diss\u00e9quer l&rsquo;anatomie d&rsquo;un fichier <code>.sas7bdat<\/code>. Ce dernier est segment\u00e9 en unit\u00e9s de taille fixe appel\u00e9es pages de donn\u00e9es (<em>data pages<\/em>), dont la dimension est d\u00e9termin\u00e9e lors de la cr\u00e9ation de la table sous SAS (couramment 4 Ko, 8 Ko, 16 Ko, voire 64 Ko selon les architectures mat\u00e9rielles). La premi\u00e8re section du fichier est constitu\u00e9e par la page d&rsquo;en-t\u00eate (<em>header page<\/em>), qui renferme les signatures binaires identifiant la version de SAS exploit\u00e9e lors de l&rsquo;\u00e9criture, le syst\u00e8me d&rsquo;exploitation d&rsquo;origine (architecture 32 bits versus 64 bits), le boutisme (<em>endianness<\/em>, ordonnancement des octets de poids fort et faible en m\u00e9moire), l&rsquo;horodatage pr\u00e9cis de cr\u00e9ation et de modification, ainsi que l&rsquo;encodage textuel d\u00e9clar\u00e9.<\/p>\n<p>Au-del\u00e0 de cette page de pr\u00e9ambule, le fichier organise les observations sous une forme matricielle pagin\u00e9e. Chaque page contient un en-t\u00eate de contr\u00f4le local suivi par les enregistrements d&rsquo;observations. Dans l&rsquo;architecture SAS native, il n&rsquo;existe fondamentalement que deux types de donn\u00e9es primitifs : le type num\u00e9rique et le type caract\u00e8re. Les variables num\u00e9riques sont invariablement stock\u00e9es par d\u00e9faut sous forme de nombres \u00e0 virgule flottante en double pr\u00e9cision, conformes \u00e0 la norme IEEE 754 sur 8 octets (bien que des compressions de longueur puissent \u00eatre sp\u00e9cifi\u00e9es pour r\u00e9duire la taille \u00e0 3, 4, 5, 6 ou 7 octets au prix d&rsquo;une perte de pr\u00e9cision mantissique). Les variables de type caract\u00e8re sont stock\u00e9es sous forme de cha\u00eenes de longueur fixe, compl\u00e9t\u00e9es par des espaces d&rsquo;espacement (<em>trailing spaces<\/em>) jusqu&rsquo;\u00e0 concurrence de la longueur d\u00e9clar\u00e9e lors de l&rsquo;\u00e9tape de compilation SAS.<\/p>\n<p>L&rsquo;extraction programmatique de ces blocs n\u00e9cessite une compr\u00e9hension rigoureuse des descripteurs de sous-en-t\u00eates (<em>subheader descriptors<\/em>). Ces structures binaires indiquent l&#8217;emplacement exact de chaque colonne dans l&rsquo;enregistrement physique, sa longueur en octets, son d\u00e9calage (<em>offset<\/em>) par rapport au d\u00e9but de la ligne, ainsi que les pointeurs vers les noms de variables et leurs attributs descriptifs. Toute corruption de cette cartographie binaire ou toute mauvaise interpr\u00e9tation de l&rsquo;alignement architectural entra\u00eene in\u00e9vitablement un d\u00e9calage en cascade de la lecture des observations, g\u00e9n\u00e9rant des valeurs aberrantes ou des erreurs critiques de terminaison de flux.<\/p>\n<h3>2.2 R\u00f4le des fichiers de formats catalogues (.sas7bcat)<\/h3>\n<p>L&rsquo;une des singularit\u00e9s architecturales les plus d\u00e9routantes pour les praticiens d\u00e9couvrant l&rsquo;\u00e9cosyst\u00e8me SAS r\u00e9side dans l&rsquo;externalisation fr\u00e9quente des dictionnaires de libell\u00e9s. Alors qu&rsquo;un fichier <code>.sas7bdat<\/code> peut contenir les noms de variables et leurs \u00e9tiquettes descriptives imm\u00e9diates (<em>variable labels<\/em>), les correspondances entre les codes num\u00e9riques bruts et leurs d\u00e9nominations textuelles d\u00e9taill\u00e9es (<em>value labels<\/em>) sont tr\u00e8s souvent compil\u00e9es s\u00e9par\u00e9ment dans un fichier catalogue portant l&rsquo;extension <code>.sas7bcat<\/code>, g\u00e9n\u00e9ralement d\u00e9nomm\u00e9 <code>formats.sas7bcat<\/code>.<\/p>\n<p>Ce m\u00e9canisme repose sur l&rsquo;utilisation de la proc\u00e9dure SAS <code>PROC FORMAT<\/code>, qui g\u00e9n\u00e8re des tables de consultation binaires ind\u00e9pendantes. Par exemple, une variable mod\u00e9lisant le statut tabagique d&rsquo;un patient pourra \u00eatre encod\u00e9e num\u00e9riquement sous les valeurs discr\u00e8tes 0, 1 ou 2 au sein de la table principale <code>cohorte.sas7bdat<\/code>. L&rsquo;affichage textuel \u00ab Non-fumeur \u00bb, \u00ab Ancien fumeur \u00bb et \u00ab Fumeur actif \u00bb n&rsquo;existe alors nulle part au sein de ce fichier principal : il est encapsul\u00e9 dans le catalogue de formats associ\u00e9 via un format utilisateur d\u00e9sign\u00e9, par exemple, sous le nom de format <code>TABACFMT.<\/code>.<\/p>\n<p>Lors de l&rsquo;extraction vers l&rsquo;environnement R, si l&rsquo;analyste se contente d&rsquo;importer isol\u00e9ment le fichier <code>.sas7bdat<\/code>, le moteur d&rsquo;ingestion lira fid\u00e8lement les nombres 0, 1 et 2, mais sera totalement incapable d&rsquo;assigner les significations s\u00e9mantiques correspondantes. Pour surmonter cette limitation structurelle, les parseurs R modernes doivent imp\u00e9rativement proposer des arguments permettant de sp\u00e9cifier conjointement le chemin vers le fichier de donn\u00e9es et le chemin vers le catalogue de formats correspondant. Cette op\u00e9ration permet de fusionner dynamiquement en m\u00e9moire vive la valeur math\u00e9matique et son enveloppe conceptuelle au sein d&rsquo;une structure vectorielle adapt\u00e9e.<\/p>\n<h3>2.3 Formats de transport et d&rsquo;\u00e9change SAS (.xpt)<\/h3>\n<p>Face \u00e0 la complexit\u00e9 et \u00e0 la non-portabilit\u00e9 intrins\u00e8que des fichiers binaires compil\u00e9s sur diff\u00e9rentes plateformes mat\u00e9rielles (notamment entre les architectures Unix, Mainframe IBM et Windows x86\/x64), SAS a introduit tr\u00e8s t\u00f4t un format d&rsquo;\u00e9change normalis\u00e9 : le format de transport SAS, universellement identifi\u00e9 par l&rsquo;extension <code>.xpt<\/code>. R\u00e9gie par la norme de transport SAS XPORT, cette sp\u00e9cification technique a \u00e9t\u00e9 con\u00e7ue pour garantir que les donn\u00e9es puissent transiter entre des syst\u00e8mes aux architectures de processeurs divergentes sans alt\u00e9ration binaire.<\/p>\n<p>Le format XPORT classique, couramment d\u00e9sign\u00e9 sous le vocable de Version 5 (V5), repose sur un encodage strict des caract\u00e8res au format ASCII et impose des restrictions drastiques : les noms de variables ne peuvent exc\u00e9der huit caract\u00e8res, les \u00e9tiquettes de variables sont limit\u00e9es \u00e0 40 octets, et les donn\u00e9es textuelles ne peuvent d\u00e9passer 200 octets par champ. Malgr\u00e9 son archa\u00efsme technique apparent, le format XPORT V5 demeure \u00e0 ce jour un standard r\u00e9glementaire d&rsquo;une importance capitale, prescrit notamment par la FDA am\u00e9ricaine et l&rsquo;Agence europ\u00e9enne des m\u00e9dicaments (EMA) pour la transmission formelle des jeux de donn\u00e9es d&rsquo;essais cliniques selon les standards du consortium <a rel=\"noopener noreferrer\" href=\"https:\/\/www.cdisc.org\/\">CDISC (Clinical Data Interchange Standards Consortium)<\/a>, notamment les mod\u00e8les SDTM et ADaM.<\/p>\n<p>Une r\u00e9vision plus moderne, le format XPORT Version 8 (V8), a ult\u00e9rieurement lev\u00e9 certaines de ces contraintes en autorisant des noms de variables jusqu&rsquo;\u00e0 32 caract\u00e8res et des cha\u00eenes plus longues. Sur le plan computationnel dans R, la lecture des fichiers <code>.xpt<\/code> requiert des algorithmes distincts de ceux employ\u00e9s pour les tables binaires <code>.sas7bdat<\/code>, car la structure de s\u00e9rialisation des blocs XPORT ob\u00e9it \u00e0 un enregistrement s\u00e9quentiel de cardinalit\u00e9 fixe (g\u00e9n\u00e9ralement des blocs de 80 octets r\u00e9miniscent de l&rsquo;\u00e9poque des cartes perfor\u00e9es), n\u00e9cessitant une routine de d\u00e9s\u00e9rialisation sp\u00e9cifique pour convertir les repr\u00e9sentations \u00e0 virgule flottante IBM en repr\u00e9sentations compatibles IEEE 754.<\/p>\n<h2>3. Configuration de l&rsquo;environnement R et \u00e9cosyst\u00e8me Tidyverse<\/h2>\n<h3>3.1 Pr\u00e9sentation et r\u00f4le du package haven<\/h3>\n<p>Dans l&rsquo;\u00e9cosyst\u00e8me R moderne, le package <a rel=\"noopener noreferrer\" href=\"https:\/\/haven.tidyverse.org\/\">haven<\/a> s&rsquo;affirme comme la r\u00e9f\u00e9rence h\u00e9g\u00e9monique pour l&rsquo;ingestion et l&rsquo;exportation des formats de fichiers issus des suites logicielles commerciales traditionnelles, incluant SAS, SPSS et Stata. Maintenu activement par Posit (anciennement RStudio) et int\u00e9gr\u00e9 au noyau \u00e9tendu du Tidyverse, haven a \u00e9t\u00e9 con\u00e7u pour abolir les frictions historiques qui entravaient la collaboration entre les \u00e9quipes d&rsquo;analystes utilisant des outils h\u00e9t\u00e9rog\u00e8nes.<\/p>\n<p>La puissance et la v\u00e9locit\u00e9 remarquables de haven reposent sur son architecture logicielle sous-jacente. Plut\u00f4t que de r\u00e9impl\u00e9menter un moteur de lecture int\u00e9gralement en langage R interpr\u00e9t\u00e9, haven s&rsquo;appuie sur la biblioth\u00e8que C open-source <strong>ReadStat<\/strong>, initi\u00e9e par Matthew Shotwell et activement d\u00e9velopp\u00e9e au sein de la communaut\u00e9 du g\u00e9nie logiciel. En d\u00e9l\u00e9guant l&rsquo;analyse syntaxique binaire bas niveau (<em>parsing<\/em>), la gestion des pages m\u00e9moire et le d\u00e9codage des primitives num\u00e9riques \u00e0 du code C hautement optimis\u00e9 et compil\u00e9, haven atteint des vitesses d&rsquo;ex\u00e9cution exceptionnelles tout en limitant au strict minimum la surcharge m\u00e9moire.<\/p>\n<p>Par ailleurs, haven ne se limite pas \u00e0 extraire des matrices de donn\u00e9es ; il a \u00e9t\u00e9 pens\u00e9 d\u00e8s sa conception pour s&rsquo;int\u00e9grer harmonieusement avec la philosophie du Tidyverse. Les structures g\u00e9n\u00e9r\u00e9es par ses fonctions de lecture ne sont pas de simples tables de donn\u00e9es basiques (<code>data.frame<\/code>), mais des tables enrichies (<code>tibble<\/code>). Ces derni\u00e8res garantissent un affichage console tronqu\u00e9 et ergonomique, pr\u00e9servent strictement les types de donn\u00e9es sans conversion implicite ind\u00e9sirable (refusant notamment la conversion historique automatique des cha\u00eenes de caract\u00e8res en facteurs arbitraires), et encapsulent les m\u00e9tadonn\u00e9es complexes sous forme d&rsquo;attributs vectoriels standardis\u00e9s.<\/p>\n<h3>3.2 Proc\u00e9dure d&rsquo;installation et de chargement<\/h3>\n<p>L&rsquo;installation du package haven s&rsquo;effectue directement depuis les serveurs officiels du CRAN, garantissant l&rsquo;obtention de binaires pr\u00e9compil\u00e9s stables adapt\u00e9s au syst\u00e8me d&rsquo;exploitation de l&rsquo;h\u00f4te (Windows, macOS ou distributions Linux). Bien que haven soit inclus par d\u00e9faut lors de l&rsquo;installation globale du m\u00e9ta-package <code>tidyverse<\/code>, il est vivement recommand\u00e9 dans les contextes de production analytique et de recherche reproductible de l&rsquo;installer et de le charger explicitement en tant que composant isol\u00e9 afin de minimiser les d\u00e9pendances superflues et de documenter avec exactitude l&rsquo;environnement d&rsquo;ex\u00e9cution.<\/p>\n<p>La commande d&rsquo;installation s&rsquo;ex\u00e9cute de mani\u00e8re canonique au sein de la console R :<\/p>\n<p><code>install.packages(\"haven\")<\/code><\/p>\n<p>Il est imp\u00e9ratif de s&rsquo;assurer que la version de l&rsquo;interpr\u00e9teur R sous-jacent est tenue \u00e0 jour. Le package haven b\u00e9n\u00e9ficie d&rsquo;\u00e9volutions r\u00e9guli\u00e8res visant \u00e0 corriger d&rsquo;\u00e9ventuelles failles de s\u00e9curit\u00e9 li\u00e9es au traitement de binaires malform\u00e9s au niveau de la biblioth\u00e8que C ReadStat, tout en optimisant la compatibilit\u00e9 avec les architectures mat\u00e9rielles r\u00e9centes (notamment les processeurs Apple Silicon ARM64 et les plateformes x86_64 multi-c\u0153urs). Une fois le processus d&rsquo;installation achev\u00e9 avec succ\u00e8s, l&rsquo;initialisation de la biblioth\u00e8que au d\u00e9but de chaque session ou script de calcul est r\u00e9alis\u00e9e au moyen de l&rsquo;instruction standard :<\/p>\n<p><code>library(haven)<\/code><\/p>\n<p>Cette commande rend imm\u00e9diatement disponibles l&rsquo;ensemble des fonctions d&rsquo;ingestion sp\u00e9cialis\u00e9es, en particulier <code>read_sas()<\/code> pour les fichiers <code>.sas7bdat<\/code> et <code>.sas7bcat<\/code>, ainsi que <code>read_xpt()<\/code> pour les formats de transport r\u00e9glementaires.<\/p>\n<figure class=\"wpt-preserved-image\"><img fetchpriority=\"high\" decoding=\"async\" src=\"http:\/\/french.arabpsychology.com\/wp-content\/uploads\/2026\/09\/sasimport1.png\" alt=\"\" \/><\/figure>\n<h3>3.3 Param\u00e9trage du r\u00e9pertoire de travail et des chemins d&rsquo;acc\u00e8s<\/h3>\n<p>La gestion rigoureuse des chemins d&rsquo;acc\u00e8s sur le syst\u00e8me de fichiers constitue l&rsquo;une des pierres angulaires de l&rsquo;informatique reproductible. Une proportion substantielle des dysfonctionnements rencontr\u00e9s par les praticiens lors de l&rsquo;\u00e9tape d&rsquo;importation ne d\u00e9coule pas d&rsquo;une d\u00e9faillance du moteur de lecture, mais d&rsquo;une mauvaise r\u00e9solution des adresses physiques de stockage des fichiers. Sous les environnements d&rsquo;exploitation de type Windows, l&rsquo;utilisation traditionnelle de la barre oblique inverse (<em>backslash<\/em>, <code><\/code>) repr\u00e9sente une source chronique d&rsquo;erreurs d&rsquo;\u00e9chappement au sein des cha\u00eenes de caract\u00e8res R, o\u00f9 la barre oblique inverse agit comme un pr\u00e9fixe de s\u00e9quence sp\u00e9ciale (par exemple <code>n<\/code> ou <code>t<\/code>).<\/p>\n<p>Pour pr\u00e9venir ces ambigu\u00eft\u00e9s, la r\u00e8gle m\u00e9thodologique absolue consiste \u00e0 normaliser l&rsquo;ensemble des chemins d&rsquo;acc\u00e8s au moyen de barres obliques simples (<em>forward slashes<\/em>, <code>\/<\/code>), universellement reconnues par le moteur d&rsquo;ex\u00e9cution R ind\u00e9pendamment du syst\u00e8me h\u00f4te. De surcro\u00eet, le recours \u00e0 des chemins d&rsquo;acc\u00e8s absolus rigides (par exemple <code>C:\/Utilisateurs\/Chercheur\/Projet\/donnees.sas7bdat<\/code>) doit \u00eatre proscrit dans le cadre de la recherche scientifique : il an\u00e9antit toute possibilit\u00e9 d&rsquo;ex\u00e9cution sans reconfiguration sur une machine tierce, un serveur de calcul distant ou une infrastructure d&rsquo;int\u00e9gration continue.<\/p>\n<p>La solution m\u00e9thodologique d&rsquo;excellence repose sur l&rsquo;adoption conjointe des projets RStudio (fichiers <code>.Rproj<\/code>) et du package <a rel=\"noopener noreferrer\" href=\"https:\/\/here.r-lib.org\/\">here<\/a>. Ce dernier permet d&rsquo;ancrer le r\u00e9pertoire racine de travail au niveau de l&rsquo;arborescence du projet et de construire des chemins relatifs dynamiques r\u00e9silients aux variations d&rsquo;environnement d&rsquo;ex\u00e9cution. L&rsquo;arborescence recommand\u00e9e pour un projet d&rsquo;analyse int\u00e9grant des sources de donn\u00e9es SAS se structure typiquement de la fa\u00e7on suivante :<\/p>\n<ul>\n<li><code>racine_du_projet\/<\/code>\n<ul>\n<li><code>projet.Rproj<\/code> : Fichier de configuration de projet RStudio.<\/li>\n<li><code>scripts\/<\/code> : Dossier r\u00e9serv\u00e9 aux programmes de nettoyage, de mod\u00e9lisation et de visualisation.<\/li>\n<li><code>donnees_brutes\/<\/code> : R\u00e9pertoire d\u00e9di\u00e9 au stockage immuable des fichiers SAS sources (<code>.sas7bdat<\/code> et <code>.sas7bcat<\/code>).<\/li>\n<li><code>donnees_derivees\/<\/code> : Espace de sauvegarde des tables nettoy\u00e9es et s\u00e9rialis\u00e9es au format natif R.<\/li>\n<li><code>sorties\/<\/code> : R\u00e9pertoire de destination des graphiques vectoriels et des tableaux de r\u00e9sultats.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>4. Syntaxe fondamentale et param\u00e8tres de la fonction read_sas()<\/h2>\n<h3>4.1 Anatomie de l&rsquo;appel de base<\/h3>\n<p>L&rsquo;acc\u00e8s aux tables binaires SAS s&rsquo;op\u00e8re dans haven par l&rsquo;interm\u00e9diaire de la fonction <code>read_sas()<\/code>. Cette derni\u00e8re encapsule l&rsquo;ensemble de la tuyauterie de d\u00e9codage sous une signature programmatique claire et \u00e9pur\u00e9e. L&rsquo;appel le plus \u00e9l\u00e9mentaire se pr\u00e9sente sous la forme suivante :<\/p>\n<p><code>objet_donnees &lt;- read_sas(data_file = \"chemin\/vers\/fichier.sas7bdat\")<\/code><\/p>\n<p>Dans cette configuration fondamentale, la fonction prend pour argument principal <code>data_file<\/code>, qui correspond \u00e0 la cha\u00eene de caract\u00e8res d\u00e9signant l&#8217;emplacement physique du fichier de donn\u00e9es sur le disque. Le comportement par d\u00e9faut de la fonction d\u00e9clenche une inspection pr\u00e9alable de l&rsquo;en-t\u00eate binaire, alloue la m\u00e9moire n\u00e9cessaire, proc\u00e8de au d\u00e9sarchivage des pages s\u00e9quentiellement, instancie les vecteurs atomiques correspondants dans R et renvoie une structure de type tibble assign\u00e9e dans l&rsquo;environnement global \u00e0 l&rsquo;objet d\u00e9sign\u00e9.<\/p>\n<p>Toutefois, la signature formelle de la fonction r\u00e9v\u00e8le un ensemble de param\u00e8tres optionnels d&rsquo;une importance strat\u00e9gique pour le contr\u00f4le de l&rsquo;importation :<\/p>\n<p><code>read_sas(data_file, catalog_file = NULL, encoding = NULL, col_select = NULL, skip = 0L, n_max = Inf, .name_repair = \"unique\")<\/code><\/p>\n<p>Lorsque des catalogues de formats utilisateur ont \u00e9t\u00e9 \u00e9labor\u00e9s lors de la phase SAS, l&rsquo;argument <code>catalog_file<\/code> permet de renseigner le chemin d&rsquo;acc\u00e8s vers le fichier <code>.sas7bcat<\/code> aff\u00e9rent. En combinant ces deux sources lors du parsing initial, haven est capable de greffer automatiquement les d\u00e9finitions de formats cat\u00e9goriels aux valeurs num\u00e9riques sous-jacentes, \u00e9vitant ainsi des \u00e9tapes manuelles de recodage laborieuses et sujettes aux erreurs d&rsquo;inattention.<\/p>\n<h3>4.2 Param\u00e8tres d&rsquo;encodage des caract\u00e8res<\/h3>\n<p>La gestion de l&rsquo;encodage textuel repr\u00e9sente sans conteste l&rsquo;un des points de friction les plus critiques lors du traitement de fichiers cr\u00e9\u00e9s dans des environnements SAS anciens ou configur\u00e9s selon des param\u00e8tres r\u00e9gionaux sp\u00e9cifiques. Historiquement, SAS stockait les cha\u00eenes de caract\u00e8res en fonction de la table de pages de codes (<em>code page<\/em>) de la session active du syst\u00e8me d&rsquo;exploitation d&rsquo;origine. Ainsi, une base SAS g\u00e9n\u00e9r\u00e9e sous un syst\u00e8me Windows francophone d&rsquo;Europe occidentale utilisait fr\u00e9quemment l&rsquo;encodage Windows-1252 (CP1252) ou ISO-8859-1 (Latin1), tandis que les environnements modernes privil\u00e9gient quasi universellement le format universel Unicode UTF-8.<\/p>\n<p>Bien que les versions r\u00e9centes de SAS int\u00e8grent un indicateur d&rsquo;encodage au sein de l&rsquo;en-t\u00eate binaire du fichier <code>.sas7bdat<\/code>, il arrive fr\u00e9quemment que cet indicateur soit inexistant, impr\u00e9cis ou mal renseign\u00e9 par les proc\u00e9dures d&rsquo;exportation d&rsquo;origine. Si haven tente d&rsquo;interpr\u00e9ter un flux binaire cod\u00e9 en CP1252 sous une session R configur\u00e9e par d\u00e9faut en UTF-8 sans directive explicite, il en r\u00e9sultera l&rsquo;apparition de s\u00e9quences de caract\u00e8res alt\u00e9r\u00e9es (ph\u00e9nom\u00e8ne connu sous le nom de <em>mojibake<\/em>, transformant par exemple \u00ab \u00e9l\u00e8ve \u00bb en \u00ab &Atilde;&copy;l&Atilde;&uml;ve \u00bb) ou des erreurs bloquantes de transcription binaire rendant l&rsquo;importation impossible.<\/p>\n<p>L&rsquo;argument <code>encoding<\/code> de la fonction <code>read_sas()<\/code> permet de neutraliser rigoureusement cette difficult\u00e9 en sp\u00e9cifiant explicitement la table de d\u00e9codage \u00e0 appliquer aux segments textuels. En d\u00e9clarant par exemple <code>encoding = \"CP1252\"<\/code> ou <code>encoding = \"latin1\"<\/code>, l&rsquo;analyste contraint le parseur ReadStat \u00e0 traduire correctement chaque octet de cha\u00eene de caract\u00e8res vers l&rsquo;encodage natif UTF-8 utilis\u00e9 par le moteur R moderne. Cette pr\u00e9caution garantit l&rsquo;exactitude typographique absolue des libell\u00e9s de variables, des noms d&rsquo;items et des r\u00e9ponses qualitatives ouvertes.<\/p>\n<h3>4.3 Filtrage et s\u00e9lection s\u00e9lective \u00e0 l&rsquo;importation<\/h3>\n<p>Dans le contexte du traitement de m\u00e9gadonn\u00e9es ou de cohortes \u00e9pid\u00e9miologiques comportant plusieurs milliers de colonnes et des millions d&rsquo;individus, charger la totalit\u00e9 d&rsquo;un fichier SAS en m\u00e9moire vive constitue une pratique inefficace, susceptible de saturer la RAM et de d\u00e9grader drastiquement la r\u00e9activit\u00e9 de la station de travail. Le package haven int\u00e8gre des m\u00e9canismes d&rsquo;optimisation en amont, permettant de filtrer s\u00e9lectivement les structures de donn\u00e9es d\u00e8s l&rsquo;\u00e9tape de d\u00e9codage binaire.<\/p>\n<p>Le param\u00e8tre <code>col_select<\/code> fournit un levier d&rsquo;optimisation d&rsquo;une extr\u00eame \u00e9l\u00e9gance. En exploitant la syntaxe d&rsquo;\u00e9valuation ordonn\u00e9e (<em>tidyselect<\/em>), il permet de ne lire que les colonnes strictement indispensables \u00e0 la mod\u00e9lisation projet\u00e9e. L&rsquo;analyste peut sp\u00e9cifier un vecteur de noms de variables (ex. <code>col_select = c(identifiant, age, statut_vital)<\/code>), utiliser des s\u00e9lecteurs contextuels (ex. <code>col_select = starts_with(\"item_\")<\/code>) ou appliquer des exclusions d\u00e9lib\u00e9r\u00e9es (ex. <code>col_select = -c(adresse, telephone)<\/code>). Le moteur ReadStat contourne alors les octets correspondant aux colonnes d\u00e9laiss\u00e9es, acc\u00e9l\u00e9rant notablement le temps d&rsquo;ingestion.<\/p>\n<p>Compl\u00e9mentairement, les param\u00e8tres <code>n_max<\/code> et <code>skip<\/code> offrent un contr\u00f4le granulaire sur la dimension verticale du jeu de donn\u00e9es :<\/p>\n<ul>\n<li><code>n_max<\/code> : Sp\u00e9cifie le plafond maximal d&rsquo;observations \u00e0 importer (par exemple <code>n_max = 1000<\/code> pour extraire un \u00e9chantillon pilote d&rsquo;amor\u00e7age destin\u00e9 au prototypage d&rsquo;un algorithme).<\/li>\n<li><code>skip<\/code> : Commande au parseur d&rsquo;ignorer un nombre d\u00e9termin\u00e9 de lignes au d\u00e9but de la table d&rsquo;observations avant d&rsquo;initier la capture des donn\u00e9es.<\/li>\n<\/ul>\n<p>Ces m\u00e9canismes d&rsquo;extraction s\u00e9lective permettent d&rsquo;auditer des banques d&rsquo;informations monumentales de mani\u00e8re chirurgicale, sans jamais engorger l&rsquo;architecture m\u00e9moire du syst\u00e8me h\u00f4te.<\/p>\n<h2>5. Guide \u00e9tape par \u00e9tape : Importation pratique d&rsquo;un fichier SAS<\/h2>\n<h3>5.1 \u00c9tape 1 : T\u00e9l\u00e9chargement et localisation de la source de donn\u00e9es<\/h3>\n<p>Pour illustrer de mani\u00e8re concr\u00e8te et didactique le d\u00e9roulement op\u00e9ratoire d&rsquo;une importation, consid\u00e9rons un sc\u00e9nario empirique canonique : l&rsquo;analyse d&rsquo;une base de donn\u00e9es d&rsquo;\u00e9valuation de pr\u00e9f\u00e9rences de consommateurs, consign\u00e9e dans le fichier d&rsquo;exemple classique <code>cola.sas7bdat<\/code>. La premi\u00e8re d\u00e9marche consiste \u00e0 s&rsquo;assurer de l&rsquo;int\u00e9grit\u00e9 physique du fichier et de son positionnement rationnel au sein de l&rsquo;arborescence du projet informatique.<\/p>\n<p>Le fichier binaire doit \u00eatre d\u00e9pos\u00e9 au sein du sous-r\u00e9pertoire d\u00e9di\u00e9 aux donn\u00e9es sources non modifi\u00e9es, conventionnellement nomm\u00e9 <code>data\/<\/code> ou <code>donnees_brutes\/<\/code>. L&rsquo;analyste doit imp\u00e9rativement s&rsquo;abstenir de toute manipulation manuelle de renommage d&rsquo;extension ou d&rsquo;ouverture via des \u00e9diteurs de texte tiers qui risqueraient d&rsquo;ins\u00e9rer des caract\u00e8res de contr\u00f4le invisibles ou d&rsquo;alt\u00e9rer la structure binaire des pages d&rsquo;en-t\u00eate. Il convient \u00e9galement de v\u00e9rifier les autorisations du syst\u00e8me d&rsquo;exploitation pour garantir que l&rsquo;utilisateur ex\u00e9cutant la session R dispose des privil\u00e8ges de lecture (<em>read permissions<\/em>) sur le fichier cibl\u00e9.<\/p>\n<p>Une bonne pratique de gouvernance des donn\u00e9es consiste \u00e0 documenter d\u00e8s cette \u00e9tape la provenance du fichier au moyen d&rsquo;une somme de contr\u00f4le cryptographique (couramment un condensat MD5 ou SHA-256). Cette mesure garantit que l&rsquo;objet binaire pr\u00e9sent sur le disque correspond trait pour trait \u00e0 la version archiv\u00e9e dans le r\u00e9f\u00e9rentiel institutionnel, scellant ainsi la cha\u00eene de tra\u00e7abilit\u00e9 d\u00e8s le point d&rsquo;entr\u00e9e computationnel.<\/p>\n<h3>5.2 \u00c9tape 2 : Initialisation du script et chargement de la biblioth\u00e8que<\/h3>\n<p>L&rsquo;amorce de la proc\u00e9dure d&rsquo;analyse impose la r\u00e9daction d&rsquo;un script R rigoureusement structur\u00e9. Ce fichier de commandes, enregistr\u00e9 par exemple sous la d\u00e9signation <code>01_importation_donnees.R<\/code>, doit s&rsquo;ouvrir par un en-t\u00eate documentaire mentionnant l&rsquo;intitul\u00e9 du projet, le nom du chercheur ou analyste responsable, la date de cr\u00e9ation et la version de R employ\u00e9e. Afin de garantir l&rsquo;\u00e9tanch\u00e9it\u00e9 de l&rsquo;ex\u00e9cution, il est fortement d\u00e9conseill\u00e9 de compter sur des objets pr\u00e9existants en m\u00e9moire vive.<\/p>\n<p>Le chargement des biblioth\u00e8ques n\u00e9cessaires constitue l&rsquo;\u00e9tape subs\u00e9quente. Dans le cadre d&rsquo;un flux de travail respectant les meilleures pratiques, nous mobilisons le package haven pour l&rsquo;ingestion binaire, le package here pour la gestion dynamique des chemins, et l&rsquo;\u00e9cosyst\u00e8me dplyr pour les op\u00e9rations subs\u00e9quentes de validation structurelle :<\/p>\n<p><code># Initialisation des d\u00e9pendances logicielles<br \/>\nlibrary(haven)<br \/>\nlibrary(here)<br \/>\nlibrary(dplyr)<\/code><\/p>\n<p>L&rsquo;ex\u00e9cution de ces instructions ne doit lever aucun avertissement bloquant. La commande <code>library(haven)<\/code> s&rsquo;ex\u00e9cute silencieusement, rendant les primitives de lecture disponibles pour l&rsquo;ensemble des \u00e9tapes analytiques du pipeline.<\/p>\n<h3>5.3 \u00c9tape 3 : Ex\u00e9cution de la commande d&rsquo;importation<\/h3>\n<p>Une fois les pr\u00e9liminaires structurels accomplis, l&rsquo;importation de la table de donn\u00e9es s&rsquo;effectue par l&rsquo;appel formel \u00e0 <code>read_sas()<\/code>, en imbriquant la fonction <code>here()<\/code> pour garantir la parfaite r\u00e9solution du chemin relatif :<\/p>\n<p><code># Construction du chemin et ingestion des donnees binaires<br \/>\nchemin_fichier &lt;- here(\"donnees_brutes\", \"cola.sas7bdat\")<br \/>\ndonnees_cola &lt;- read_sas(data_file = chemin_fichier)<\/code><\/p>\n<p>Lors de l&rsquo;\u00e9valuation de cette ligne de code, l&rsquo;interpr\u00e9teur R communique le chemin d&rsquo;acc\u00e8s \u00e0 la biblioth\u00e8que ReadStat en sous-main. ReadStat ouvre le fichier binaire, analyse l&rsquo;en-t\u00eate, v\u00e9rifie l&rsquo;int\u00e9grit\u00e9 de la table, d\u00e9termine le nombre d&rsquo;observations et de variables, puis alloue directement les vecteurs atomiques au sein de la m\u00e9moire vive de R. \u00c0 la compl\u00e9tion de la routine, la console restitue la main \u00e0 l&rsquo;utilisateur sans g\u00e9n\u00e9rer d&rsquo;affichage verbeux superflu.<\/p>\n<p>Dans l&rsquo;interface de d\u00e9veloppement RStudio, le panneau d&rsquo;environnement (<em>Environment pane<\/em>) s&rsquo;enrichit instantan\u00e9ment d&rsquo;une nouvelle entit\u00e9 baptis\u00e9e <code>donnees_cola<\/code>. Cette mention confirme que la base matricielle SAS a \u00e9t\u00e9 d\u00e9s\u00e9rialis\u00e9e avec succ\u00e8s et r\u00e9side d\u00e9sormais sous forme d&rsquo;objet natif en m\u00e9moire, pr\u00eate \u00e0 \u00eatre inspect\u00e9e, nettoy\u00e9e et mod\u00e9lis\u00e9e.<\/p>\n<h2>6. Inspection structurelle et v\u00e9rification de l&rsquo;int\u00e9grit\u00e9 des donn\u00e9es<\/h2>\n<h3>6.1 \u00c9valuation de la classe et de la structure de l&rsquo;objet<\/h3>\n<p>L&rsquo;acquisition d&rsquo;un jeu de donn\u00e9es ne saurait \u00eatre consid\u00e9r\u00e9e comme valide sans un audit m\u00e9trologique rigoureux destin\u00e9 \u00e0 v\u00e9rifier la fid\u00e9lit\u00e9 de l&rsquo;importation. La premi\u00e8re inspection porte sur la classe intrins\u00e8que de l&rsquo;objet nouvellement g\u00e9n\u00e9r\u00e9. L&rsquo;application de la fonction <code>class()<\/code> renvoie un diagnostic structurel sans \u00e9quivoque :<\/p>\n<p><code>class(donnees_cola)<\/code><\/p>\n<p>Le r\u00e9sultat typique renvoy\u00e9 atteste de la nature composite de la structure : <code>\"tbl_df\"<\/code>, <code>\"tbl\"<\/code> et <code>\"data.frame\"<\/code>. Cette hi\u00e9rarchie d&rsquo;h\u00e9ritage objet confirme que la table b\u00e9n\u00e9ficie des m\u00e9thodes enrichies du format tibble tout en demeurant strictement r\u00e9trocompatible avec les fonctions exigeant un <code>data.frame<\/code> conventionnel de R de base.<\/p>\n<p>Pour diss\u00e9quer la morphologie d\u00e9taill\u00e9e des colonnes, la commande classique <code>str(donnees_cola)<\/code> ou, plus \u00e9l\u00e9gamment, la fonction <code>glimpse(donnees_cola)<\/code> issue de <code>dplyr<\/code>, offre une vue synoptique exceptionnelle. Cette fonction synth\u00e9tise sur quelques lignes le nombre total de lignes et de colonnes, liste l&rsquo;ensemble des identifiants de variables, expose leur type atomique imm\u00e9diat (num\u00e9rique double pr\u00e9cision <code>&lt;dbl&gt;<\/code>, cha\u00eene de caract\u00e8res <code>&lt;chr&gt;<\/code>, date <code>&lt;date&gt;<\/code>) et affiche les premi\u00e8res valeurs observ\u00e9es, tout en r\u00e9v\u00e9lant la pr\u00e9sence d&rsquo;attributs de m\u00e9tadonn\u00e9es sp\u00e9cifiques sur lesquels nous reviendrons en d\u00e9tail.<\/p>\n<h3>6.2 V\u00e9rification des dimensions m\u00e9triques<\/h3>\n<p>L&rsquo;\u00e9tape de validation m\u00e9trique fondamentale consiste \u00e0 confronter les dimensions physiques de l&rsquo;objet R obtenu avec la documentation de gestion de projet SAS d&rsquo;origine. Cette v\u00e9rification pr\u00e9vient toute troncature accidentelle imputable \u00e0 une saturation de l&rsquo;espace de stockage temporaire ou \u00e0 une interruption pr\u00e9matur\u00e9e du flux de lecture.<\/p>\n<p>La commande <code>dim(donnees_cola)<\/code> restitue un vecteur de longueur deux, dont le premier \u00e9l\u00e9ment quantifie le volume des observations et le second d\u00e9nombre les variables recens\u00e9es. De mani\u00e8re compl\u00e9mentaire et unitaire, les fonctions sp\u00e9cialis\u00e9es permettent d&rsquo;extraire ces scalaires :<\/p>\n<p><code>nb_lignes &lt;- nrow(donnees_cola)<br \/>\nnb_colonnes &lt;- ncol(donnees_cola)<\/code><\/p>\n<p>Dans un cadre de travail automatis\u00e9 ou au sein d&rsquo;un pipeline de validation continue, il est fortement conseill\u00e9 d&rsquo;int\u00e9grer des tests d&rsquo;assertion formels \u00e0 l&rsquo;aide de packages d\u00e9di\u00e9s comme <code>testthat<\/code> ou <code>assertr<\/code> :<\/p>\n<p><code>stopifnot(nb_lignes == 500)<br \/>\nstopifnot(nb_colonnes == 12)<\/code><\/p>\n<p>Ce protocole garantit qu&rsquo;en cas d&rsquo;\u00e9volution impr\u00e9vue du fichier source sur le disque (par exemple une extraction partielle ou corrompue), l&rsquo;ensemble de la cha\u00eene de scripts s&rsquo;interrompra imm\u00e9diatement, prot\u00e9geant le chercheur contre la formulation de conclusions erron\u00e9es \u00e9tablies sur des donn\u00e9es tronqu\u00e9es.<\/p>\n<h3>6.3 Inspection visuelle des premi\u00e8res et derni\u00e8res observations<\/h3>\n<p>La confirmation de la validit\u00e9 de l&rsquo;ingestion exige un examen direct des bornes matricielles. L&rsquo;ex\u00e9cution de la fonction <code>head(donnees_cola, n = 6)<\/code> permet d&rsquo;afficher les premiers enregistrements de la table pour contr\u00f4ler le bon positionnement des noms de colonnes et l&rsquo;absence d&rsquo;interversion de champs textuels ou num\u00e9riques.<\/p>\n<p>De mani\u00e8re tout aussi cruciale, l&rsquo;inspection des queues de distribution via <code>tail(donnees_cola, n = 6)<\/code> permet de v\u00e9rifier que la terminaison du fichier a \u00e9t\u00e9 lue conform\u00e9ment aux sp\u00e9cifications. Dans certains fichiers binaires SAS corrompus ou g\u00e9n\u00e9r\u00e9s par des ponts logiciels d\u00e9faillants, les derni\u00e8res pages de donn\u00e9es peuvent h\u00e9berger des blocs r\u00e9siduels nuls ou des enregistrements parasites non purg\u00e9s. L&rsquo;examen des derni\u00e8res lignes confirme la coh\u00e9rence des indicateurs d&rsquo;observation jusqu&rsquo;\u00e0 la fermeture du fichier.<\/p>\n<p>Par ailleurs, cette inspection visuelle rapide facilite la d\u00e9tection pr\u00e9coce d&rsquo;\u00e9ventuels d\u00e9calages d&rsquo;alignement horizontal qui auraient pu survenir si un d\u00e9limiteur de cha\u00eene non prot\u00e9g\u00e9 avait induit en erreur le moteur ReadStat (bien que cette anomalie soit rarissime avec les fichiers binaires <code>.sas7bdat<\/code> par rapport aux fichiers textuels plats).<\/p>\n<h2>7. Traitement approfondi des \u00e9tiquettes et des m\u00e9tadonn\u00e9es<\/h2>\n<h3>7.1 Compr\u00e9hension de la classe haven_labelled<\/h3>\n<p>L&rsquo;une des contributions conceptuelles les plus remarquables du package haven r\u00e9side dans sa gestion novatrice des \u00e9tiquettes descriptives SAS au travers de la classe d&rsquo;objet <code>haven_labelled<\/code>. Historiquement, les analystes effectuant une migration depuis SAS vers R \u00e9taient confront\u00e9s \u00e0 un dilemme insoluble : soit convertir imm\u00e9diatement les variables cat\u00e9gorielles cod\u00e9es en facteurs R (<em>factors<\/em>), perdant ainsi la valeur num\u00e9rique brute d&rsquo;origine et compliquant l&rsquo;ex\u00e9cution de certaines op\u00e9rations arithm\u00e9tiques, soit ne conserver que la valeur num\u00e9rique pure, \u00e9liminant totalement l&rsquo;\u00e9tiquette contextuelle indispensable \u00e0 la r\u00e9daction des rapports.<\/p>\n<p>Pour r\u00e9soudre cette antinomie, haven encapsule ces donn\u00e9es au sein d&rsquo;un vecteur num\u00e9rique atomique sous-jacent, enrichi de deux attributs de m\u00e9tadonn\u00e9es sp\u00e9cifiques :<\/p>\n<ul>\n<li><code>label<\/code> : Une cha\u00eene de caract\u00e8res descriptive d\u00e9finissant le sens s\u00e9mantique de la variable dans son ensemble (l&rsquo;\u00e9quivalent du <em>variable label<\/em> de SAS).<\/li>\n<li><code>labels<\/code> : Un vecteur num\u00e9rique nomm\u00e9 r\u00e9pertoriant la correspondance biunivoque entre chaque modalit\u00e9 num\u00e9rique discr\u00e8te et son \u00e9tiquette textuelle associ\u00e9e (l&rsquo;\u00e9quivalent des <em>value labels<\/em> de SAS).<\/li>\n<\/ul>\n<p>Si cette approche hybride offre une fid\u00e9lit\u00e9 d&rsquo;archivage exceptionnelle, elle pr\u00e9sente l&rsquo;inconv\u00e9nient d&rsquo;une compatibilit\u00e9 limit\u00e9e avec certaines fonctions statistiques traditionnelles de R de base (telles que <code>lm()<\/code>, <code>glm()<\/code> ou certaines fonctions graphiques de base), qui ne reconnaissent pas la classe <code>haven_labelled<\/code> et refusent d&rsquo;effectuer des calculs sur ces structures inhabituelles. Il incombe donc \u00e0 l&rsquo;analyste de piloter d\u00e9lib\u00e9r\u00e9ment la transformation de ces vecteurs vers des types R conventionnels selon les n\u00e9cessit\u00e9s de l&rsquo;investigation empirique.<\/p>\n<h3>7.2 Extraction et manipulation des \u00e9tiquettes de variables<\/h3>\n<p>L&rsquo;exploration des attributs de m\u00e9tadonn\u00e9es peut s&rsquo;effectuer au moyen des fonctions primitives de R ou en exploitant les utilitaires sp\u00e9cialis\u00e9s du package <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=labelled\">labelled<\/a>, un compagnon indispensable de haven. Pour extraire le libell\u00e9 descriptif global d&rsquo;une colonne sp\u00e9cifique, la commande de base s&rsquo;articule comme suit :<\/p>\n<p><code>libelle_variable &lt;- attr(donnees_cola$preference, \"label\")<\/code><\/p>\n<p>Pour auditer de mani\u00e8re exhaustive l&rsquo;ensemble des \u00e9tiquettes de variables d&rsquo;une table et g\u00e9n\u00e9rer un dictionnaire de donn\u00e9es automatis\u00e9, le package <code>labelled<\/code> simplifie consid\u00e9rablement la d\u00e9marche :<\/p>\n<p><code>library(labelled)<br \/>\ndictionnaire_variables &lt;- var_label(donnees_cola)<\/code><\/p>\n<p>Cette instruction renvoie une liste nomm\u00e9e associant chaque identifiant de colonne \u00e0 sa description textuelle. Ces m\u00e9tadonn\u00e9es s&rsquo;av\u00e8rent inestimables lors de l&rsquo;int\u00e9gration des tableaux de bord interactifs ou de l&rsquo;\u00e9dition automatique de graphiques avec <a rel=\"noopener noreferrer\" href=\"https:\/\/ggplot2.tidyverse.org\/\">ggplot2<\/a>, o\u00f9 le libell\u00e9 d&rsquo;origine peut \u00eatre inject\u00e9 de mani\u00e8re programmatique sur les axes de coordonn\u00e9es plut\u00f4t que de r\u00e9\u00e9crire manuellement des \u00e9tiquettes textuelles \u00e9ph\u00e9m\u00e8res :<\/p>\n<p><code>library(ggplot2)<br \/>\nggplot(donnees_cola, aes(x = preference)) +<br \/>\n&nbsp;&nbsp;geom_bar() +<br \/>\n&nbsp;&nbsp;labs(x = var_label(donnees_cola$preference), y = \"Frequence absolue\")<\/code><\/p>\n<h3>7.3 Conversion en facteurs R standards<\/h3>\n<p>Pour int\u00e9grer des variables \u00e9tiquet\u00e9es au sein de mod\u00e8les \u00e9conom\u00e9triques, de r\u00e9gressions logistiques ou de tables de contingence bivari\u00e9es, la conversion vers la classe <code>factor<\/code> de R s&rsquo;impose comme une n\u00e9cessit\u00e9 m\u00e9thodologique. Haven propose \u00e0 cet effet la fonction sp\u00e9cialis\u00e9e <code>as_factor()<\/code>, qui diff\u00e8re fondamentalement de la fonction de base <code>as.factor()<\/code> par sa capacit\u00e9 \u00e0 substituer intelligemment les valeurs num\u00e9riques sous-jacentes par leurs \u00e9tiquettes descriptives textuelles :<\/p>\n<p><code>donnees_nettoyees &lt;- donnees_cola %&gt;%<br \/>\n&nbsp;&nbsp;mutate(preference_facteur = as_factor(preference))<\/code><\/p>\n<p>Dans certains cas de figure, notamment lors de l&rsquo;estimation de mod\u00e8les psychom\u00e9triques ou de mod\u00e8les \u00e0 \u00e9quations structurelles, le statisticien souhaite au contraire conserver exclusivement les entiers purs pour traiter une \u00e9chelle de Likert comme un continuum quantitatif, tout en \u00e9liminant les attributs r\u00e9siduels pour all\u00e9ger la structure m\u00e9moire. La fonction <code>zap_labels()<\/code> permet d&rsquo;\u00e9radiquer chirurgicalement l&rsquo;ensemble des \u00e9tiquettes de modalit\u00e9s tout en pr\u00e9servant le vecteur atomique originel :<\/p>\n<p><code>donnees_numeriques_pures &lt;- donnees_cola %&gt;%<br \/>\n&nbsp;&nbsp;zap_labels()<\/code><\/p>\n<p>Il existe \u00e9galement la fonction <code>zap_label()<\/code> (au singulier), d\u00e9di\u00e9e \u00e0 la suppression de l&rsquo;\u00e9tiquette globale de la variable, offrant ainsi une latitude de normalisation absolue sur le jeu de donn\u00e9es.<\/p>\n<h2>8. M\u00e9thodes alternatives d&rsquo;importation de fichiers SAS<\/h2>\n<h3>8.1 Utilisation historique du package foreign<\/h3>\n<p>Avant l&rsquo;av\u00e8nement de haven et de la biblioth\u00e8que ReadStat, les utilisateurs de R recouraient de mani\u00e8re quasi exclusive au package <strong>foreign<\/strong>, composante historique distribu\u00e9e avec l&rsquo;installation de base du logiciel. Le package foreign renferme une fonction d\u00e9di\u00e9e aux transferts de fichiers SAS, intitul\u00e9e <code>read.xport()<\/code>.<\/p>\n<p>Toutefois, cette fonction souffre d&rsquo;une limitation r\u00e9dhibitoire dans le cadre de l&rsquo;ing\u00e9nierie moderne des donn\u00e9es : elle est strictement incapable d&rsquo;ing\u00e9rer les fichiers de tables natives <code>.sas7bdat<\/code>. Son champ d&rsquo;application se limite exclusivement aux fichiers au format de transport SAS XPORT V5. De surcro\u00eet, sa gestion des m\u00e9tadonn\u00e9es demeure rudimentaire, convertissant brutalement certaines colonnes sans pr\u00e9server les topologies de formats utilisateur complexes ni g\u00e9rer de mani\u00e8re fluide les encodages textuels internationaux.<\/p>\n<p>Bien que le package foreign conserve un int\u00e9r\u00eat ind\u00e9niable pour la maintenance de syst\u00e8mes patrimoniaux ou l&rsquo;ex\u00e9cution de scripts anciens sans d\u00e9pendance externe, son usage pour le d\u00e9veloppement de nouveaux pipelines analytiques est aujourd&rsquo;hui universellement d\u00e9conseill\u00e9 au profit de haven.<\/p>\n<h3>8.2 L&rsquo;approche du package sas7bdat<\/h3>\n<p>Pour r\u00e9pondre \u00e0 l&rsquo;incapacit\u00e9 historique de foreign \u00e0 lire les formats compil\u00e9s natifs, le chercheur Matthew Shotwell a d\u00e9velopp\u00e9 le package autonome <strong>sas7bdat<\/strong>, disponible sur le CRAN. L&rsquo;int\u00e9r\u00eat m\u00e9thodologique de cette contribution r\u00e9side dans le fait qu&rsquo;il s&rsquo;agissait de la toute premi\u00e8re tentative d&rsquo;ing\u00e9nierie inverse open-source document\u00e9e permettant de lire nativement les fichiers <code>.sas7bdat<\/code> sans exiger la pr\u00e9sence d&rsquo;une licence SAS sur la machine h\u00f4te.<\/p>\n<p>La syntaxe de mise en \u0153uvre est \u00e9l\u00e9mentaire :<\/p>\n<p><code>library(sas7bdat)<br \/>\ntable_donnees &lt;- read.sas7bdat(\"chemin\/vers\/fichier.sas7bdat\")<\/code><\/p>\n<p>N\u00e9anmoins, le package sas7bdat pr\u00e9sente des limitations techniques sensibles compar\u00e9 \u00e0 haven. \u00c9tant principalement cod\u00e9 en langage R avec des routines de d\u00e9s\u00e9rialisation non optimis\u00e9es en C pour les structures m\u00e9moires complexes, sa vitesse d&rsquo;ingestion s&rsquo;av\u00e8re consid\u00e9rablement plus lente sur des fichiers volumineux exc\u00e9dant quelques dizaines de m\u00e9gaoctets. En outre, il \u00e9choue fr\u00e9quemment \u00e0 d\u00e9coder les fichiers SAS ayant subi une compression binaire avanc\u00e9e (RDC) et ne propose pas de m\u00e9canisme robuste pour r\u00e9concilier les catalogues <code>.sas7bcat<\/code>. Par cons\u00e9quent, il demeure cantonn\u00e9 \u00e0 un r\u00f4le de solution de secours lorsque des contraintes d&rsquo;infrastructure emp\u00eachent la compilation de d\u00e9pendances C externes.<\/p>\n<h3>8.3 Connexions directes via ODBC et interfaces SAS<\/h3>\n<p>Dans les architectures d&rsquo;entreprise ou les environnements hospitaliers hautement s\u00e9curis\u00e9s, l&rsquo;analyste n&rsquo;a pas n\u00e9cessairement la permission d&rsquo;extraire des fichiers statiques volumineux sur son poste de travail local. Dans ces configurations, l&rsquo;acc\u00e8s direct aux donn\u00e9es SAS s&rsquo;op\u00e8re par l&rsquo;interm\u00e9diaire d&rsquo;une liaison client-serveur dynamique exploitant la norme <em>Open Database Connectivity<\/em> (ODBC) ou des connecteurs propri\u00e9taires d\u00e9di\u00e9s.<\/p>\n<p>En mobilisant conjointement les packages <a rel=\"noopener noreferrer\" href=\"https:\/\/dbi.r-dbi.org\/\">DBI<\/a> et <code>odbc<\/code>, il est possible d&rsquo;\u00e9tablir une liaison avec un serveur SAS ex\u00e9cutant le moteur <em>SAS Share<\/em> ou un serveur relationnel exposant des tables SAS via des pilotes officiels :<\/p>\n<p><code>library(DBI)<br \/>\ncon &lt;- dbConnect(odbc::odbc(),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Driver = \"SAS Server Driver\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Server = \"serveur_sas.institution.fr\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Port = 8561,<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;UID = \"identifiant\",<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PWD = \"mot_de_passe\")<\/code><\/p>\n<p>Une fois le pont relationnel \u00e9tabli, l&rsquo;extraction s&rsquo;op\u00e8re au moyen de requ\u00eates SQL standardis\u00e9es via la commande <code>dbGetQuery()<\/code>, d\u00e9l\u00e9guant au serveur SAS la charge computationnelle du filtrage, de l&rsquo;agr\u00e9gation et de la jointure des tables. L&rsquo;interrogation \u00e0 distance permet de rapatrier vers la session R locale uniquement la matrice d&rsquo;analyse condens\u00e9e, contournant \u00e9l\u00e9gamment les goulets d&rsquo;\u00e9tranglement de bande passante r\u00e9seau et de stockage local.<\/p>\n<h2>9. Gestion des jeux de donn\u00e9es volumineux et optimisation des performances<\/h2>\n<h3>9.1 Traitement par blocs (chunking) avec haven<\/h3>\n<p>Lorsque la taille physique d&rsquo;un fichier <code>.sas7bdat<\/code> exc\u00e8de la capacit\u00e9 de la m\u00e9moire vive disponible (par exemple un registre m\u00e9dico-\u00e9conomique de 40 gigaoctets sur une station dot\u00e9e de 16 Go de RAM), la tentative d&rsquo;importation unitaire au moyen de <code>read_sas()<\/code> provoque in\u00e9vitablement une erreur d&rsquo;\u00e9puisement m\u00e9moire (<em>vector memory exhausted<\/em>). La strat\u00e9gie de contournement standard r\u00e9side dans le traitement par blocs s\u00e9quentiels, commun\u00e9ment d\u00e9sign\u00e9 sous le terme de <em>chunking<\/em>.<\/p>\n<p>Haven propose \u00e0 cet effet une classe de fonctions hautement efficientes reposant sur le m\u00e9canisme des fonctions de rappel (<em>callback functions<\/em>), articul\u00e9es autour de <code>read_sas_chunked()<\/code> :<\/p>\n<p><code># Definition d'une routine de filtrage it\u00e9ratif<br \/>\nfiltrer_patients_actifs &lt;- function(morceau, index) {<br \/>\n&nbsp;&nbsp;morceau %&gt;%<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;filter(statut_vital == 1) %&gt;%<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;select(id_patient, date_inclusion, score_clinique)<br \/>\n}<\/p>\n<p># Execution du flux d'importation par blocs de 100 000 observations<br \/>\ndonnees_filtrees &lt;- read_sas_chunked(<br \/>\n&nbsp;&nbsp;data_file = \"registre_massif.sas7bdat\",<br \/>\n&nbsp;&nbsp;callback = DataFrameCallback$new(filtrer_patients_actifs),<br \/>\n&nbsp;&nbsp;chunk_size = 100000<br \/>\n)<\/code><\/p>\n<p>Dans ce paradigme s\u00e9quentiel, le moteur ReadStat lit exactement 100 000 enregistrements depuis le disque, applique imm\u00e9diatement la fonction R sp\u00e9cifi\u00e9e pour \u00e9laguer les variables et filtrer les observations non pertinentes, empile le r\u00e9sultat compact\u00e9 au sein d&rsquo;un accumulateur m\u00e9moire, puis lib\u00e8re les pages brutes avant de proc\u00e9der \u00e0 la lecture du bloc suivant. Cette approche permet de traiter des corpus monumentaux sur du mat\u00e9riel informatique standard sans jamais saturer la RAM.<\/p>\n<h3>9.2 Strat\u00e9gies d&rsquo;optimisation de la m\u00e9moire vive (RAM)<\/h3>\n<p>Au-del\u00e0 de la technique du traitement par morceaux, l&rsquo;optimisation de l&#8217;empreinte m\u00e9moire d&rsquo;un jeu de donn\u00e9es SAS requiert une vigilance rigoureuse quant au typage des colonnes. Par construction, SAS alloue 8 octets de pr\u00e9cision en virgule flottante pour chaque champ num\u00e9rique, y compris pour des variables n&rsquo;h\u00e9bergeant que des indicateurs bool\u00e9ens (0 ou 1) ou des entiers courts (codes postaux, classes d&rsquo;\u00e2ge). Une fois import\u00e9es dans R, ces colonnes consomment inutilement des volumes colossaux d&rsquo;espace m\u00e9moire.<\/p>\n<p>Apr\u00e8s l&rsquo;ingestion initiale, l&rsquo;application syst\u00e9matique de conversions de type permet de diviser fr\u00e9quemment l&rsquo;occupation m\u00e9moire par un facteur 2 \u00e0 4 :<\/p>\n<ul>\n<li>Conversion des identifiants et cha\u00eenes textuelles \u00e0 faible cardinalit\u00e9 en facteurs ou en entiers compacts.<\/li>\n<li>Transformation des variables flottantes sans composante d\u00e9cimale en entiers natifs R au moyen de <code>as.integer()<\/code> (4 octets par valeur au lieu de 8).<\/li>\n<li>Suppression d\u00e9finitive des objets interm\u00e9diaires \u00e0 l&rsquo;aide de l&rsquo;instruction <code>rm(objet)<\/code>, suivie d&rsquo;un appel explicite au ramasse-miettes via <code>gc()<\/code> pour forcer le syst\u00e8me d&rsquo;exploitation \u00e0 r\u00e9cup\u00e9rer la m\u00e9moire lib\u00e9r\u00e9e.<\/li>\n<\/ul>\n<p>De surcro\u00eet, pour les \u00e9tapes ult\u00e9rieures du projet, il est particuli\u00e8rement avantageux de s\u00e9rialiser imm\u00e9diatement la table nettoy\u00e9e vers des formats de stockage colonnaires ultra-rapides tels qu&rsquo;Apache <a rel=\"noopener noreferrer\" href=\"https:\/\/arrow.apache.org\/docs\/r\/\">Parquet<\/a> (via le package <code>arrow<\/code>). Le format Parquet assure une compression disque exceptionnelle, des vitesses de r\u00e9ouverture jusqu&rsquo;\u00e0 vingt fois sup\u00e9rieures \u00e0 celles d&rsquo;un fichier SAS natif et une pr\u00e9servation scrupuleuse des types de donn\u00e9es modernes.<\/p>\n<h3>9.3 Parall\u00e9lisation et benchmarking des m\u00e9thodes<\/h3>\n<p>L&rsquo;optimisation des flux de donn\u00e9es exige une \u00e9valuation empirique rigoureuse au moyen de protocoles de profilage et de micro-\u00e9valuation comparative (<em>benchmarking<\/em>). L&#8217;emploi du package <code>microbenchmark<\/code> permet de quantifier avec une pr\u00e9cision microsecondaire les performances temporelles des diff\u00e9rentes approches d&rsquo;importation :<\/p>\n<p><code>library(microbenchmark)<br \/>\ncomparaison &lt;- microbenchmark(<br \/>\n&nbsp;&nbsp;haven_complet = read_sas(\"echantillon.sas7bdat\"),<br \/>\n&nbsp;&nbsp;haven_select = read_sas(\"echantillon.sas7bdat\", col_select = c(\"id\", \"score\")),<br \/>\n&nbsp;&nbsp;times = 10<br \/>\n)<\/code><\/p>\n<p>Les r\u00e9sultats empiriques d\u00e9montrent invariablement que la vitesse d&rsquo;ingestion est majoritairement conditionn\u00e9e par la bande passante des op\u00e9rations d&rsquo;entr\u00e9e\/sortie (I\/O) du disque de stockage. L&rsquo;ex\u00e9cution de routines d&rsquo;importation depuis un disque \u00e0 semi-conducteurs NVMe (<em>Solid-State Drive<\/em>) surclasse les disques durs magn\u00e9tiques traditionnels par plusieurs ordres de grandeur.<\/p>\n<p>Cependant, il convient de souligner une contrainte architecturale structurelle : la lecture binaire s\u00e9quentielle d&rsquo;un fichier <code>.sas7bdat<\/code> ne se pr\u00eate pas ais\u00e9ment \u00e0 une parall\u00e9lisation multi-c\u0153urs na\u00efve. Contrairement \u00e0 des formats textuels partitionnables ou \u00e0 des tables partitionn\u00e9es en colonnes, l&rsquo;interd\u00e9pendance des pages compress\u00e9es impose une d\u00e9compression strictement lin\u00e9aire. D\u00e8s lors, le levier de performance le plus d\u00e9terminant ne r\u00e9side pas dans la multiplication artificielle des processus R parall\u00e8les, mais dans la restriction drastique du volume d&rsquo;octets transf\u00e9r\u00e9s depuis le support physique gr\u00e2ce au filtrage cibl\u00e9 par <code>col_select<\/code>.<\/p>\n<h2>10. Gestion des valeurs manquantes et anomalies de codage<\/h2>\n<h3>10.1 Valeurs manquantes sp\u00e9ciales propres \u00e0 SAS<\/h3>\n<p>L&rsquo;un des \u00e9cueils m\u00e9thodologiques les plus insidieux lors de la transition de SAS vers R concerne le traitement des donn\u00e9es non renseign\u00e9es. Dans l&rsquo;\u00e9cosyst\u00e8me R, la notion d&rsquo;absence de donn\u00e9es est mod\u00e9lis\u00e9e par une constante scalaire universelle : la valeur <code>NA<\/code> (<em>Not Available<\/em>), typ\u00e9e selon le vecteur h\u00f4te. En revanche, SAS int\u00e8gre un syst\u00e8me beaucoup plus granulaire autorisant jusqu&rsquo;\u00e0 27 codes distincts de valeurs manquantes pour les variables num\u00e9riques : le point standard (<code>.<\/code>) et 26 valeurs manquantes sp\u00e9ciales repr\u00e9sent\u00e9es par un point imm\u00e9diatement suivi d&rsquo;une lettre majuscule (<code>.A<\/code> \u00e0 <code>.Z<\/code>), compl\u00e9t\u00e9es par le caract\u00e8re de soulignement (<code>._<\/code>).<\/p>\n<p>Ces codes sp\u00e9cifiques jouent un r\u00f4le analytique crucial dans la recherche institutionnelle : ils permettent de qualifier la raison \u00e9pist\u00e9mologique ou technique motivant l&rsquo;absence de l&rsquo;information. Par exemple, au sein d&rsquo;une enqu\u00eate sociologique, un code <code>.A<\/code> peut signifier \u00ab Refus de r\u00e9pondre \u00bb, un code <code>.B<\/code> \u00ab Non applicable compte tenu du filtre de question pr\u00e9c\u00e9dent \u00bb, et un code <code>.C<\/code> \u00ab Donn\u00e9e d\u00e9truite ou illisible \u00bb.<\/p>\n<p>Par d\u00e9faut, l&rsquo;instruction <code>read_sas()<\/code> de haven unifie brutalement l&rsquo;ensemble de ces codes distincts sous un unique <code>NA<\/code> g\u00e9n\u00e9rique, annihilant toute la subtilit\u00e9 du sch\u00e9ma d&rsquo;enqu\u00eate d&rsquo;origine. Pour pr\u00e9server cette information primordiale, haven propose la structure avanc\u00e9e des valeurs manquantes \u00e9tiquet\u00e9es (<em>tagged NA<\/em>) :<\/p>\n<p><code># Pr\u00e9servation de la taxonomie des motifs d'absence<br \/>\ndonnees_qualifiees &lt;- read_sas(\"enquete.sas7bdat\")<br \/>\nvaleur_taggee &lt;- haven::tagged_na(\"A\")<br \/>\n# V\u00e9rification de la pr\u00e9sence du code d'absence sp\u00e9cifique<br \/>\nis_na_specifique &lt;- haven::is_tagged_na(donnees_qualifiees$item_salaire, \"A\")<\/code><\/p>\n<p>Cette fonctionnalit\u00e9 conf\u00e8re \u00e0 l&rsquo;analyste une rigueur m\u00e9thodologique absolue, lui permettant de documenter pr\u00e9cis\u00e9ment l&rsquo;attrition des cohortes et d&rsquo;appliquer des strat\u00e9gies d&rsquo;imputation multiple adapt\u00e9es aux motifs d\u00e9clar\u00e9s de non-r\u00e9ponse.<\/p>\n<h3>10.2 D\u00e9tection et recodage des valeurs aberrantes<\/h3>\n<p>Dans de nombreuses bases de donn\u00e9es patrimoniales \u00e9labor\u00e9es sous SAS, les concepteurs d&rsquo;enqu\u00eates ont contourn\u00e9 l&rsquo;usage formel des valeurs manquantes SAS en recourant \u00e0 des conventions empiriques de codage arbitraire, consistant \u00e0 consigner des entiers extr\u00eames n\u00e9gatifs ou positifs pour signaler l&rsquo;anomalie (par exemple <code>-99<\/code>, <code>-999<\/code>, <code>9999<\/code> pour exprimer le refus de r\u00e9ponse ou l&rsquo;erreur de saisie).<\/p>\n<p>Si ces vecteurs sont import\u00e9s dans R sans neutralisation pr\u00e9alable, l&rsquo;interpr\u00e9teur les consid\u00e9rera comme des valeurs quantitatives valides. L&rsquo;impact sur les m\u00e9triques synth\u00e9tiques \u00e9l\u00e9mentaires sera d\u00e9vastateur : le calcul d&rsquo;une moyenne arithm\u00e9tique ou l&rsquo;estimation d&rsquo;une variance empirique sera totalement biais\u00e9 par la pr\u00e9sence de ces sentinelles num\u00e9riques. L&rsquo;analyste doit donc d\u00e9ployer des proc\u00e9dures syst\u00e9matiques de recodage post-importation :<\/p>\n<p><code>donnees_corrigees &lt;- donnees_qualifiees %&gt;%<br \/>\n&nbsp;&nbsp;mutate(across(<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;where(is.numeric),<br \/>\n&nbsp;&nbsp;&nbsp;&nbsp;~ na_if(na_if(.x, -99), 999)<br \/>\n&nbsp;&nbsp;))<\/code><\/p>\n<p>L&rsquo;application rigoureuse de la fonction <code>na_if()<\/code> de dplyr substitue chirurgicalement les codes d&rsquo;anomalies connus par de v\u00e9ritables <code>NA<\/code> exploit\u00e9s par les algorithmes statistiques de R, restituant la validit\u00e9 des estimations param\u00e9triques.<\/p>\n<h3>10.3 Gestion des dates et horodatages SAS<\/h3>\n<p>L&rsquo;alignement temporel constitue une autre divergence fondamentale entre les deux architectures. Dans le syst\u00e8me SAS, les dates calendaires sont stock\u00e9es sous la forme d&rsquo;un nombre entier repr\u00e9sentant le nombre de jours \u00e9coul\u00e9s depuis le <strong>1er janvier 1960<\/strong> (les dates ant\u00e9rieures \u00e9tant mod\u00e9lis\u00e9es par des entiers n\u00e9gatifs). Les horodatages complets (<em>datetimes<\/em>) quantifient quant \u00e0 eux le nombre de secondes \u00e9coul\u00e9es depuis minuit le 1er janvier 1960.<\/p>\n<p>\u00c0 l&rsquo;oppos\u00e9, la convention informatique standard adopt\u00e9e par R, conforme au standard temporel POSIX, prend pour point d&rsquo;origine computationnel l&rsquo;\u00e9poque Unix, soit le <strong>1er janvier 1970<\/strong>. Il existe donc un d\u00e9calage structurel constant de 3 653 jours (incluant le d\u00e9compte des ann\u00e9es bissextiles intervenues entre 1960 et 1970) entre ces deux r\u00e9f\u00e9rentiels temporels.<\/p>\n<p>Fort heureusement, la fonction <code>read_sas()<\/code> de haven prend automatiquement en charge cette translation math\u00e9matique d\u00e8s lors que les colonnes SAS poss\u00e8dent un format de date d\u00e9clar\u00e9 (tel que <code>DATE9.<\/code>, <code>YYMMDD10.<\/code> ou <code>DATETIME20.<\/code>). Le moteur ReadStat applique la correction d&rsquo;\u00e9poque et instancie directement des objets de classe native R <code>Date<\/code> ou <code>POSIXct<\/code>. Toutefois, si la base SAS initiale a consign\u00e9 des dates dans de simples colonnes num\u00e9riques brutes sans leur assigner de format d&rsquo;affichage temporel explicite, R importera un entier anonyme. L&rsquo;analyste devra alors redresser manuellement le r\u00e9f\u00e9rentiel :<\/p>\n<p><code># Redressement manuel d'un scalaire temporel SAS sans format<br \/>\ndonnees_dates &lt;- donnees_cola %&gt;%<br \/>\n&nbsp;&nbsp;mutate(date_convertie = as.Date(date_brute_sas, origin = \"1960-01-01\"))<\/code><\/p>\n<p>Cette rigueur de conversion garantit l&rsquo;alignement calendaire parfait des s\u00e9ries chronologiques, des calculs de dur\u00e9es de survie et des analyses d&rsquo;\u00e9v\u00e9nements r\u00e9currents.<\/p>\n<h2>11. Application concr\u00e8te : Importation et traitement de donn\u00e9es psychom\u00e9triques<\/h2>\n<h3>11.1 Mod\u00e9lisation d&rsquo;une enqu\u00eate comportementale sous SAS<\/h3>\n<p>Afin de synth\u00e9tiser l&rsquo;ensemble de ces pr\u00e9ceptes m\u00e9thodologiques au sein d&rsquo;un cas d&rsquo;\u00e9cole r\u00e9aliste, nous allons d\u00e9ployer un pipeline de traitement complet appliqu\u00e9 \u00e0 une enqu\u00eate comportementale fictive mais repr\u00e9sentative des dispositifs de recherche en sciences humaines. Imaginons une base de donn\u00e9es de sant\u00e9 au travail, consign\u00e9e dans les fichiers <code>climat_social.sas7bdat<\/code> et <code>formats.sas7bcat<\/code>.<\/p>\n<p>Ce corpus comprend des variables sociod\u00e9mographiques (identifiant du travailleur, genre, anciennet\u00e9 en ann\u00e9es) et une batterie d&rsquo;items psychom\u00e9triques mesurant le sentiment d&rsquo;\u00e9puisement professionnel \u00e0 l&rsquo;aide d&rsquo;\u00e9chelles de Likert en 5 points (de 1 = \u00ab Jamais \u00bb \u00e0 5 = \u00ab Quotidiennement \u00bb). Au sein de l&rsquo;environnement SAS source, les items sont cod\u00e9s num\u00e9riquement sous les variables <code>burnout_1<\/code>, <code>burnout_2<\/code>, <code>burnout_3<\/code>, et sont reli\u00e9s \u00e0 un catalogue de formats externe d\u00e9finissant les intitul\u00e9s complets des questions et les libell\u00e9s de chaque modalit\u00e9 de r\u00e9ponse.<\/p>\n<h3>11.2 Pipeline complet d&rsquo;importation et de nettoyage<\/h3>\n<p>Le script d&rsquo;ingestion et de pr\u00e9traitement exploite la synergie entre haven, dplyr et le package psychom\u00e9trique <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=psych\">psych<\/a>. L&rsquo;objectif est d&rsquo;importer le fichier en liant son catalogue, de valider sa structure, de transformer les \u00e9tiquettes et de calculer un indice de consistance interne de l&rsquo;\u00e9chelle (alpha de Cronbach) :<\/p>\n<p><code># 1. Chargement des biblioth\u00e8ques sp\u00e9cialis\u00e9es<br \/>\nlibrary(haven)<br \/>\nlibrary(here)<br \/>\nlibrary(dplyr)<br \/>\nlibrary(labelled)<br \/>\nlibrary(psych)<\/p>\n<p># 2. D\u00e9finition des chemins vers les binaires et le catalogue<br \/>\nfichier_donnees &lt;- here(\"donnees_brutes\", \"climat_social.sas7bdat\")<br \/>\nfichier_catalogue &lt;- here(\"donnees_brutes\", \"formats.sas7bcat\")<\/p>\n<p># 3. Importation synchronis\u00e9e des donn\u00e9es et de leurs formats<br \/>\nenquete_brute &lt;- read_sas(<br \/>\n&nbsp;&nbsp;data_file = fichier_donnees,<br \/>\n&nbsp;&nbsp;catalog_file = fichier_catalogue,<br \/>\n&nbsp;&nbsp;encoding = \"UTF-8\"<br \/>\n)<\/p>\n<p># 4. Pipeline de nettoyage, transformation et audit<br \/>\nenquete_propre &lt;- enquete_brute %&gt;%<br \/>\n&nbsp;&nbsp;# Filtrage des enregistrements invalides<br \/>\n&nbsp;&nbsp;filter(!is.na(id_salarie)) %&gt;%<br \/>\n&nbsp;&nbsp;# Conversion du genre en facteur nominal avec libell\u00e9s descriptifs<br \/>\n&nbsp;&nbsp;mutate(genre = as_factor(genre)) %&gt;%<br \/>\n&nbsp;&nbsp;# Recodage d'\u00e9ventuelles valeurs sentinelles d'anomalies<br \/>\n&nbsp;&nbsp;mutate(across(starts_with(\"burnout_\"), ~ na_if(.x, 99)))<\/p>\n<p># 5. Extraction de la matrice num\u00e9rique d'items pour analyse de consistance<br \/>\nmatrice_items &lt;- enquete_propre %&gt;%<br \/>\n&nbsp;&nbsp;select(starts_with(\"burnout_\")) %&gt;%<br \/>\n&nbsp;&nbsp;zap_labels()<\/p>\n<p># 6. \u00c9valuation psychom\u00e9trique de l'\u00e9chelle (Alpha de Cronbach)<br \/>\nresultat_fiabilite &lt;- psych::alpha(matrice_items)<br \/>\nscore_alpha &lt;- resultat_fiabilite<span class=\"arabpsy-math-inline\" data-latex=\"total\">$total$<\/span>raw_alpha<\/code><\/p>\n<p>Gr\u00e2ce \u00e0 la pr\u00e9servation des m\u00e9tadonn\u00e9es lors de la phase <code>read_sas()<\/code>, le chercheur dispose \u00e0 la fois d&rsquo;une table analytique propre pour l&rsquo;\u00e9valuation psychom\u00e9trique et d&rsquo;un inventaire complet des intitul\u00e9s originels de questions pour l&rsquo;interpr\u00e9tation th\u00e9orique des facteurs.<\/p>\n<h3>11.3 Documentation et export du jeu de donn\u00e9es finalis\u00e9<\/h3>\n<p>L&rsquo;aboutissement de la d\u00e9marche m\u00e9thodologique consiste \u00e0 figer le corpus nettoy\u00e9 dans un conteneur p\u00e9renne, hautement document\u00e9 et facilement partageable au sein de la communaut\u00e9 scientifique. La premi\u00e8re \u00e9tape consiste \u00e0 g\u00e9n\u00e9rer un livre de codes (<em>codebook<\/em>) condensant les descripteurs de variables :<\/p>\n<p><code># G\u00e9n\u00e9ration du dictionnaire de m\u00e9tadonn\u00e9es<br \/>\nlivre_de_codes &lt;- tibble(<br \/>\n&nbsp;&nbsp;variable = names(enquete_propre),<br \/>\n&nbsp;&nbsp;description = unlist(var_label(enquete_propre)),<br \/>\n&nbsp;&nbsp;type = sapply(enquete_propre, typeof)<br \/>\n)<\/code><\/p>\n<p>Pour l&rsquo;archivage p\u00e9renne au sein de l&rsquo;environnement R, le recours \u00e0 la fonction native de s\u00e9rialisation d&rsquo;objet unique <code>saveRDS()<\/code> s&rsquo;impose comme la solution de r\u00e9f\u00e9rence :<\/p>\n<p><code>saveRDS(enquete_propre, file = here(\"donnees_derivees\", \"climat_social_consolide.rds\"))<\/code><\/p>\n<p>Contrairement aux archives binaires externes, un fichier <code>.rds<\/code> encapsule l&rsquo;int\u00e9gralit\u00e9 des classes R modernes, compresse efficacement le volume de stockage et garantit une restitution instantan\u00e9e de l&rsquo;environnement computationnel lors des sessions ult\u00e9rieures via l&rsquo;instruction sym\u00e9trique <code>readRDS()<\/code>, scellant ainsi l&rsquo;id\u00e9al de reproductibilit\u00e9 scientifique.<\/p>\n<h2>12. D\u00e9pannage syst\u00e9matique des erreurs courantes d&rsquo;importation<\/h2>\n<h3>12.1 Erreurs de chemin d&rsquo;acc\u00e8s et permissions de fichiers<\/h3>\n<p>Parmi la typologie des incidents techniques r\u00e9pertori\u00e9s lors des flux d&rsquo;importation, l&rsquo;exception <code>Error: '...' does not exist in current working directory<\/code> repr\u00e9sente l&rsquo;anomalie la plus r\u00e9currente. Cette d\u00e9faillance proc\u00e8de presque invariablement d&rsquo;une mauvaise appr\u00e9ciation du r\u00e9pertoire de travail actif ou d&rsquo;une coquille orthographique dans l&rsquo;extension du fichier (par exemple confondre un z\u00e9ro avec la lettre O, ou omettre le chiffre 7 dans <code>.sas7bdat<\/code>).<\/p>\n<p>Le premier geste diagnostique consiste \u00e0 interroger le r\u00e9pertoire courant au moyen de l&rsquo;instruction <code>getwd()<\/code> et \u00e0 v\u00e9rifier la visibilit\u00e9 physique du fichier cibl\u00e9 via la fonction d&rsquo;inspection syst\u00e8me :<\/p>\n<p><code>file.exists(\"chemin\/vers\/fichier.sas7bdat\")<\/code><\/p>\n<p>Si cette commande renvoie <code>FALSE<\/code>, il convient de passer en revue la pr\u00e9sence d&rsquo;espaces ins\u00e9cables, de caract\u00e8res accentu\u00e9s dans les noms de r\u00e9pertoires parents, ou de s&rsquo;assurer que le fichier n&rsquo;est pas verrouill\u00e9 exclusivement par une instance SAS concurrente ouverte en arri\u00e8re-plan sur la m\u00eame station. Sous Windows, une table ouverte en mode \u00e9dition exclusive sous l&rsquo;interface SAS bloque tout acc\u00e8s en lecture partag\u00e9e aux parseurs externes ; la fermeture de la session SAS lib\u00e8re instantan\u00e9ment le verrou de fichier (<em>file lock<\/em>) et autorise la lecture sans encombre par ReadStat.<\/p>\n<h3>12.2 Conflits d&rsquo;encodage et corruptions de caract\u00e8res<\/h3>\n<p>Les erreurs de d\u00e9codage textuel se manifestent typiquement par l&rsquo;\u00e9mission d&rsquo;avertissements explicites du type <code>Warning: Failed to parse string using encoding 'UTF-8'<\/code>, accompagn\u00e9s de troncatures inattendues de cha\u00eenes de caract\u00e8res ou de l&rsquo;apparition de symboles de remplacement (tels que le losange d&rsquo;interrogation <code>?<\/code>). Ce ph\u00e9nom\u00e8ne traduit une incompatibilit\u00e9 entre la page de codes d\u00e9clar\u00e9e dans l&rsquo;en-t\u00eate du fichier SAS et la s\u00e9quence d&rsquo;octets r\u00e9ellement grav\u00e9e sur le disque.<\/p>\n<p>Pour diagnostiquer l&rsquo;encodage r\u00e9el d&rsquo;un fichier en situation d&rsquo;\u00e9chec, l&rsquo;analyste peut mobiliser la commande de d\u00e9tection heuristique du package <code>readr<\/code> :<\/p>\n<p><code>readr::guess_encoding(\"chemin\/vers\/fichier.sas7bdat\")<\/code><\/p>\n<p>Bien que les fichiers binaires perturbent parfois les analyseurs heuristiques con\u00e7us pour le texte pur, cette inspection donne une indication pr\u00e9cieuse sur les tables de codes potentielles (telles que <code>ISO-8859-1<\/code>, <code>Windows-1252<\/code> ou <code>Shift-JIS<\/code>). Une fois l&rsquo;encodage probable identifi\u00e9, il suffit de contraindre la lecture en surchargeant l&rsquo;argument d\u00e9di\u00e9 au sein de haven :<\/p>\n<p><code>donnees &lt;- read_sas(\"fichier.sas7bdat\", encoding = \"WINDOWS-1252\")<\/code><\/p>\n<p>Cette directive ordonne au convertisseur interne d&rsquo;interpr\u00e9ter fid\u00e8lement la table d&rsquo;octets selon les tables r\u00e9gionales historiques, \u00e9liminant radicalement toute corruption des cha\u00eenes de caract\u00e8res.<\/p>\n<h3>12.3 \u00c9checs de parsing et incompatibilit\u00e9 de versions SAS<\/h3>\n<p>Dans des contextes d&rsquo;investigation sur des archives historiques, l&rsquo;analyste peut se trouver confront\u00e9 \u00e0 des tables issues de versions obsol\u00e8tes du syst\u00e8me SAS (telles que SAS Version 6, reconnaissables \u00e0 l&rsquo;extension <code>.sd2<\/code>). Le parseur <code>read_sas()<\/code> de haven a \u00e9t\u00e9 sp\u00e9cifiquement con\u00e7u pour les architectures modernes de la Version 7 \u00e0 la Version 9.4 (fichiers <code>.sas7bdat<\/code>) et refusera de traiter ces structures binaires primitives, levant une exception de type <code>Invalid file, or file has unsupported features<\/code>.<\/p>\n<p>Face \u00e0 une telle obsolescence, la solution la plus robuste consiste \u00e0 convertir pr\u00e9alablement l&rsquo;archive au format de transport normalis\u00e9 <code>.xpt<\/code> depuis une instance SAS d&rsquo;\u00e9mulation \u00e0 l&rsquo;aide de la proc\u00e9dure <code>PROC COPY<\/code> ou du moteur de transport CPORT, avant d&rsquo;importer le vecteur r\u00e9sultant dans R via <code>read_xpt()<\/code>.<\/p>\n<p>Un autre cas de blocage critique concerne les fichiers prot\u00e9g\u00e9s par un chiffrement cryptographique interne (fonctionnalit\u00e9 <code>ENCRYPT=AES<\/code> de SAS) ou verrouill\u00e9s par un mot de passe de table (options <code>READ=<\/code> ou <code>PW=<\/code>). La biblioth\u00e8que ReadStat ne disposant pas des m\u00e9canismes de r\u00e9tro-ing\u00e9nierie permettant de casser les algorithmes de chiffrement sym\u00e9trique du SAS Institute, ces tables chiffr\u00e9es ne peuvent \u00eatre d\u00e9s\u00e9rialis\u00e9es directement dans R. Elles n\u00e9cessitent imp\u00e9rativement un d\u00e9verrouillage pr\u00e9alable au sein de l&rsquo;environnement SAS agr\u00e9\u00e9 afin de produire une extraction binaire non prot\u00e9g\u00e9e ou un export interm\u00e9diaire s\u00e9curis\u00e9.<\/p>\n<h2>R\u00e9f\u00e9rences<\/h2>\n<ul>\n<li>Food and Drug Administration. (2003). <em>Guidance for industry: Part 11, Electronic records; electronic signatures \u2014 Scope and application<\/em>. U.S. Department of Health and Human Services. <a rel=\"noopener noreferrer\" href=\"https:\/\/www.fda.gov\/regulatory-information\/search-fda-guidance-documents\/part-11-electronic-records-electronic-signatures-scope-and-application\">https:\/\/www.fda.gov\/regulatory-information\/search-fda-guidance-documents\/part-11-electronic-records-electronic-signatures-scope-and-application<\/a><\/li>\n<li>M\u00fcller, K., &amp; Wickham, H. (2023). <em>tibble: Simple Data Frames<\/em> (Version 3.2.1) [Logiciel R]. CRAN. <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=tibble\">https:\/\/cran.r-project.org\/package=tibble<\/a><\/li>\n<li>R Core Team. (2024). <em>R: A language and environment for statistical computing<\/em>. R Foundation for Statistical Computing, Vienne, Autriche. <a rel=\"noopener noreferrer\" href=\"https:\/\/www.r-project.org\/\">https:\/\/www.r-project.org\/<\/a><\/li>\n<li>Revelle, W. (2024). <em>psych: Procedures for Psychological, Psychometric, and Personality Research<\/em> (Version 2.4.3) [Logiciel R]. Northwestern University, Evanston, Illinois. <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=psych\">https:\/\/cran.r-project.org\/package=psych<\/a><\/li>\n<li>SAS Institute Inc. (2018). <em>SAS 9.4 Language Reference: Concepts, Sixth Edition<\/em>. SAS Institute Inc., Cary, Caroline du Nord. <a rel=\"noopener noreferrer\" href=\"https:\/\/documentation.sas.com\/\">https:\/\/documentation.sas.com\/<\/a><\/li>\n<li>Shotwell, M. S. (2020). <em>ReadStat: A command-line tool and C library for reading files from popular stats packages<\/em> [Logiciel informatique]. GitHub. <a rel=\"noopener noreferrer\" href=\"https:\/\/github.com\/WizardMac\/ReadStat\">https:\/\/github.com\/WizardMac\/ReadStat<\/a><\/li>\n<li>Wickham, H., &amp; Grolemund, G. (2017). <em>R for Data Science: Import, Tidy, Transform, Visualize, and Model Data<\/em>. O&rsquo;Reilly Media. <a rel=\"noopener noreferrer\" href=\"https:\/\/r4ds.had.co.nz\/\">https:\/\/r4ds.had.co.nz\/<\/a><\/li>\n<li>Wickham, H., Hester, J., &amp; Bryan, J. (2024). <em>haven: Import and Export &lsquo;SPSS&rsquo;, &lsquo;Stata&rsquo; and &lsquo;SAS&rsquo; Files<\/em> (Version 2.5.4) [Logiciel R]. CRAN. <a rel=\"noopener noreferrer\" href=\"https:\/\/cran.r-project.org\/package=haven\">https:\/\/cran.r-project.org\/package=haven<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Guide complet et acad\u00e9mique pour importer des fichiers SAS dans R \u00e0 l&rsquo;aide du package haven. M\u00e9thodologie pas \u00e0 pas, gestion des \u00e9tiquettes et bonnes pratiques.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","template":"","categories":[1829,2193,2464],"tags":[2682,5256,5160,5258,5257],"class_list":["post-3168","psych_stat","type-psych_stat","status-publish","hentry","category-methodologie-statistique","category-programmation-r","category-science-des-donnees","tag-analyse-statistique","tag-haven","tag-importation-de-donnees","tag-rstudio","tag-sas7bdat"],"_links":{"self":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/3168","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=3168"}],"version-history":[{"count":1,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/3168\/revisions"}],"predecessor-version":[{"id":16455,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=\/wp\/v2\/psych_stat\/3168\/revisions\/16455"}],"wp:attachment":[{"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=3168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=3168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/french.arabpsychology.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=3168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}