Passer de SAS à R : 5 manipulations pour data managers

Vignette de l'article Passer de SAS à R : 5 manipulations pour data managers

Table des matières

Cette publication est la mise en forme d’une intervention réalisée le 6 mai dernier au congrès ACADM 2026, le congrès des data managers académiques, dans laquelle j’ai illustré par des exemples concrets comment R peut répondre aux besoins quotidiens du data management. La question du passage à R se pose aujourd’hui pour de nombreuses structures publiques, dans un contexte où la fin annoncée des licences SAS les amène à chercher des alternatives crédibles et pérennes.

Pourquoi R pour le data management ?

Avant les exemples, quelques arguments de fond : 

  • R est libre et gratuit. C’est une alternative crédible à SAS pour des structures qui doivent réduire leurs coûts de licence, sans renoncer à la qualité. Pour les data managers qui envisagent de passer de SAS à R, c’est un argument décisif.
  • R est particulièrement adapté au traitement des données collectées : nettoyage, contrôle qualité, transformation, harmonisation. C’est exactement le cœur du métier d’un data manager.
  • Le code R est lisible, structuré, traçable. Avec l’écosystème tidyverse, on enchaîne les étapes de traitement de manière limpide. Et chaque opération est traçable : on relit le script, on comprend ce qui a été fait, on peut le rejouer.
  • Les rapports sont automatisables. Avec Quarto (la nouvelle génération de R Markdown), on produit des rapports d’analyse complets, dynamiques, reproductibles — combinant texte, code et résultats.

R et RStudio : deux outils complémentaires

Avant d’aller plus loin, deux mots pour clarifier de quoi on parle. R et RStudio sont souvent évoqués ensemble, mais ce sont deux outils distincts.

 

R est le langage de programmation.

Logo du logiciel R

C’est lui qui exécute le code, fait les calculs, produit les graphiques. Il s’utilise via une console — mais une console toute seule n’est pas très confortable au quotidien.

RStudio est l’interface de développement (un IDE) conçue spécifiquement pour travailler avec R.

Logo de RStudio

C’est l’environnement où l’on écrit ses scripts, exécute son code, visualise ses résultats, et organise ses projets.

En pratique, on installe les deux : R d’abord (le moteur), RStudio ensuite (le tableau de bord). L’interface de RStudio se divise en quatre zones principales :

  • L’éditeur de scripts (haut gauche) — où l’on rédige son code, qu’on peut sauvegarder, partager et rejouer.

  • La console (bas gauche) — où le code s’exécute et où s’affichent les sorties textuelles.

  • L’environnement (haut droite) — qui liste tous les objets actifs : data frames, vecteurs, variables, fonctions…

  • Le panneau utilitaire (bas droite) — qui regroupe les fichiers du projet, les graphiques produits, les packages installés, l’aide.

Interface de RStudio avec ses quatre fenêtres principales

Cette organisation peut paraître chargée au premier abord, mais on s’y repère très vite. Et toute la suite : l’écriture de scripts reproductibles, l’enchaînement des manipulations, la production de rapports , se fait sans jamais quitter cet environnement unique.

Le jeu de données fil conducteur

Pour rendre les exemples concrets, j’utilise tout au long de cet article un même jeu de données fictif, nommé clinical_data.

Il s’agit de données cliniques simulées, longitudinales : chaque ligne représente un patient à une visite donnée (Screening, Mois 1, Mois 3). On y trouve typiquement un identifiant de sujet, un centre investigateur, un sexe codé numériquement, un âge, une date de randomisation, une date de visite, un score clinique (score de pression artérielle, score_bp), et un groupe de traitement.

Comme dans la vraie vie, le fichier de départ n’est pas propre :

  • les noms de variables sont hétérogènes (mélange de majuscules, espaces, accents)
  • les dates apparaissent dans plusieurs formats différents (jj/mm/aaaa, aaaa-mm-jj, parfois même en toutes lettres)
  • certaines variables sont codées numériquement sans libellé descriptif (sexe = 1 ou sexe = 2, sans plus d’information)
  • les centres investigateurs sont identifiés par des codes (101, 102, 103) qu’il faudra associer à des noms lisibles
