
Lorsque j’anime des formations sur l’utilisation du logiciel R, j’explique aux stagiaires comment utiliser ChatGPT (ou d’autres modèles de langage avancés) pour les aider à résoudre leurs problèmes de programmation. Je constate que si ce recours aux IA est évident pour certains, il est complètement inutilisé par d’autres. Pourtant, ces outils peuvent réellement permettre de surmonter des difficultés techniques et de gagner du temps. Ils sont aussi de formidables outils d’apprentissage.
Dans cet article, je vous montre comment j’utilise concrètement ChatGPT lorsque je travaille avec R, en espérant que cela aidera celles et ceux qui n’utilisent pas encore cet outil, à essayer, et à se lancer.
Je précise que je ne suis pas une experte en rédaction de prompts : mon utilisation est assez basique, mais elle s’avère efficace dans la plupart des cas.
J’utilise régulièrement ChatGPT (et parfois Mistral, un modèle français) pour
J’aimerais compléter cet article avec vos propres usages ! Si vous utilisez ces outils pour d’autres tâches liées à la programmation en R, partagez-les en commentaire, avec un exemple précis. Ensemble, nous pourrions constituer une véritable boîte à outils pour les utilisateurs de R.
J’utilise principalement ChatGPT, mais aussi quelques fois Mistral qui est un LMM français.
Vous pourrez y accéder avec les liens suivants :
ChatGPT : https://chatgpt.com
Mistral : https://mistral.ai/fr
Il en existe d’autres, comme Gemini, ou Claude, mais je ne les utilise pas.
L’accès à ces outils est gratuit, mais requiert la création d’un compte. Pour ma part, j’utilise une version payante de ChatGPT, mais la version gratuite me semble largement suffisante pour la plupart des usages.
Imaginons que je veuille remplacer les valeurs manquantes de toutes les variables numériques d’un data frame par leur moyenne. Et que pour rester cohérente avec ma façon de travailler sous R, je souhaite le faire en employant des fonctions du package tidyverse
Voici comment je rédige ma demande dans ChatGPT, et ce que j’obtiens :

Il me reste plus qu’à essayer, en copiant-collant le code fourni, dans la console ou dans mon script.
library(tidyverse)
# Exemple de data frame avec des valeurs manquantes
df <- tibble(
var1 = c(1, 2, NA, 4, 5),
var2 = c(NA, 3, 4, NA, 6),
var3 = c("A", "B", "C", "D", "E") # Variable non numérique
)
# Remplacement des NA par la moyenne de chaque variable numérique
df_clean <- df %>%
mutate(across(where(is.numeric), ~ replace_na(., mean(., na.rm = TRUE))))
# Affichage du résultat
print(df_clean)
# A tibble: 5 × 3
var1 var2 var3
<dbl> <dbl> <chr>
1 1 4.33 A
2 2 3 B
3 3 4 C
4 4 4.33 D
5 5 6 E Cela fonctionne, le NA sont bien remplacées par les moyennes des colonnes.
Mais quand j’essaye avec le jeu de données airquality (nativement présent dans R, vous n’avez pas besoin de le télécharger), qui contient quelques NA, j’obtiens un message d’erreur :
airquality_clean <- airquality %>%
mutate(across(where(is.numeric), ~ replace_na(., mean(., na.rm = TRUE))))
Error in `mutate()`:
ℹ In argument: `across(where(is.numeric), ~replace_na(., mean(., na.rm =
TRUE)))`.
Caused by error in `across()`:
! Can't compute column `Ozone`.
Caused by error in `vec_assign()`:
! Can't convert from `replace` <double> to `data` <integer> due to loss of precision.
• Locations: 1 Dans ce cas-là, je ne me laisse pas abatre ! Je copie-colle le code et le message d’erreur dans ChatGPT pour obtenir une correction.

Et j’essaye le code corrigé :
airquality_clean <- airquality %>%
mutate(across(where(is.numeric), ~ replace_na(as.numeric(.), mean(., na.rm = TRUE)))) Je n’obtiens plus de message d’erreur. Je peux ensuite vérifier de manière plus spécifique. Par exemple, ici, dans le jeu de données airquality, la première NA de la variable Ozone est en ligne 5. Je peux vérifier la substitution par la moyenne, avec les commandes suivantes :
airquality$Ozone[5]
[1] NA
mean(airquality$Ozone, na.rm=TRUE)
[1] 42.12931
airquality_clean$Ozone[5]
[1] 42.12931 La NA en 5ème position a bien été remplacée par la moyenne de la colonne.
Imaginons que je souhaite transformer le code précédent en une fonction, pour pouvoir l’utiliser sur d’autres jeux de données.
Voici comment je rédige ma demande dans ChatGPT, et la réponse obtenue :

