# Ceci est un commentaire. Ci dessous, on va afficher le résultat du calcul
4 + 3[1] 7
Guillaume Guex
R est un logiciel d’analyses statistiques libre multiplateforme, distribué via le :
Ce dernier s’appuie sur un langage de programmation, qui porte le même nom. Il possède de nombreux avantages :
RStudio est un environnement de développement intégré (IDE) pour R, développé par Posit (entreprise privée très active dans le développement de R, et aussi Python récemment) qui facilite son utilisation. Il est aussi gratuit et multiplateforme, et peut être téléchargé sur : https://posit.co/download/rstudio-desktop/. Il permet d’écrire des scripts R, de visualiser les résultats de manière plus agréable, et d’avoir accès à de nombreuses fonctionnalités supplémentaires.
Nous allons faire le tour de son interface un peu plus loin.
Ce fichier contient le même code que dans le fichier Introduction_a_R.R, mais dans un format plus agréable à lire (mais peut-être plus abstrait): il s’agit d’un Notebook, écrit avec Quarto.
Un Notebook intègre du texte formaté, mais aussi des bouts de code R, avec le résultat de la console R juste en dessous. Par exemple :
Ces notebooks permettent de sauvegarder le code sous format PDF, HTML ou Word, avec les résultats de l’exécution du code. Ils sont idéaux pour l’analyse exploratoire et les rapports, bien que les scripts classiques restent préférables pour le développement de logiciels ou de fonctions complexes.
Libre à vous d’utiliser votre format de fichier préféré pour travailler.
Pour commencer, nous allons faire un rapide tour de l’interface de RStudio (les éléments que nous utiliserons seront notés comme importants, les autres comme secondaires).
Dans le coin en haut à gauche, on trouve les Sources. C’est ici que sont ouverts les différents scripts (comme ce dernier), qui sont sauvegardés dans un format texte avec l’extension “.r” ou “.R” (ou .Rmd / .qmd pour un Notebook). Les codes se trouvant ici sont généralement copiés et exécutés dans la Console (voir section Section 3). On peut aussi y afficher certains jeux de données en mémoire. Si aucun fichier n’est ouvert, ce panneau est caché et la Console occupe toute la partie gauche.
Dans le coin en bas à gauche, se trouvent les onglets Console, Terminal et Background Jobs :
Dans le coin en haut à droite, se trouvent les onglets Environment, History, Connections et Tutorial :
Finalement, dans le coin en bas à droite, on trouve divers onglets :
Généralement, on va travailler sur un fichier script R (.r ou .R) que l’on éditera au fur et à mesure de l’avancée du travail. Ce fichier contiendra une séquence de manipulations, d’analyses et de production de résultats. Ce script devrait pouvoir être utilisé de manière indépendante, sans avoir recours à des manipulations préalables. (sauf peut-être l’adaptation des chemins d’accès aux données).
Pour exécuter tout le script R, on le sélectionne intégralement (commande-A ou ctrl-A) puis on envoie cette sélection dans la console (commande-retour ou ctrl-retour). Il est aussi possible d’exécuter uniquement des sous-parties du script en sélectionnant uniquement ces dernières, ou d’exécuter la ligne en cours. Il est également possible d’écrire directement dans la console pour exécuter des commandes (souvent pour faire des tests).
Une session R commence à l’ouverture de RStudio, et s’arrête lorsque l’on quitte R ou que l’on crée une nouvelle session via “Session \(\to\) Restart R”. Lors d’une session R, toutes les variables et objets créés par un code exécuté dans la console (peu importe la manière) vont être sauvés dans l’environnement d’exécution. On peut alors réutiliser ces variables et objets dans des commandes ultérieures.
Pour être sûr que votre script R crée par lui-même toutes les variables et objets nécessaires à son fonctionnement, n’oubliez pas de vérifier son exécution en partant d’une session vierge.
Il est également important de bien commenter son script R, c’est-à-dire d’ajouter des lignes de texte explicatives qui ne sont pas exécutées par R. En R, les commentaires commencent par le symbole #, ce qui indique à l’interpréteur d’ignorer le reste de la ligne.
Vous pouvez trouver un exemple de mini travail statistique dans le script Mini_analyse.R.
Comme Python ou Julia, R est un langage interprété muni d’une invite de commande. On peut aussi bien exécuter des scripts (la source) que faire des calculs lignes par lignes. On peut par exemple l’utiliser comme une calculatrice :
Il est également possible d’effectuer des tests logiques :
[1] FALSE
[1] TRUE
[1] FALSE
[1] TRUE
[1] TRUE
[1] FALSE
[1] TRUE
Les éléments <, +, -, etc. s’appellent des opérateurs.
Mais R est aussi un langage de programmation, c’est-à-dire qu’il dispose de plusieurs fonctionnalités permettant de construire des scripts complexes. L’élément de base d’un langage de programmation sont les variables. Une variable est un réceptacle, portant un nom, qui permet de stocker des données.
On affecte des données dans une variable avec l’opérateur = ou <- (il y a des nuances subtiles entre les deux) :
En R, l’opérateur historique d’assignation est <- et reste le plus utilisé dans la communauté. Cependant, dans ce cours, nous allons utiliser l’opérateur = car c’est le standard dans les autres langages.
On peut ensuite utiliser le nom de la variable dans une opération ultérieure. La valeur stockée sera alors utilisée à la place de la variable :
Les autres éléments fondamentaux d’un langage de programmation sont les fonctions. Elles fonctionnent comme une “boîte noire”, qui prend une ou plusieurs valeurs en entrée, appelés arguments, effectue une suite d’opérations, et rend (presque toujours) un résultat. Leur structure suit toujours le schéma :
[1] 9
[1] 6
[1] 8
Certains arguments ne sont pas obligatoires, ils prennent alors une valeur par défaut :
On peut aussi nommer explicitement les arguments, et ainsi les mettre dans l’ordre désiré :
[1] 8
[1] 54.72072
On peut voir l’aide sur les différentes fonctions avec l’opérateur ? (ou chercher sur internet) :
R n’utilise pas que des nombres comme type de données, on trouve aussi :
[1] TRUE
[1] TRUE
Pour voir quel type de données il s’agit, on utilise la fonction typeof() :
Il existe également quatre “données” très particulières, qui nécessitent généralement un traitement particulier :
De plus, dans R, les données sont souvent structurées de manière particulière.
Les vecteurs sont des collections unidimensionnelles d’éléments du même type appelés composantes. En mathématique, on les note de la façon suivante :
\[ \begin{align*} &\text{un vecteur colonne avec 3 éléments :} \qquad \begin{pmatrix} 4\\5\\6\end{pmatrix} \\ &\text{un vecteur ligne avec 4 éléments :} \qquad \begin{pmatrix} 2 & 7.3 & -2 & 0 \end{pmatrix} \end{align*} \]
En R, on les crée avec la fonction c() (pour “combine”). Bien qu’ils s’affichent horizontalement, R les adapte automatiquement (comme colonne ou ligne) selon les besoins du calcul matriciel :
[1] 4 5 6
[1] "oui" "non" "peut-etre"
[1] 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
[26] 38 39 40
Les listes qui, contrairement aux vecteurs, peuvent contenir des types de données différentes :
Les dataframes, formés à partir de plusieurs vecteurs de types différents, sont utiles pour stocker un jeu de données :
numero reponse
1 25 oui
2 30 oui
3 35 non
4 40 non
5 45 non
Afin de voir quelle est la structure de données d’une variable, on utilise la fonction class() :
[1] "numeric"
[1] "character"
[1] "list"
[1] "data.frame"
La longueur et les dimensions des structures peuvent s’obtenir avec :
Les opérateurs que nous avons vu au préalable peuvent aussi s’utiliser avec les vecteurs. Dans ce cas, l’opération se fera composante par composante. Si les vecteurs n’ont pas la même longueur, le plus petit sera “dupliqué” en boucle pour atteindre la taille du plus grand : c’est ce qu’on appelle le recyclage.
[1] 4 4 -1
[1] 5 4 6
[1] 2 2 8 8
[1] 2 4 8
[1] FALSE TRUE FALSE TRUE FALSE TRUE
Pour accéder à un élément d’une structure de données, on utilise les crochets :
[1] 4
[1] "oui" "peut-etre"
[1] "oui" "peut-etre"
[1] 14 16 18 20 22 24 26 28 30 32 34 36 38 40
Dans une liste, il y a une différence fondamentale entre le simple et le double crochet :
[] renvoie une sous-liste (le contenant).[[]] renvoie le contenu de l’élément (les données elles-mêmes).Dans un dataframe, deux indices sont nécessaires. Les indices avant la virgule portent sur le lignes, celle après la virgule sur les colonnes :
En omettant un indice avant ou après la virgule, on sélectionne tous les éléments correspondants :
On utilise généralement une condition logique pour sélectionner les lignes (ou colonnes) voulues. Par exemple, pour n’avoir que les individus qui ont répondu “oui”, on fait:
Bien entendu, toutes ces accès peuvent aussi servir pour modifier nos structures de données. P.ex, modification de la première valeur avec 101 :
Remplacement du premier élément par “POSITIF” et du troisième par “INCONNU” :
[1] "oui" "non" "peut-etre"
[1] "POSITIF" "non" "INCONNU"
Mise à zéro des termes paires :
Dans un dataframe les colonnes (les variables) portent des noms, qui sont donnés avec la fonction names() :
L’opérateur $ peut être utilisé pour accéder à l’une des variables :
[1] 25 30 35 40 45
[1] "oui" "oui" "non" "non" "non"
On peut aussi modifier ces noms avec la fonction names() :
id answer
1 25 oui
2 30 oui
3 35 non
4 40 non
5 45 non
Ceci est aussi valable pour les listes :
[[1]]
[1] "a"
[[2]]
[1] 4
[[3]]
[1] TRUE
$caractere
[1] "a"
$chiffre
[1] 4
$booleen
[1] TRUE
On peut alors y accéder avec l’opérateur $ :
Dans une liste et un dataframe, il est également possible d’attribuer des noms dès sa création :
$vecteur
[1] 2 3 4
$caractere
[1] "oui"
$booleen
[1] FALSE
age sexe
1 15 F
2 63 H
3 42 F
L’énorme avantage de l’opérateur $ dans RStudio, au delà d’être plus explicite, est qu’il active l’autocomplétion. Dès que vous tapez le $, une liste déroulante vous propose les colonnes disponibles.
Pour charger des données, le format de prédilection dans R est le format CSV (comma-separated values) ou TSV (tab-separated values), c’est-à-dire un fichier texte où les données sont séparées par des virgules ou des tabulations. Par abus de langage, on parle de format CSV pour tout fichier dont les valeurs sont séparées par un caractère particulier. Le CSV “français” utilise d’ailleurs le ; comme séparateur (on peut alors utiliser read.csv2()) :
nom annee inscription note
1 Yutaro 1999 Oui 4.5
2 Kadija 2002 Oui 5.5
3 Aline 2001 Non 4.8
4 Sam 2003 Oui 5.3
Notez que le chemin utilisé est un chemin relatif, depuis le répertoire de travail. On peut changer ce dernier dans les options “More” sous l’onglet “Files”. On peut également utiliser un chemin absolu. Pour en savoir plus sur les chemins d’accès : https://en.wikipedia.org/wiki/Path_(computing).
On peut ensuite travailler sur le jeu de données, puis le sauvegarder à nouveau. P.ex., on modifie une “erreur”, qui était l’entrée “Non” pour la variable “inscription” de la troisième ligne.
nom annee inscription note
1 Yutaro 1999 Oui 4.5
2 Kadija 2002 Oui 5.5
3 Aline 2001 Oui 4.8
4 Sam 2003 Oui 5.3
Et on sauve notre fichier dans le dossier data (avec les options sans noms des lignes)
R est extensible grâce à l’installation de packages. Pour l’installation, on peut passer par l’interface RStudio (“Tools \(\to\) Install Packages…”), ou utiliser la commande suivante :
Un package ne doit être installé qu’une seule fois dans R. Cependant, on utilise rarement tous les packages installés dans le même script. Pour charger un package, et rendre ainsi disponible ses fonctions et données, on utilise la commande suivante :
On peut alors utiliser les nouvelles fonctions ou données disponibles dans le package, par exemple le chargement de fichiers excel :
# A tibble: 4 × 4
nom annee inscription note
<chr> <dbl> <chr> <chr>
1 Yutaro 1999 Oui 4.5
2 Kadija 2002 Oui 5.5
3 Aline 2001 Non 4.8
4 Sam 2003 Oui 5.3
Notez que c’est un nouveau format : un tibble. Ce format est une sorte de dataframe mais fait partie du Tidyverse, un ensemble de packages créé par RStudio, dont nous verrons l’utilisation la semaine prochaine :
Généralement, dans un script R, on place toutes commandes de chargement des packages nécessaires au début du script, afin qu’un utilisateur externe sache quel(s) package(s) il doit installer pour le faire tourner.
Comme tout langage de programmation, R permet d’utiliser des conditions. Si la condition if n’est pas vérifiée, R va vérifier les conditions else if les unes après les autres. Si aucune n’est vérifiée, le code sous else s’exécute :
R utilise également des boucles, comme la boucle for. A chaque itération, la variable i va prendre une des valeurs dans le vecteur donné (ici, c(3, 4, 5, 6, 7, 8, 9)). La boucle s’arrête lorsque toutes les valeurs ont été passées en revue :
La boucle while. Elle ne s’arrête pas tant que la condition donnée est valide. Attention aux boucles infinies !
[1] 10
[1] 9
[1] 8
[1] 7
[1] 6
[1] 5
[1] 4
[1] 3
[1] 2
[1] 1
Ou la boucle repeat, qui ne s’arrête jamais, sauf avec le mot clé break (ce mot clé peut s’utiliser dans les autres boucles) :
[1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
Bien que cette boucle fonctionne, en R professionnel, on évite généralement de “faire grandir” un vecteur vec = c(vec, a). On préfère utiliser la vectorisation, qui permet de faire le calcul sur tous les éléments d’un coup sans écrire de boucle for.
Finalement, il est aussi possible de créer ses propres fonctions, afin d’isoler et de réutiliser des bouts de code. Voici un exemple de syntaxe :
Une fois la fonction déclarée et en mémoire, on peut l’utiliser à n’importe quel moment dans notre code :
NULL
[1] 5 10
[1] 1 2 3 4 6 9 12
On peut aussi spécifier le nom des arguments, pour, p.ex. changer l’ordre dans lequel on entre les arguments :
On peut définir des arguments facultatifs en spécifiant une valeur par défaut dans la définition de la fonction :
[1] 1 3 107 321
[1] 1 3