Exemple de jeu de données cliniques utilisé comme fil conducteur dans l’article

Bref, un fichier représentatif de ce qu’on récupère quotidiennement en data management. C’est précisément ce désordre qui va servir de point d’appui pour illustrer ce que R, et plus particulièrement le tidyverse, permet de faire — proprement, simplement, et de manière reproductible.

library(readr)
clinical_data<- read_csv(here::here("data/clinical_data_messy.csv")) 

Le tidyverse : la syntaxe qui rend R lisible

Avant de plonger dans les exemples, un mot sur ce qui rend R particulièrement adapté au travail de data manager : le tidyverse. Le tidyverse est une collection cohérente de packages R conçus pour la manipulation, la transformation et la visualisation de données.

Packages principaux du méta-package tidyverse sous R

Chaque package couvre un domaine précisdplyr pour manipuler les data frames, tidyr pour les restructurer, lubridate pour les dates, stringr pour les chaînes de caractères, ggplot2 pour les graphiques.

L’ensemble repose sur une logique commune : des verbes simples pour chaque actionfilter()pour filtrer, select() pour sélectionner, mutate() pour créer ou transformer, rename() pour renommer.

Le principe clé qui rend le code particulièrement lisible est le pipe (|> ou %>%).

Il permet d’enchaîner les étapes naturellement, sans imbriquer les fonctions ou multiplier les objets intermédiaires.

Voici un exemple typique :

# pour ouvrir tous les packages du tidyverse
library(tidyverse)

clinical_data |>
  select(sexe, age, score_bp) |>
  filter(sexe == "F") |>
  mutate(age_cat = if_else(age > 50, "50+", "<50")) 

Cela se lit comme une phrase : “prendre les données clinical_data et puis, sélectionner trois variables, et puis filtrer les femmes, et puis créer une variable age_cat avec un if_else. »

Le code raconte l’histoire de la transformation, étape par étape. Cela facilite la relecture, l’audit, et le travail en équipe.

Le tidyverse, c’est donc à la fois une boîte à outils complète pour la quasi-totalité des tâches courantes de data management, et une syntaxe accessible qui rend la prise en main très rapide.

1. Nettoyer les noms de variables en une ligne

C’est l’une des premières difficultés quand on récupère un fichier de données collectées : des noms de colonnes hétérogènes, avec majuscules, espaces, accents, caractères spéciaux.

Exemple de noms de variables hétérogènes dans un jeu de données cliniques

Renommer une par une est fastidieux. Avec le package janitor, c’est une ligne :

library(janitor)
clinical_data_clean <- clinical_data |> 
  clean_names() 

Ici, le résultat de l’opération est stocké dans un nouvel objet nommé clinical_data_clean.

Passer de SAS à R - exemple de code R pour data manager

Harmoniser des dates dans tous les formats imaginables

Autre défi classique du data management : les dates. Dans un même fichier, une colonne de dates peut contenir 15/03/2024, 2024-03-15, 15 mars 2024, 03/15/2024, ou encore 15-03-24 , autant de formats différents à harmoniser avant de pouvoir travailler. C’est précisément ce qu’on retrouve dans le tableau clinical_data :

Exemple de dates écrites dans plusieurs formats différents dans un tableau de données

Le package datefixR règle ça en une commande :

library(datefixR)
clinical_data_clean <- clinical_data_clean |> 
  fix_date_df(c("rand_date", "visit_date")) 

Toutes les dates sont automatiquement normalisées au format ISO 8601 (YYYY-MM-DD), prêtes à être exploitées.

Dates automatiquement harmonisées au format ISO 8601 avec le package datefixR

Ajouter des labels aux variables et aux valeurs : la passerelle SAS

C’est sans doute l’argument qui parle le plus aux data managers issus de SAS : pouvoir associer à chaque variable un label descriptif, et à chaque code une décodification lisible. Le packagelabelled permet exactement ça :