Là encore, il ne me reste plus qu’à copier-coller le code dans la console ou dans mon script R, pour tester :
library(tidyverse)
# fonction créée par chatGPT
impute_na_with_mean <- function(data) {
data %>%
mutate(across(where(is.numeric), ~ replace_na(as.numeric(.), mean(., na.rm = TRUE))))
}
# Exemple de jeu de données avec des valeurs manquantes
df_example <- tibble(
col1 = c(1, 2, NA, 4, 5),
col2 = c(NA, 3, 4, NA, 6),
col3 = c("A", "B", "C", "D", "E") # Variable non numérique
)
# Appliquer la fonction sur df_example
df_example_clean <- impute_na_with_mean(df_example)
# Afficher le résultat
print(df_example_clean)
# A tibble: 5 × 3
col1 col2 col3
<dbl> <dbl> <chr>
1 1 4.33 A
2 2 3 B
3 3 4 C
4 4 4.33 D
5 5 6 E Ca fonctionne !
Remarque : Pour passer à la ligne dans ChatGPT (pour entrer les balises ///), il faut utiliser le raccourci clavier Maj + Entrée. Ces balises ne sont pas obligatoires, mais j’ai lu que cela permettait à l’IA de mieux comprendre la demande.
Parfois, quand j’exécute du code, R me renvoie un message d’erreur que je ne comprends pas, ou que je ne sais pas comment résoudre. Dans ce cas, je demande à ChatGPT de m’aider à corriger ce code.
C’est ce que j’ai fait plus haut lorsque j’ai essayé de remplacer les NA du jeu de données airquality par la moyenne de chaque variable numérique, et que j’ai obtenu un message d’erreur.
Mais voyons un second exemple. Imaginons que je veuille filtrer les données iris (présentes nativement dans R, vous n’avez pas besoin de la charger) pour ne garder que les observations de l’espèce setosa, en employant ce code :
setosa <- iris %>%
filter(Species == "setosa") J’obtiens le message d’erreur suivant :
Error in iris %>% filter(Species == "setosa") :
could not find function "%>%" 
Encore une fois, je copie colle le code et le message d’erreur dans ChatGPT pour obtenir une correction :
Ici, il me propose d’ajouter la ligne library(dplyr) pour charger le package dplyr qui contient la fonction %>%. Je teste :
library(dplyr)
setosa <- iris %>%
filter(Species == "setosa") Cela fonctionne.
Imaginons que je veuille calculer la moyenne d’une variable qui contient une ou plusieurs données manquantes (NA) et que j’obtiens NA à la place de la moyenne, parce que je ne sais pas qu’il est nécessaire d’employer l’argument na.rm=TRUE de la fonction mean() pour exclure les valeurs manquantes du calcul de la moyenne :
mydata <- data.frame(x = c(1, 2, NA, 4, 5), y = c(NA, 3, 4, NA, 6))
mean(mydata$x)
[1] NA Dans cette situation, e demande à ChatGPT de m’expliquer pourquoi j’obtiens NA à la place de la moyenne de la variable x, en. lui fournissant le code et la sortie :

Imaginons que j’aie récupéré le bout de code suivant, mais que je ne le comprenne que partiellement.
iris2 <- iris %>%
pivot_longer(
cols = -Species,
names_to = "Mesure",
values_to = "Valeur"
) Dans cette situation, je demande à ChatGPT de me l’expliquer, en copiant-collant le code dans son prompt, comme ceci :

Il m’arrive fréquemment de commencer à coder un graphique, puis de l’améliorer ou de le personnaliser avec chatGPT. Cela peut se faire itérativement, en demandant à l’IA d’ajouter des éléments les uns après les autres.
Par exemple, j’ai récupéré ici , ce code, qui permet de faire le graphique suivant :
# Libraries
library(ggplot2)
# Create data
data <- data.frame(
x=LETTERS[1:26],
y=abs(rnorm(26))
)
# Horizontal version
ggplot(data, aes(x=x, y=y)) +
geom_segment( aes(x=x, xend=x, y=0, yend=y), color="skyblue") +
geom_point( color="blue", size=4, alpha=0.6) +
theme_light() +
coord_flip() +
theme(
panel.grid.major.y = element_blank(),
panel.border = element_blank(),
axis.ticks.y = element_blank()
) 
Imaginons que je souhaite réordonner les données par ordre décroissant de valeur de y, et que je souhaite ajouter une couleur différente pour les valeurs supérieures à 1.5.
Voici comment je formule ma demande dans le prompt :

Voici ce que j’ai obtenu :
library(ggplot2)
library(dplyr)
# Créer les données
set.seed(123) # Pour rendre les résultats reproductibles
data <- data.frame(
x = LETTERS[1:26],
y = abs(rnorm(26))
)
# Trier les données par ordre décroissant de y
data <- data %>%
arrange(desc(y)) %>%
mutate(color = ifelse(y > 1.5, "red", "blue")) # Ajouter une couleur conditionnelle
# Version horizontale avec couleurs conditionnelles
ggplot(data, aes(x = reorder(x, y), y = y)) + # Réordonne x en fonction de y
geom_segment(aes(x = x, xend = x, y = 0, yend = y), color = "skyblue") +
geom_point(aes(color = color), size = 4, alpha = 0.6) +
scale_color_identity() + # Utilisation directe des couleurs définies
theme_light() +
coord_flip() +
theme(
panel.grid.major.y = element_blank(),
panel.border = element_blank(),
axis.ticks.y = element_blank()
) Et voici le résultat :

C’est une bonne habitude de commenter son code pour le rendre plus lisible et pour faciliter la reproductibilité de l’analyse.
Mais, en pratique, quand je réalise une analyse, je ne commente pas toujours régulièrement mon code. Alors, lorsque j’ai terminé, je demande à ChatGPT de le faire pour moi. C’est un gain de temps considérable, je n’ai qu’à relire et faire de petites corrections si besoin.
Dans cet exemple, je vais demander à chatGPT d’annoter ce code:
library(parameters)
library(performance)
library(emmeans)
gapdata_fit <- aov(lifeExp~continent, data=gapdata)
summary(gapdata_fit)
check_model(gapdata_fit)
check_normality(gapdata_fit)
check_homogeneity(gapdata_fit)
mc <- emmeans(gapdata_fit, specs=pairwise~continent)
mc
plot(mc, comparisons = TRUE) Voici ma demande :

Voici ce que j’ai obtenu :
# Chargement des bibliothèques nécessaires
library(parameters) # Outils pour examiner les modèles statistiques
library(performance) # Vérification des hypothèses des modèles
library(emmeans) # Comparaisons multiples des moyennes ajustées
# Ajustement d'une ANOVA à un facteur (continent) sur la variable lifeExp
gapdata_fit <- aov(lifeExp ~ continent, data = gapdata)
# Résumé des résultats de l'ANOVA
summary(gapdata_fit)
# Vérification des hypothèses du modèle
check_model(gapdata_fit) # Diagnostic global du modèle
check_normality(gapdata_fit) # Test de normalité des résidus
check_homogeneity(gapdata_fit) # Test d'homogénéité des variances
# Comparaisons multiples entre les niveaux du facteur 'continent'
mc <- emmeans(gapdata_fit, specs = pairwise ~ continent)
# Affichage des moyennes ajustées et des comparaisons par paires
mc
# Visualisation des comparaisons multiples
plot(mc, comparisons = TRUE) Fournissez des données exploitables : Copiez-collez un extrait de vos données directement dans le prompt afin que l’IA puisse mieux comprendre votre demande et proposer une solution adaptée (uniquement si vos données ne sont pas confidentielles).
Soyez précis dans votre demande : Plus votre demande sera précise, plus vous aurez de chances d’obtenir une réponse pertinente. N’hésitez pas à détailler votre problème, vos attentes et les contraintes éventuelles.
Soyez cohérent dans votre code : Si vous adoptez déjà un style de programmation spécifique (par exemple, le tidyverse), indiquez-le dans votre demande pour assurer une intégration harmonieuse du code généré à votre script existant.
Testez le code généré : Avant d’intégrer le code généré par ChatGPT à votre script, exécutez-le dans la console afin de vérifier qu’il répond bien à vos attentes et ne génère pas d’erreurs.
Comme vous avez pu le voir dans cet article, ChatGPT peut être une aide préciseuse pour travailler avec R : génération de code, correction d’erreurs, explication de scripts, personnalisation de graphiques… Il permet non seulement de gagner du temps, mais aussi d’apprendre en obtenant, instantanément, des réponses à vos questions.
N’oubliez pas de tester et de vérifier le code produit ; les réponses ne sont pas exactes dans 100% des situations (je dirai que c’est OK dans 80% des cas)
J’espère que cet article aidera les débutants à mieux comprendre comment utiliser l’IA pour faciliter leur apprentissage de R.
Et vous, utilisez-vous ChatGPT (ou d’autres IA) pour travailler avec R ? Avez-vous des astuces, des cas d’usage ou des exemples concrets où ces outils vous ont été particulièrement utiles ? Partagez vos expériences en commentaire, je mettrai à jour cet article avec vos contributions pour en faire une ressource encore plus complète !
Dans un prochain article, je vous parlerai de GitHub Copilot, l’assistant de programmation qui permet de coder avec une IA directement dans RStudio.
Abonnez-vous gratuitement à la lettre de diffusion du blog pour ne rien manquer !
Vous serez directement informés de la publication de mes nouveaux articles, de la mise à disposition de ressources exclusives, et des actualités sur mes formations.
Vous recevrez également un cadeau 🎁 de bienvenu : des fiches « aide mémoire » (ou cheat sheets) qui vous permettront de réaliser facilement les principales analyses biostatistiques avec le logiciel R
Vous pouvez soutenir mon travail en faisant un don libre sur le Tipeee du blog

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.
10 réponses
Bonjour Claire et merci pour cet intéressant article sur l’utilisation de l’IA pour travailler avec R.
J’ajouterai une remarque sur l’IA en général : une utilisation parcimonieuse de l’IA est souhaitable étant donné son impact environnemental à travers les requêtes et les data center. Il apparait entre autre qu’une intelligence artificielle (IA) générative utilise 10 fois plus d’énergie qu’un moteur de recherche classique »… On est prévenu 😉
-voir : https://www.futura-sciences.com/planete/actualites/environnement-voici-ce-consomme-simple-requete-chatgpt-116342/).
-voir également : https://www.blick.ch/fr/monde/une-pollution-excessive-cinq-chiffres-pour-comprendre-limpact-environnemental-de-lia-id20549977.html.
Bonjour Stéphane,
Merci pour votre commentaire très pertinent.
Merci de ces exemples Claire, qui confirment parfaitement l’usage que j’en ai pour la mise au point d’un code R d’analyse bayésienne. J’ai fini par n’utiliser que Mistral qui me convient à 90% des cas. Dans les 10 % restant, j’ai fait du partage de connaissance entre ChapGpt et Mistral prend la peine de me remercier.
Je ne compte plus les cas soumis à Mistral pour la création, correction ou annotation de codes et je confirme que tous les exemples présentés ici sont bien représentatifs de ce que l’on peut obtenir d’un LLM.
A noter que je prends un malin plaisir à faire des prompts comme si je m’adressais à un ou une experte en codage R. Et il (ou elle) me répond dans la même veine.
Au final, c’est très étonnant de passer plus de temps dans la phraséologie du prompt pour être précis et concis que dans le codage lui-même.
Voici le dernier exemple soumis avec la réponse de Mistral:
======================== Le prompt
Bonjour
j’aimerais avoir un avis sur les compatibilités de ces librairies. Est il possible d’en supprimer pour cause de redondance ?
library(lubridate), library(tidyverse) , library(bnlearn) , library(reshape2) , library(dplyr) , library(lattice) ,library(FactoMineR), library(ade4)
library(shiny), library(cluster), library(webshot), library(Hmisc) , library(corrplot) , library(plotly), library(neuralnet), library(magrittr)
library(performance), library(DiagrammeR), library(pacman), library(igraph), library(htmltools), library(visNetwork)
library(htmlwidgets)
Merci
===================== La réponse
Bonjour ! Vous avez une liste assez complète de bibliothèques R. Certaines d’entre elles peuvent effectivement être redondantes ou avoir des fonctionnalités qui se chevauchent. Voici un aperçu des bibliothèques et quelques suggestions pour les optimiser :
lubridate : Utilisée pour la manipulation des dates et heures.
tidyverse : Une collection de packages pour la science des données, incluant dplyr, ggplot2, tidyr, etc. Si vous chargez tidyverse, vous n’avez pas besoin de charger dplyr séparément.
bnlearn : Pour l’apprentissage des réseaux bayésiens.
reshape2 : Utilisée pour la réorganisation des données. Cependant, tidyr (inclus dans tidyverse) peut souvent remplacer reshape2.
lattice : Pour les graphiques en treillis. Si vous utilisez ggplot2 (inclus dans tidyverse), vous pouvez envisager de supprimer lattice.
FactoMineR : Pour l’analyse factorielle.
ade4 : Pour l’analyse des données écologiques et environnementales.
shiny : Pour créer des applications web interactives.
cluster : Pour l’analyse de clusters.
webshot : Pour capturer des captures d’écran de pages web.
Hmisc : Pour diverses fonctions utilitaires et graphiques.
corrplot : Pour la visualisation des matrices de corrélation.
plotly : Pour créer des graphiques interactifs.
neuralnet : Pour les réseaux de neurones.
magrittr : Pour l’opérateur pipe %>%. Si vous utilisez tidyverse, vous n’avez pas besoin de charger magrittr séparément.
performance : Pour l’évaluation des modèles.
DiagrammeR : Pour créer des diagrammes et des graphiques.
pacman : Pour la gestion des packages.
igraph : Pour l’analyse de réseaux.
htmltools : Pour créer des outils HTML.
visNetwork : Pour la visualisation de réseaux.
htmlwidgets : Pour créer des widgets HTML.
Suggestions :
Supprimer dplyr et magrittr : Ils sont inclus dans tidyverse.
Supprimer reshape2 : Si vous utilisez tidyr (inclus dans tidyverse), vous pouvez remplacer reshape2.
Supprimer lattice : Si vous utilisez ggplot2 (inclus dans tidyverse), vous pouvez envisager de supprimer lattice.
En résumé, vous pouvez probablement supprimer dplyr, magrittr, reshape2, et lattice sans perdre de fonctionnalités, car elles sont couvertes par tidyverse. Cela devrait réduire la redondance dans votre liste de bibliothèques.
===============
Super ! Merci
===============
Avec plaisir ! Si vous avez d’autres questions ou besoin de plus d’aide, n’hésitez pas à demander. Bonne journée !
Bonjour Gilles,
Merci pour ce retour.
Merci beaucoup Claire, vraiment c’est très intéressant. Ça va aider pour améliorer davantage un code développé.
C’est intéressant
J’ajouterai que l’on peu demander a chatgpt de coder de la façon dont on a envire. Pour ma part, je code majoritairement en data.table couplé à la pip native |> (ce qui donne dt |> _[ , ] |> _[ , ] etc… ). Ainsi j’ai la vitesse et le coté « succin » de data.table quand c’est nécessaire, et la lisibilité du tidyverse quand je fais des scripts plus volumineux. Et bien j’ai paramètré Chatgpt pour qu’il me sorte les réponses autant que possible dans ma façon de codé et ça fonctionne ^^’.
Bonjour Mme
Je suis vos tutoriels et j’aimerai solliciter votre aide pour l’analyse de mes données.
Bonjour, merci pour cet article; savoir « parler à l’oreille des I.A. » est une « vraie » compétence.
J’utilise pas mal l’I.A. pour me donner un diagramme d’un algorithme ou morceau de code R, ou autre fonction, afin de documenter (pour moi-même et les autres) ce que je peux développer; pour cela, je demande à l’I.A. qu’elle me donne le code « textuel » en plantuml du diagramme que je souhaite.
Pour ceux qui ne savent pas ce qu’est plantuml : https://plantuml.com/fr/sequence-diagram
(cela s’apprend relativement vite, et il y a un éditeur « online » pour se faire la main)
Voici un exemple de code R et de demande à une I.A. (Mistral cette fois-ci)
— Message transmis à l’I.A.
donne moi un diagramme d’activités en plantuml (le texte) permettant d’expliquer en détails le code R suivant
# Créer un data.frame avec des données fictives
set.seed(123) # Pour la reproductibilité
df 40) {
df$Salaire[i] <- df$Salaire[i] * 1.10
}
# Si la ville est "Paris", ajouter 5000 au salaire
if (df$Ville[i] == "Paris") {
df$Salaire[i] <- df$Salaire[i] + 5000
}
}
print("DataFrame après modifications:")
print(df)
—–
Réponse de l'I.A. : voir https://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000
@startuml
|Utilisateur|
start
:Créer un data.frame avec des données fictives;
:Définir une graine pour la reproductibilité;
note right
set.seed(123)
end note
:Créer un data.frame 'df' avec les colonnes ID, Age, Salaire, et Ville;
note right
df 40?) then (Oui)
:Augmenter le salaire de 10%;
note right
df$Salaire[i] <- df$Salaire[i] * 1.10
end note
endif
if (Ville == "Paris"?) then (Oui)
:Ajouter 5000 au salaire;
note right
df$Salaire[i] <- df$Salaire[i] + 5000
end note
endif
repeat while (Toutes les lignes sont traitées?)
:Afficher le DataFrame après modifications;
note right
print("DataFrame après modifications:")
print(df)
end note
stop
@enduml
Merci pour ce commentaire. Je ne connaissais pas du tout !