library(labelled)


# Labels de variables
var_label(clinical_data_clean) <- list(
  subject_id = "Identifiant du sujet",
  site = "Centre investigateur",
  sexe = "Sexe du patient"
)

# Labels de valeurs
val_labels(clinical_data_clean$sexe) <- c("Homme" = 1, "Femme" = 2)
val_labels(clinical_data_clean$visit) <- c("Screening" = "SCR",
                                            "Mois 1" = "M1",
                                            "Mois 3" = "M3")
val_labels(clinical_data_clean$site) <- c("Lariboisière" = 101,
                                           "CHU Lyon" = 102,
                                           "IPC (Marseille)" = 103) 

Les  noms de variables restent courts pour le code, mais les libellés enrichis viennent documenter la base de données.

Important : lors de l’import de fichiers SAS dans R, les labels de variables sont automatiquement conservés dans R. La transition est donc transparente.

 

Visualiser le dictionnaire des variables

Une fois les labels en place, le package guideR permet de produire en une commande un dictionnaire complet de la base de données, exploitable directement dans RStudio :

library(guideR)

clinical_data_clean |>
  view_dictionary() 

On obtient un tableau qui croise, pour chaque variable : son nom court, son label descriptif, son type, et les libellés associés à ses valeurs codées. C’est un livrable extrêmement utile pour la documentation, l’audit, et la transmission de la base à un autre intervenant.

Passer de SAS à R - exemple de code R pour data manager"

Une fois les labels définis, ils peuvent aussi être repris automatiquement dans les graphiques et les tables, dès lors que les fonctions utilisées sont compatibles avec le format labelled (ce qui est le cas de la grande majorité des packages dédiés aux tables descriptives et à la visualisation).

Plus besoin de se rappeler que sexe = 1 correspond aux hommes : la sortie l’indique directement.

C’est l’un des grands intérêts d’investir un peu de temps pour poser les labels au début d’un projet : tout le travail aval (tables descriptives, graphiques, contrôles, rapports) en bénéficie automatiquement.

4. Combiner plusieurs tables : jointures et empilements

Le data management implique presque toujours de combiner plusieurs sources de données : enrichir une base patient avec un référentiel de centres, fusionner une cohorte de cas et une cohorte de témoins, agréger plusieurs exports d’extraction. R offre une syntaxe limpide pour ces opérations grâce à dplyr.

Enrichir avec une jointure

Imaginons que nos centres investigateurs soient codés (101, 102, 103) et qu’on dispose en parallèle d’une table de référence site_ref qui associe chaque code à la ville correspondante

Deux tables de données utilisées pour réaliser une jointure gauche avec dplyr

Pour enrichir clinical_data_clean avec ces informations, une seule fonction suffit :

clinical_data_clean <- clinical_data_clean |> 
  left_join(site_ref, by = "site")  

Voici le résultat : 

Résultat d’une jointure gauche enrichissant une table de données cliniques

left_join() conserve toutes les lignes de la table de gauche (clinical_data_clean) et y ajoute les colonnes correspondantes de la table de droite (site_ref), en s’appuyant sur la clé commune (site). C’est l’équivalent d’un MERGE SAS, en plus lisible. D’autres fonctions sont également disponibles :

  • inner_join() ne conserve que les lignes pour lesquelles une correspondance existe dans les deux tables.
  • right_join() fait l’inverse du left_join() : toutes les lignes de la table de droite sont conservées, même lorsqu’aucune correspondance n’existe dans la table de gauche.
  • full_join() conserve toutes les lignes des deux tables, qu’il y ait ou non une correspondance.
  • anti_join() permet d’identifier les lignes présentes dans une table mais absentes de l’autre – très utile pour détecter des sujets non appariés, des codes inconnus ou des problèmes de qualité de données.
  • semi_join() conserve uniquement les lignes de la première table ayant une correspondance dans la seconde, sans ajouter les colonnes de cette dernière

Empiler deux tables de même structure

Autre cas fréquent : on a constitué séparément une table patients et une table temoins, et on veut les empiler pour les analyser ensemble. La structure des deux tables est identique (mêmes variables, mêmes formats), on les concatène simplement :

Passer de SAS à R - exemple de code R pour data manager"
rdata_all <- patients |> 
  bind_rows(temoins) 

La fonction bind_rows() empile les lignes de la deuxième table sous celles de la première. À la différence d’une jointure, on n’ajoute pas de colonnes : on allonge la table en gardant la même structure.

Voici le résultat :

Table de données obtenue après concaténation des tables patients et temoins avec bind_rows

Restructurer une table avec pivot_wider() / pivot_longer()

Illustration du passage entre données au format long et format wide avec pivot_wider et pivot_longer

Restructurer les données : format long ↔︎ format wide

Les données cliniques sont souvent collectées en format long : une ligne par sujet × visite. Pour certaines analyses, présentations ou exports vers d’autres logiciels, on a besoin du format wide : une seule ligne par sujet, avec une colonne par visite. Le package tidyr permet de passer de l’un à l’autre en une commande. Du long au wide avec pivot_wider()

library(tidyr)

clinical_data_wide <- clinical_data_clean |>
  pivot_wider(
    id_cols = subject_id,
    names_from = visit,
    values_from = score_bp
  ) 
Jeu de données clinical_data_wide obtenu après transformation au format wide

Trois arguments structurent l’opération :

  • id_cols = subject_id indique la (ou les) colonne(s) qui identifient un sujet de manière unique. C’est ce qui sera conservé en ligne dans la table résultante.
  • names_from = visit indique que les noms des nouvelles colonnes vont être prélevés dans la variable visit. Si visit contient les valeurs SCR, M1, M3, on obtiendra trois colonnes nommées SCR, M1 et M3. values_from = score_bp indique la variable dont les valeurs vont remplir les nouvelles colonnes.

Résultat : une table avec une ligne par sujet, et trois colonnes correspondant aux scores à chacune des trois visites — pratique pour comparer en un coup d’œil l’évolution d’un patient.

Du wide au long avec pivot_longer()

L’opération inverse permet de revenir au format long. Utile par exemple pour produire un graphique avec ggplot2, qui fonctionne presque toujours mieux sur des données en format long.

clinical_data_long <- clinical_data_wide |>
  pivot_longer(
    cols = -subject_id,
    names_to = "visit",
    values_to = "score_bp"
  ) 
Passer de SAS à R - exemple de code R pour data manager"

Trois arguments cette fois aussi :

  • cols = -subject_id désigne les colonnes à empiler. La syntaxe -subject_id signifie “toutes les colonnes sauf subject_id”. On peut aussi lister explicitement les colonnes à concerner (par exemple cols = c(SCR, M1, M3)).
  • names_to = "visit" indique le nom de la nouvelle variable qui va contenir les anciens noms de colonnes (SCR, M1, M3). C’est l’inverse de names_from dans pivot_wider().
  • values_to = "score_bp"indique le nom de la nouvelle variable qui va contenir les valeurs. C’est l’inverse de values_from.

Résultat : on retrouve une table en format long (une ligne par sujet × visite), avec une colonne visit et une colonne score_bp. C’est strictement réversible ; on peut revenir au wide à tout moment avec pivot_wider().

Plus besoin de scripts complexes ou de macros SAS. Une commande, un résultat lisible, réversible avec pivot_longer() si besoin.

Pour retrouver davantage d’information sur le pivot de tables avec R, vous pouvez consulter mon article Format long vs format wide en R : comment utiliser pivot_longer sans se tromper

Et bien sûr : Quarto pour les rapports automatisés

Pour un data manager qui produit régulièrement des livrables , Quarto est l’outil qui change le plus profondément le quotidien.

Il permet de combiner texte, code R et résultats dans un document unique, exporté en HTML, PDF ou Word. Quand vos données changent, vous relancez le document en un clic, et tout se met à jour automatiquement. Quarto est la nouvelle génération de R Markdown (.Rmd), pensée pour être plus puissante, plus flexible et multi-langages (R, Python, Julia…). Quarto est directement intégré à R Studio.

Le principe : un script .qmd

Un document Quarto est un fichier .qmd qui combine trois éléments :

  • une en-tête YAML qui définit les paramètres globaux (titre, auteur, format de sortie, numérotation, bibliographie…)
  • du texte rédigé en Markdown, une syntaxe légère pour titres, listes, gras, liens
  • des chunks de code R exécutables, qui produisent tables, graphiques et résultats — intégrés automatiquement dans le document final
Correspondance entre un script Quarto .qmd et son rendu HTML

Les fonctionnalités qui font gagner du temps

  • Numérotation automatique des tables, figures et sections, avec références croisées qui se mettent à jour toutes seules.
  • Bibliographie intégrée : RStudio propose une interface de gestion bibliographique directement reliée aux principales bases de données (PubMed, Crossref, DOI, Zotero…). Les références s’ajoutent en un clic depuis le menu Insert > Citation — un fichier .bib est alors créé et alimenté automatiquement en arrière-plan, sans qu’on ait à le manipuler. À la compilation, les citations apparaissent dans le format choisi (Vancouver, APA…) et la bibliographie complète est générée en fin de document..
  • Multi-format : un seul fichier source peut produire un HTML interactif, un PDF formaté, ou un Word — en changeant deux lignes d’en-tête.

C’est exactement le type d’outil qu’on attend en data management : reproductible, traçable, multi-format, automatisable. Une fois qu’on l’a adopté, on ne revient plus en arrière!

Le passage de SAS à R : moins difficile qu’il n’y paraît

L’un des freins les plus fréquents au passage à R est la crainte de la difficulté. En pratique :

  • Dès lors que l’on a l’habitude de coder, la prise en main est progressive.
  • L’écosystème tidyverse propose une syntaxe simple, cohérente, lisible — même pour des débutants.
  • Les outils d’intelligence artificielle (ChatGPT, Claude…) facilitent l’apprentissage et débloquent rapidement les difficultés de code.
  • L’essentiel est d’acquérir les bases, qui restent accessibles et rapidement mobilisables en pratique.

Aller plus loin : la formation R pour la data analyse

Si cet article vous donne envie d’aller plus loin, je propose plusieurs formations professionnelles en distanciel, en petit groupe (environ 5 participants) :

Tarif : 1 500 € HT pour les formations de 3 jours, 500 € HT pour les ateliers d’une journée.

Certaines de ces formations sont mutualisées avec un organisme certifié Qualiopi, ce qui permet d’envisager une prise en charge par votre OPCO. Pour un format intra-entreprise ou un devis personnalisé, n’hésitez pas à me contacter.

Portrait de Claire Della Vedova, consultante et formatrice en biostatistique et langage R

Je suis Claire Della-Vedova, consultante en biostatistique, méthodologie clinique et expertise R.

J’accompagne les fabricants de dispositifs médicaux et les équipes scientifiques des sciences du vivant dans leurs projets d’évaluation clinique, d’analyse statistique et d’analyse de données sous R.

🎓 Formations professionnelles R et biostatistiques 

🤝 Prestations et accompagnement sur mesure 

📅 Discuter d’un accompagnement ou d’une prestation sur mesure  

Commentaires

2 réponses

  1. Super Clair,
    J’adore vos blogs, toujours très clairs et très pédagogiques qui donnent envie de pratiquer en toute sérénité .
    Je transmets ce blog à mon fils qui est data analyst dans une société en Angleterre et l’incite fortement à se former et à pratiquer ce language R .
    Continuez à stimuler nos motivations .
    Bien cordialement.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Fonctions statistiques R

Aide mémoire off'R ;)

Enregistrez vous pour recevoir gratuitement mes fiches « aide mémoire » (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R et pour être informés des mises à jour du site.