Objectif

Les objectifs de cette séance sont

  • une première prise en main du logiciel R avec la présentation de commandes de base
  • se familiariser avec RStudio
  • débuter dans la rédaction de documents en Rmarkdown

1 Introduction

1.1 Pourquoi R ?

Le logiciel R sous licence GNU est facile à installer à partir de la page du CRAN (ou d’un site miroir). Le CRAN contient toutes les ressources nécessaires à l’utilisateur de R, débutant ou expérimenté : fichiers d’installation, mises à jour, librairies, FAQ, newsletter, documentation… R est un logiciel très utilisé dans la communauté statistique.

Dans sa structure, R est un langage de programmation d’une syntaxe voisine à celle du langage C et capable de manipuler des objets complexes sous forme de matrice, scalaire, vecteur, liste, facteur et aussi data frame. Il dispose également d’une très riche librairie de quasiment toutes les procédures et méthodes statistiques de la littérature. Plus précisément, toutes les recherches récentes sont d’abord développées et diffusées à l’aide de ce logiciel par la communauté scientifique.

1.2 Présentation de Rstudio

Nous allons utiliser RStudio durant les TP d’Analyse de Données. RStudio n’est pas qu’une interface graphique pour R, il s’agit d’un environnement de développement intégré, proposant des outils et facilite l’écriture de scripts et l’utilisation de R. La version gratuite de RStudio étant déjà très riche en fonctionnalités, elle est suffisante pour les enseignements. Elle est disponible pour Linux, Windows et MacOS.

Sur les ordinateurs en salle TP, sous linux,

  • à partir d’un terminal, placez vous dans le répertoire de travail et tapez la commande rstudio
  • par le menu déroulant, allez dans Applications/Programmation/RStudio

Si vous souhaitez travailler sur votre propre ordinateur, installez tout d’abord la dernière version du logiciel R (voir CRAN) puis installez la version gratuite de Rstudio adaptée à votre OS.

1.2.1 Description des fenêtres de RStudio

A chaque ouverture de RStudio, l’écran est découpé en quatre grandes zones :

  • En bas à gauche c’est la Console, on peut y lire au lancement la version de R que RStudio a chargé. Après le texte d’entrée, la ligne commence par > qui est l’invite de commande. RStudio est prêt à recevoir votre première commande. On peut se servir de R comme d’une calculatrice. Vous pouvez par exemple taper > 2+3 et taper Entrée. Le résultat apparait alors dans la console.

  • En haut à droite, on peut voir dans Environnement la liste des objets et fonctions créés au fur et à mesure du travail. On a également accès à l’historique des commandes dans History.

  • En bas à droite, on trouve plusieurs onglets :

    • Files : permet de voir le contenu du répertoire de travail
    • Plots : permet de visualiser les graphiques créés
    • Packages : liste les packages installés pour les charger, mettre à jour, en installer d’autres
    • Help : permet d’accéder à l’aide en ligne
  • En haut à gauche, c’est la zone d’Edition pour gérer les scripts, les executer, ….

Lorsque vous quittez RStudio, on vous demande si vous souhaiter sauvegarder l’environnement de travail. Si vous y répondez favorablement, un fichier de sauvegarde .RData est enregistré dans le répertoire courant.

1.2.2 Types de documents avec RStudio

En allant dans File -> New File ou en cliquant sur la flèche à côté de l’icone de New File (en haut à gauche), RStudio propose de nombreux types de document. Vous pouvez noter que l’on peut utiliser RStudio également pour faire du python, du C++, … Nous allons ici ne parler que de quelques types de fichiers que l’on utilisera par la suite.

Pour créer un script R, il suffit de sélectionner R Script. Ce script peut être enregistré à tout moment dans un fichier avec l’extension ” .R” (ex. monScript.R) dans le répertoire courant en cliquant sur l’icône de disquette ou par File->Save. Vous pouvez l’ouvrir à tout moment grâce au menu File –> Open file..., à l’icône dossier ou en double cliquant sur le fichier monScript.R. Il est également possible d’executer un script directement depuis la console grâce à la commande source("monScript.R").

On peut également créer des documents de type rapport, slides, … contenant du texte, du code, des images, des formules mathématiques en latex, ….

  • à l’aide de RMarkdown en sélectionnant R markdown .... Le document créé sera sauvegardé avec l’extension ” .Rmd”. On reviendra plus précisément sur les possibilités offertes par Rmarkdown et les commandes principales pour débuter la rédaction d’un rapport dans la section suivante.

  • à l’aide de quarto en sélectionnant Quarto Document ... ou Quarto Presentation ... pour la création de présentation, rapports, … Par exemple les slides du cours d’Analyse de Données ont été générés en quarto. La syntaxe est assez proche de celle de Rmarkdown.

1.3 Environnement

1.3.1 Répertoire de travail

Pour pouvoir récupérer des données, maîtriser la sauvegarde des scripts, des résultats, … il est important de connaitre le répertoire de travail c’est-à-dire le répertoire sous lequel les divers résultats seront sauvegardés par défaut. Ce dernier s’obtient à l’aide de la commande > getwd().

Pour changer de répertoire de travail, on peut

  • utiliser la commande setwd() dans la Console. A noter que R ne reconnaît que le caractère “/” pour spécifier le chemin d’accès d’un répertoire (même sous Windows).
  • passer par Session -> Set Working Directory -> Choose Directory.

Exercice :

Créer un dossier de travail pour ce TP dans votre home (en dehors de RStudio!) Dans RStudio, placez-vous dans ce dossier de travail pour le TP.

1.3.2 Les librairies pour R

R est un logiciel libre, il s’enrichit grâce au développement de librairies par la communauté. La plupart des extensions sont développées et maintenues par la communauté des utilisateurs de R, et diffusées via le CRAN (Comprehensive R Archive Network). On peut également trouver des packages déposés sur github par exemple.

A la première ouverture de RStudio sur les ordinateurs de salle TP, un dossier R/libs est créé dans votre home pour l’installation des librairies.

Pour installer une librairie disponible sur le CRAN, vous avez plusieurs manières de le faire, dont

  • passer par le menu Tools-> Install Packages ... , sélectionner un site miroir du CRAN et demander la librairie souhaitée
  • aller dans l’onglet Packages dans la fenêtre en bas à droite et cliquer sur Install.
  • utiliser la fonction install.packages() directement dans la console en précisant la librairie souhaitée

Toutes les librairies ne sont pas chargées automatiquement au lancement de R. Pour charger une librairie, on utilise la commande library().

Exercice :

  1. Installez la librairie corrplot
  2. Chargez la librairie corrplot

1.3.3 L’aide de R

On peut à tout moment faire appel à l’aide intégrée de R (et surtout avant d’appeler l’enseignant-e !) pour avoir les détails comme les arguments d’une fonction. On peut accéder à l’aide pour une fonction (ex pour la fonction plot) en passant le nom de la fonction dans help() (ex > help(plot)) ou en utilisant le raccourci > ?plot. Ces deux commandes permettent d’afficher une page de description (en anglais) de la fonction, ses paramètres, son résultat, d’exemples, … Dans RStudio, les pages d’aide en ligne s’ouvriront par défaut dans la zone en bas à droite, sous l’onglet Help. Un clic sur l’icône en forme de maison vous affichera la page d’accueil de l’aide. Vous pouvez aussi taper directement le nom de la fonction recherchée dans la zone de recherche dans l’onglet Help.

Exercice :

Accédez à l’aide de la fonction rnorm

1.4 Editer des rapports avec Rmarkdown

L’extension Rmarkdown permet de créer des documents dans différents formats (html, pdf, docx, slides, …) qui contiennent du texte, du code (en R mais pas que!), les résultats, … Par exemple, les sujets de TP de ce cours sont rédigés en Rmarkdown.
Vous devrez également rédiger le rapport de votre projet en Rmarkdown. Nous allons donner ici des éléments de base pour la création de documents avec Rmarkdown. Pour plus de détails, vous pouvez consulter l’aide mémoire de Rmarkdown (accessible via Help -> Cheatsheets -> Rmarkdown Cheat Sheet) et le livre en ligne R Markdown: The Definitive Guide de Y. Xie, J. J. Allaire, G. Grolemund.

1.4.1 Etapes de création d’un document

Un document Rmarkdown est un fichier enregistré avec l’extension .Rmd. Pour créer un nouveau document, allez dans File-> NewFile-> Rmarkdown... (ou cliquez sur l’icone nouveau document et choisissez Rmarkdown).

Exercice :

Créez un nouveau document Rmarkdown au format pdf avec le titre et l’auteur de votre choix. Vous pouvez constater qu’un nouveau document prérempli vient de s’ouvrir dans RStudio. Nous allons maintenant détailler le contenu de ce document.

Un document Rmarkdown débute toujours par l’en-tête qui est encadré par 3 tirets ---. Cet en-tête contient au moins les métadonnées du document suivantes : le titre, l’auteur, la date, le format de sortie (output). On peut préciser des options au document final en ajoutant des sous-options à droite du output. Il est également possible de spécifier des options différentes selon les formats. Voici une liste avec quelques éléments :

  • number_section : true permet de numéroter les sections
  • highlight permet de spécifier le style syntaxique (par ex default, tango, pygments, kate, …).
  • on peut ajouter son propre fichier de style .css avec l’option css
  • on peut préciser des options concernant les figures avec fig_width, fig_height, fig_caption, dev, …
  • on peut ajouter une bibliographie à partir d’un fichier .bib avec l’option bibliography

On a ensuite le corps du document qui peut contenir

  • du texte selon la syntaxe markdown
  • des blocs de code (appelés chunks) en R, Python, …
  • des formules mathématiques (écrites en latex entre $ ... $)
  • des images, tableaux, références, ….

Vous pouvez compiler à tout moment le document Rmarkdown en cliquant sur le bouton Knit. Un onglet R Markdown s’ouvre alors dans la même zone que l’onglet Console pour indiquer la progression de la compilation et les messages d’erreur éventuels. Une fois la compilation effectuée, le document obtenu s’ouvre et vous pouvez admirer le rendu.

Remarque: Pour la compilation d’un document en pdf, il est nécessaire d’avoir installé un compilateur de Latex sur son ordinateur.

Exercice :

Modifiez les options dans l’en-tête de votre fichier Rmarkdown puis compilez le document pour constater l’impact sur le document généré.

1.4.2 Quelques éléments markdown

Le texte d’un document Rmarkdown est régi par le langage markdown. Regardez les quelques éléments de syntaxe et de mise en forme disponible ici ou consulter l’aide mémoire de Rmarkdown (accessible via Help -> Cheatsheets -> Rmarkdown Cheat Sheet).

Remarque: Si vous avez organisé votre document avec des sections / sous-sections en faisant débuter une ligne par un ou plusieurs #, alors vous pouvez cliquer sur l’icone Outline à droite de la barre d’outils associée au fichier R Markdown pour visualiser la table des matières générée automatiquement qui vous permet de naviguer facilement dans le document.

Pour insérer du code dans un document Rmarkdown, on utilise des blocs appelés chunk. Pour cela, il suffit de cliquer sur l’icone d’insertion d’un chunk dans la barre d’outils d’un document Rmarkdown. Il est possible d’insérer un chunk de code R mais pas seulement (par exemple on peut insérer du code Python). Pour du code R, un chunk de la forme \(\textrm{```{r} .... ```}\) s’insère alors dans le document. On peut alors saisir du code R dans ce chunk. On peut ajouter un nom à un bloc et préciser des options dans les accolades {r nomdubloc, ....}, par exemple

  • eval (TRUE par défaut, ou FALSE) : détermine si le code R doit être évalué ou non,
  • echo (TRUE par défaut, ou FALSE) : détermine si le code R doit être affiché ou non,
  • results (‘markup’ par défaut, ‘hide’, ‘hold’ ou ‘asis’) : détermine comment les sorties doivent être affichées,
  • error (FALSE par défaut, ou TRUE) : détermine si les messages d’erreur doivent être affichée,
  • warning (TRUE par défaut, ou FALSE) : détermine si les messages d’avertissement doivent être affichées.

Ces options peuvent être modifiées manuellement ou en utilisant l’interface graphique (en cliquant sur l’icone d’engrenage situé en haut à droite de chaque bloc).

Exercice :

  • Ajoutez # Titre 1 avant ## RMarkdown
  • Modifiez {r cars} en {r cars, eval=F}
  • Compilez le document pour voir les différences

De manière générale, il est recommandé de

  • travailler dans le document R Markdown (en lançant balise R par balise R, avec la petite flèche verte en haut à droite de chaque bloc, ou en lançant la ligne de code contenant le curseur en tapant Ctrl Enter),
  • commenter les résultats obtenus (en dehors des balises R) au fur et à mesure,
  • ne compiler le document (Knit) qu’à la fin.

Pour la suite du TP, récupérez sur moodle le document “TP1-InitR.Rmd”, sauvegardez-le dans votre dossier de travail et ouvre-le dans RStudio. C’est le document .Rmd qui a généré cet énoncé de TP et que vous allez compléter dans la suite.

2 Structure des objets en R

Sous R, les éléments de base sont des objets : des données (vecteurs, matrices, …), des fonctions, des graphiques, … Ces objets se différencient par leur mode décrivant leur contenu, et leur classe décrivant leur structure. Les classes d’objets les plus courantes sont : vector, matrix, array, factor, data.frame, list. On peut avoir des vecteurs, matrices, tableaux, … de mode null (objet vide), logical (TRUE, FALSE, NA), numeric, complex, character. Par contre les listes et les tableaux peuvent être composés d’éléments hétérogènes. On utilise la commande class() pour connaître la classe d’un objet et str()pour connaitre la nature des éléments composant l’objet.

Nous allons dans ce TP présenter certains de ces objets, les opérations et manipulations basiques que l’on peut faire, …

Remarque : On stocke un objet dans une variable a à l’aide de a<- ... ou a= .... Pour lister les variables actuellement disponibles dans la session de travail, on utilise la fonction ls(). Pour effacer une ou plusieurs variables, on utilise la fonction rm(). La commande rm(list=ls()) permet d’effacer toutes les variables en mémoire.

2.1 Opération sur les scalaires

2.1.1 Opérations

Les opérations élémentaires sur les scalaires sont *,-, +, /, ^.

Executez les commandes suivantes. Vous chercherez en particulier à bien identifier les différents types de données :

2 + 2
exp(10)
a = log(2)
a
b = cos(10)
b
a - b
a * b
d <- 2 < 3
d
dd <- FALSE
dd - d
dd + d
e <- "toto"
class(e)
str(e)

2.1.2 is.xxx()/as.xxx()

Pour tester si un objet obj est de type xxx, on utilise la commande is.xxx(obj). On peut aussi contraindre si possible l’objet obj au type xxx avec la commande as.xxx(obj).

a = 4.3
is.numeric(a)
[1] TRUE
is.complex(a)
[1] FALSE
is.character(a)
[1] FALSE
as.character(a)
[1] "4.3"
b <- "toto"
is.numeric(b)
[1] FALSE
as.list(b)
[[1]]
[1] "toto"

2.1.3 Arrondir

Pour obtenir des valeurs arrondies sur des valeurs numériques, vous pouvez utiliser l’une des commandes suivantes round(), ceiling(), floor(), trunc() ou signif() (voir l’aide ?round). Comparez les codes suivantes:

a = 1.3579
floor(a)
[1] 1
ceiling(a)
[1] 2
round(a, digits = 2)
[1] 1.36
signif(a, digits = 2)
[1] 1.4
is.integer(floor(a))
[1] FALSE
is.numeric(floor(a))
[1] TRUE

2.2 Booléens et opérations logiques

En R, un booléen est représenté par TRUE ou FALSE. Les opérations logiques, <, >, <=, >=, != (différent), == (égal) retournent TRUE ou FALSE. On peut définir plusieurs conditions à remplir avec les opérateurs & (ET) et | (OU).

Attention, R considère que le booléen FALSE vaut \(0\) et le booléen TRUE vaut \(1\). Il est donc capable d’évaluer TRUE + 5 bien qu’en toute logique, cela n’a aucun sens!

Voici quelques exemples de manipulation des booléens pour comprendre :

a = 3
b = 6
a <= b
[1] TRUE
a != b
[1] TRUE
(b - 3 == a) & (b >= a)
[1] TRUE
(b == a) | (b >= a)
[1] TRUE

2.3 Vecteurs (vector)

Un vecteur est un ensemble ordonné d’éléments de même nature (numérique, logique ou alphanumérique). La création d’un vecteur peut se faire par la commande c(e1,e2,...). On peut également générer une séquence avec la commande seq(a,b,t)\(a\) est le premier terme, le dernier terme est \(\leq b\) et le pas est \(t\). Pour créer un vecteur constitué de l’élément \(x\) répété \(n\) fois, on utilise la commande rep(x,n).

On donne ici quelques exemples à tester sous R pour vous familiariser avec les vecteurs. En particulier, vous pouvez découvrir des fonctions utiles avec les vecteurs comme length(), sum(), sort(), … , les opérations usuelles, l’extraction d’éléments d’un vecteur, …

2.3.1 Commande c(...)

d <- c(2, 3, 5, 8, 4, 6)
d
[1] 2 3 5 8 4 6
is.vector(d)
[1] TRUE
c(2, 5, "toto")
[1] "2"    "5"    "toto"
1:10
 [1]  1  2  3  4  5  6  7  8  9 10

2.3.2 Commande seq(...)

seq(1, 10)
 [1]  1  2  3  4  5  6  7  8  9 10
seq(from = 1, to = 20, by = 2)
 [1]  1  3  5  7  9 11 13 15 17 19
seq(1, 20, by = 5)
[1]  1  6 11 16
seq(1, 20, length = 5)
[1]  1.00  5.75 10.50 15.25 20.00

2.3.3 Commande rep(...)

rep(5, times = 10)
 [1] 5 5 5 5 5 5 5 5 5 5
rep(c(1, 2), 3)
[1] 1 2 1 2 1 2
rep(c(1, 2), each = 3)
[1] 1 1 1 2 2 2

2.3.4 Extraire des éléments

d
[1] 2 3 5 8 4 6
d[2]
[1] 3
d[2:3]
[1] 3 5
d[c(1, 3, 6)]
[1] 2 5 6
d[-3]
[1] 2 3 8 4 6
d[-(1:2)]
[1] 5 8 4 6

2.3.5 Opérations

Additionner ou soustraire un scalaire d’un vecteur

d + 4
[1]  6  7  9 12  8 10
d - 4
[1] -2 -1  1  4  0  2

Multiplier ou diviser un vecteur par un scalaire

2 * d
[1]  4  6 10 16  8 12
d/3
[1] 0.6666667 1.0000000 1.6666667 2.6666667 1.3333333 2.0000000

Multiplier/ diviser deux vecteurs terme à terme

e <- rep(2, 6)
d * e
[1]  4  6 10 16  8 12
d/e
[1] 1.0 1.5 2.5 4.0 2.0 3.0

2.3.6 Fonctions usuelles

d = c(2, 3, 5, 8, 4, 6)
d
[1] 2 3 5 8 4 6

Longueur d’un vecteur

length(d)
[1] 6

Somme des termes d’un vecteur numérique

sum(d)
[1] 28

Somme des termes cumulés d’un vecteur numérique

cumsum(d)
[1]  2  5 10 18 22 28

Différence des termes successifs d’un vecteur numérique

diff(d)
[1]  1  2  3 -4  2

Vérifier si d est un vecteur

is.vector(d)
[1] TRUE

Autres fonctions intéressantes avec les vecteurs : abs(), sort(), order(), which(), …

a <- c(3, -1, 5, 2, -7, 3, 9)
abs(a)
[1] 3 1 5 2 7 3 9
sort(a)
[1] -7 -1  2  3  3  5  9
order(a)
[1] 5 2 4 1 6 3 7
which(a < 0)
[1] 2 5

On peut appliquer une fonction à tous les éléments d’un vecteur facilement.

cos(a)
[1] -0.9899925  0.5403023  0.2836622 -0.4161468  0.7539023 -0.9899925 -0.9111303

2.3.7 Exercice

Construire

  • le vecteur \(a\) constitué des entiers pairs jusqu’à 30
  • le vecteur \(b\) contenant 6 chiffres compris entre 4 et 30 avec un intervalle constant.
  • le vecteur \(c\) contenant la somme des éléments de \(b\), la longueur de \(a\) et 5 fois le chiffre 3.

Extraire du vecteur \(c\) le

  • le quatrième élément
  • tous les éléments sauf le quatrième
  • tous les éléments supérieurs à 10
# A COMPLETER POUR REPONDRE A L'EXERCICE

2.4 Matrices (matrix)

Comme les vecteurs, les matrices sont de mode quelconque mais ne contiennent que des éléments de même nature. Pour créer une matrice, on utilise la commande matrix(vec,nrow=n,ncol=p)vec est le vecteur contenant les éléments de la matrice de taille \(n\) par \(p\), qui seront rangés en colonne sauf si l’option byrow=T est utilisée.

On donne ici quelques exemples à tester sous R pour vous familiariser avec les matrices. En particulier, vous pouvez découvrir des fonctions utiles avec les matrices comme dim(), t(), cbind(), rbind()… , les opérations usuelles dont la différence entre A*B et A%*%B, l’extraction d’éléments d’une matrice, …

2.4.1 matrix()

A = matrix(1:15, ncol = 5)
A
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    4    7   10   13
[2,]    2    5    8   11   14
[3,]    3    6    9   12   15
B = matrix(1:15, nc = 5, byrow = T)
B2 = B
B2[1, 1] = "toto"
B2
     [,1]   [,2] [,3] [,4] [,5]
[1,] "toto" "2"  "3"  "4"  "5" 
[2,] "6"    "7"  "8"  "9"  "10"
[3,] "11"   "12" "13" "14" "15"
rownames(A) = c(paste("ligne", 1:3, sep = ""))
A
       [,1] [,2] [,3] [,4] [,5]
ligne1    1    4    7   10   13
ligne2    2    5    8   11   14
ligne3    3    6    9   12   15

2.4.2 Extraire

A
       [,1] [,2] [,3] [,4] [,5]
ligne1    1    4    7   10   13
ligne2    2    5    8   11   14
ligne3    3    6    9   12   15
A[1, 3]
ligne1 
     7 
A[, 2]
ligne1 ligne2 ligne3 
     4      5      6 
A[2, ]
[1]  2  5  8 11 14
A[1:3, c(2, 5)]
       [,1] [,2]
ligne1    4   13
ligne2    5   14
ligne3    6   15
A[1:3, -c(2, 5)]
       [,1] [,2] [,3]
ligne1    1    7   10
ligne2    2    8   11
ligne3    3    9   12

2.4.3 cbind() / rbind()

Pour concaténer deux matrices, on peut utiliser les fonctions rbind() ou cbind().

A
       [,1] [,2] [,3] [,4] [,5]
ligne1    1    4    7   10   13
ligne2    2    5    8   11   14
ligne3    3    6    9   12   15
B
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    2    3    4    5
[2,]    6    7    8    9   10
[3,]   11   12   13   14   15
cbind(A, B)
       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
ligne1    1    4    7   10   13    1    2    3    4     5
ligne2    2    5    8   11   14    6    7    8    9    10
ligne3    3    6    9   12   15   11   12   13   14    15
rbind(A, B)
       [,1] [,2] [,3] [,4] [,5]
ligne1    1    4    7   10   13
ligne2    2    5    8   11   14
ligne3    3    6    9   12   15
          1    2    3    4    5
          6    7    8    9   10
         11   12   13   14   15

2.4.4 Fonctions utiles

Dimension d’une matrice

dim(A)
[1] 3 5

Nombre de lignes et de colonnes

nrow(A)
[1] 3
ncol(A)
[1] 5

Transposée et déterminant d’une matrice

t(A)
     ligne1 ligne2 ligne3
[1,]      1      2      3
[2,]      4      5      6
[3,]      7      8      9
[4,]     10     11     12
[5,]     13     14     15
det(A[, 3:5])
[1] 0

Matrice diagonale et diagonale d’une matrice

diag(A)
[1] 1 5 9
diag(1:5)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    0    0    0
[2,]    0    2    0    0    0
[3,]    0    0    3    0    0
[4,]    0    0    0    4    0
[5,]    0    0    0    0    5

Matrice de booléens

A > 5
        [,1]  [,2] [,3] [,4] [,5]
ligne1 FALSE FALSE TRUE TRUE TRUE
ligne2 FALSE FALSE TRUE TRUE TRUE
ligne3 FALSE  TRUE TRUE TRUE TRUE
A[A < 5] <- 0
A
       [,1] [,2] [,3] [,4] [,5]
ligne1    0    0    7   10   13
ligne2    0    5    8   11   14
ligne3    0    6    9   12   15

Quelques autres fonctions sur les matrices

colSums(A)
[1]  0 11 24 33 42
apply(A, 2, sum)
[1]  0 11 24 33 42
rowSums(A)
ligne1 ligne2 ligne3 
    30     38     42 
apply(A, 1, sum)
ligne1 ligne2 ligne3 
    30     38     42 
rowMeans(A)
ligne1 ligne2 ligne3 
   6.0    7.6    8.4 
apply(A, 1, mean)
ligne1 ligne2 ligne3 
   6.0    7.6    8.4 
apply(A, 1, max)
ligne1 ligne2 ligne3 
    13     14     15 

Remarque : on reverra dans la section Programmation la fonction apply() qui permet en particulier d’éviter les boucles for.

2.4.5 Opérations

Attention à la multiplication matricielle %*% et la multiplication terme à terme *!

Opérations terme à terme de 2 matrices

A + B
       [,1] [,2] [,3] [,4] [,5]
ligne1    1    2   10   14   18
ligne2    6   12   16   20   24
ligne3   11   18   22   26   30
A * B
       [,1] [,2] [,3] [,4] [,5]
ligne1    0    0   21   40   65
ligne2    0   35   64   99  140
ligne3    0   72  117  168  225

Multiplication de matrices

t(B) %*% A
     [,1] [,2] [,3] [,4] [,5]
[1,]    0   96  154  208  262
[2,]    0  107  178  241  304
[3,]    0  118  202  274  346
[4,]    0  129  226  307  388
[5,]    0  140  250  340  430

Multiplication par un scalaire

5 * A
       [,1] [,2] [,3] [,4] [,5]
ligne1    0    0   35   50   65
ligne2    0   25   40   55   70
ligne3    0   30   45   60   75

2.4.6 Exercice

  1. Créer la matrice \(A=\left(\begin{array}{c c c } 3 & 3 & 3\\ 4 & 4 & 4\\ 5 & 5 & 5\end{array}\right).\)
  2. Ajouter 2 à tous les éléments de \(A\).
  3. Créer la matrice \(B\) en ajoutant la ligne \((1,2,3)\) à \(A\), puis la colonne \((1,1,1,1)'\). Déterminer la dimension de \(B\).
  4. Extraire de \(B\) la sous-matrice \(C\) composée des deux premières colonnes et des deux dernières lignes. Calculer la transposée et le déterminant de \(C\).
# A COMPLETER POUR REPONDRE A L'EXERCICE

2.5 Listes (list)

Une liste est une collection ordonnée d’objets qui peuvent être de nature différente. Les listes sont en particulier utilisées par certaines fonctions (cf section Programmation) pour renvoyer des résultats complexes sous forme d’un seul objet. On utilise la fonction list(nom1=el1,nom2=el2,...) (l’utilisation des noms étant facultative) pour générer une liste. On peut accéder à chaque élément de la liste à l’aide de son index entre double crochets [[...]], ou par son nom précédé du signe $.

2.5.1 list(...)

x = list("toto", 1:8)
x
[[1]]
[1] "toto"

[[2]]
[1] 1 2 3 4 5 6 7 8

Création d’une liste avec des noms aux éléments

y = list(matrice = matrix(1:15, ncol = 5), vecteur = seq(1, 20, by = 5), texte = "toto",
    scalaire = 8)
y
$matrice
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    4    7   10   13
[2,]    2    5    8   11   14
[3,]    3    6    9   12   15

$vecteur
[1]  1  6 11 16

$texte
[1] "toto"

$scalaire
[1] 8

2.5.2 Extraction

Extraction d’un élément par son numéro

x[[1]]
[1] "toto"

Attention, cette commande n’est pas possible:

x[[1]] + 1

par contre celle-ci est possible

x[[2]] + 10
[1] 11 12 13 14 15 16 17 18
y[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    4    7   10   13
[2,]    2    5    8   11   14
[3,]    3    6    9   12   15
y$matrice
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    4    7   10   13
[2,]    2    5    8   11   14
[3,]    3    6    9   12   15
y$vec
[1]  1  6 11 16
y[c("texte", "scalaire")]
$texte
[1] "toto"

$scalaire
[1] 8

2.5.3 Fonctions utiles

names(y)
[1] "matrice"  "vecteur"  "texte"    "scalaire"
length(y)
[1] 4
length(y$vecteur)
[1] 4
cos(y$scal) + y[[2]][1]
[1] 0.8545
summary(y)
         Length Class  Mode     
matrice  15     -none- numeric  
vecteur   4     -none- numeric  
texte     1     -none- character
scalaire  1     -none- numeric  

2.5.4 Exercice

  1. Créer une liste contenant le nom de trois matières, les notes de 5 élèves pour chacune de ces matières, l’âge des 5 élèves et la filière (PO) d’appartenance de ces 5 élèves.
  2. Récupérer les notes du 4ème élève
  3. Créer une matrice contenant les notes et l’âge des 5 élèves.
# A COMPLETER POUR REPONDRE A L'EXERCICE

2.6 Data frames

Sous R, un data.frame est analogue à une matrice mais le contenu des colonnes peut être ici hétérogène. Un tableau de données est un ensemble de vecteurs rangés colonne par colonne, chaque colonne correspondant à une variable, chaque ligne à un individu. En particulier, lors d’études statistiques, les données à étudier sont souvent représentées par un data.frame sous R. Pour créer un tableau de données, on peut regrouper des variables de même longueur à l’aide de la commande data.frame(nom1=var1,nom2=var2,...). On peut par exemple transformer une matrice en un tableau de données en utilisant la commande as.data.frame(mat).

On donne ici quelques exemples à tester sous R pour vous familiariser avec les data.frames. En particulier, vous pouvez découvrir des fonctions utiles dont summary() et head().

2.6.1 data.frame()

# Création du data.frame H
taille = runif(12, 150, 180)
masse = runif(12, 50, 90)
sexe = rep(c("M", "F", "F", "M"), 3)
H = data.frame(taille, masse, sexe)
H
     taille    masse sexe
1  159.1421 66.88895    M
2  174.3444 69.15921    F
3  171.4166 67.13989    F
4  176.8689 63.04042    M
5  171.3922 81.89926    M
6  165.7481 87.59690    F
7  152.4223 76.71279    F
8  168.1355 57.94457    M
9  153.0398 71.91566    M
10 178.3689 65.47261    F
11 153.0043 68.86331    F
12 174.3904 53.54047    M
class(H)
[1] "data.frame"

2.6.2 summary()/head()

La fonction summary() permet de résumer le contenu des différentes colonnes d’un data.frame.

summary(H)
     taille          masse           sexe          
 Min.   :152.4   Min.   :53.54   Length:12         
 1st Qu.:157.6   1st Qu.:64.86   Class :character  
 Median :169.8   Median :68.00   Mode  :character  
 Mean   :166.5   Mean   :69.18                     
 3rd Qu.:174.4   3rd Qu.:73.11                     
 Max.   :178.4   Max.   :87.60                     

La fonction head() permet de visualiser les premières lignes d’un data.frame

head(H)
    taille    masse sexe
1 159.1421 66.88895    M
2 174.3444 69.15921    F
3 171.4166 67.13989    F
4 176.8689 63.04042    M
5 171.3922 81.89926    M
6 165.7481 87.59690    F

2.6.3 data.frame / list/matrix

Au travers de ces quelques commandes, vous pouvez voir les analogies entre data.frame, list et matrix mais restez prudent sur la nature de l’objet que vous manipulez!

H[1, ]
    taille    masse sexe
1 159.1421 66.88895    M
H$taille
 [1] 159.1421 174.3444 171.4166 176.8689 171.3922 165.7481 152.4223 168.1355
 [9] 153.0398 178.3689 153.0043 174.3904
H$sexe
 [1] "M" "F" "F" "M" "M" "F" "F" "M" "M" "F" "F" "M"
is.data.frame(H)
[1] TRUE
is.matrix(H)
[1] FALSE
MH = as.matrix(H)
MH
      taille     masse      sexe
 [1,] "159.1421" "66.88895" "M" 
 [2,] "174.3444" "69.15921" "F" 
 [3,] "171.4166" "67.13989" "F" 
 [4,] "176.8689" "63.04042" "M" 
 [5,] "171.3922" "81.89926" "M" 
 [6,] "165.7481" "87.59690" "F" 
 [7,] "152.4223" "76.71279" "F" 
 [8,] "168.1355" "57.94457" "M" 
 [9,] "153.0398" "71.91566" "M" 
[10,] "178.3689" "65.47261" "F" 
[11,] "153.0043" "68.86331" "F" 
[12,] "174.3904" "53.54047" "M" 
summary(MH)
    taille             masse               sexe          
 Length:12          Length:12          Length:12         
 Class :character   Class :character   Class :character  
 Mode  :character   Mode  :character   Mode  :character  
as.list(H)
$taille
 [1] 159.1421 174.3444 171.4166 176.8689 171.3922 165.7481 152.4223 168.1355
 [9] 153.0398 178.3689 153.0043 174.3904

$masse
 [1] 66.88895 69.15921 67.13989 63.04042 81.89926 87.59690 76.71279 57.94457
 [9] 71.91566 65.47261 68.86331 53.54047

$sexe
 [1] "M" "F" "F" "M" "M" "F" "F" "M" "M" "F" "F" "M"

2.6.4 Exercice

On reprend le data.frame \(H\).

  1. Extraire la masse des individus dont la taille est supérieure à 160.
  2. Extraire la masse et le sexe de ces mêmes individus.
  3. Extraire la taille des individus de sexe masculin dont la masse est inférieure à 80 (c’est possible en une seule ligne avec &).
# A COMPLETER POUR REPONDRE A L'EXERCICE

3 Les graphiques avec R

R contient de base des fonctions dédiées aux graphiques. Les fonctions graphiques principales comme plot() ouvrent une nouvelle fenêtre à l’execution. Les fonctions graphiques secondaires permettent d’ajouter des éléments à un graphique. Une présentation succinte des graphiques de base avec R est disponible ici (tutoriel “Premiers Graphiques”).

Maintenant il est plus usuel d’utiliser la librairie ggplot2 pour faire des graphiques sous R. On découvrira les graphiques avec ggplot dans le TP2.

4 Programmation avec R

Cette partie est consacrée à la création des fonctions, les instructions de contrôle, la syntaxe des itérations et la fonction apply() (et ses dérivées).

4.1 Créer une fonction

Il est possible sous R de construire ses propres fonctions. De manière générale, la définition d’une nouvelle fonction passe par l’expression suivante :

nomfonction=function(arg1[=exp1],arg2[=exp2],...){
    bloc d instructions
    sortie = ...
    return(sortie)
}

Les accolades signalent le début et la fin du code source de la fonction, les crochets indiquent le caractère facultatif des valeurs par défaut des arguments. L’objet sortie contient le ou les résultats retournés par la fonction, on peut en particulier utiliser une liste pour retourner plusieurs résultats.

Voici quelques exemples :

MaFonction = function(x) {
    x + 2
}
MaFonction(3)
[1] 5
Fonction2 = function(a, b = 7) {
    a + b
}
Fonction2(2, b = 3)
[1] 5
Fonction2(5)
[1] 12

Fonction retournant le périmètre et la surface d’un cercle à partir de son rayon :

CalculsCercle = function(r) {
    p = 2 * pi * r
    s = pi * r * r
    resultats = list(perimetre = p, surface = s)
    return(resultats)
}
res = CalculsCercle(3)
res
$perimetre
[1] 18.84956

$surface
[1] 28.27433
res$surf
[1] 28.27433

4.2 Structures de contrôle et itérations

4.2.1 Instructions conditionnelles

La syntaxe if(condition){instructions} permet de calculer les instructions uniquement si la condition est vraie. Le code if(condition){ A }else { B } calcule les instructions A si la condition est vraie et les instructions B sinon. On peut également utiliser ifelse.

Dans l’exemple suivant, les deux commandes sont équivalentes :

if (x > 0) {
    y = x * log(x)
} else {
    y = 0
}
y = ifelse(x > 0, x * log(x), 0)

4.2.2 Itérations

On utilise les boucles pour exécuter plusieurs fois une instruction ou un bloc d’instructions. Les trois types de boucle sont :

  • la boucle for : for(var in seq){ commandes }
  • la boucle while : while(cond){ commandes }
  • la boucle repeat : repeat { commandes ; if (cond) break }

Pour illustrer les trois types de boucles, on a codé de trois façons différentes la somme des éléments d’un vecteur x ce qui correspond à la fonction sum() de R.

# Exemple boucle for
somme1 = function(x) {
    t = 0
    for (i in 1:length(x)) {
        t = t + x[i]
    }
    return(t)
}

x = seq(1:10)
somme1(x)
[1] 55
sum(x)
[1] 55
# Exemple boucle while
somme2 = function(x) {
    t = 0
    i = 1
    while (i <= length(x)) {
        t = t + x[i]
        i = i + 1
    }
    return(t)
}
somme2(x)
[1] 55
# Exemple repeat
somme3 = function(x) {
    t = 0
    i = 1
    repeat {
        t = t + x[i]
        i = i + 1
        if (i > length(x))
            break
    }
    return(t)
}
somme3(x)
[1] 55

Exercice :

  1. Écrire une fonction ma.var qui calcule la variance empirique corrigée pour un vecteur \(x = (x_1, . . . , x_n)\). Quelle est la variance de la variable “Taille” dans le data.frame \(H\) ? Comparez avec la fonction prédéfinie var().
  2. Écrire une fonction qui calcule les \(n\) premiers termes de la suite de Fibonacci (\(u_1=0, u_2=1, \forall n>2, u_n=u_{n-1}+u_{n-2}\))
# A COMPLETER POUR REPONDRE A L'EXERCICE

4.3 apply() et ses variantes

Il est recommandé d’éviter les boucles très chronophages. On peut utiliser pour cela la fonction apply() et ses variantes sapply(), lapply(), tapply() sur des vecteurs ou matrices.

La fonction apply() permet d’appliquer la même fonction FUN sur toutes les lignes (MARGIN=1) ou les colonnes (MARGIN=2) d’une matrice MAT : apply(MAT , MARGIN, FUN).

Les fonctions lapply() et sapply() calculent la même fonction sur tous les éléments d’un vecteur ou d’une liste. La commande lapply(X,FUN, ARG.COMMUN) permet d’appliquer la fonction FUN à tous les éléments du vecteur ou de la liste X. Les valeurs de X sont affectées au premier argument de la fonction FUN. Si la fonction FUN a plusieurs paramètres d’entrée, ils sont spécifiés dans ARG.COMMUN. Cette fonction retourne le résultat sous la forme de listes. sapply() est une fonction similaire à lapply() mais le résultat est retourné sous forme de vecteurs, si possible.

La fonction tapply() applique une fonction FUN sur les sous-groupes d’un vecteur X définis par une variable de type factor GRP : tapply(X,GRP,FUN,...).

Voici quelques exemples :

data(iris)
head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa
apply(iris[, 1:4], 2, sum)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       876.5        458.6        563.7        179.9 
apply(iris[, 1:4], 1, sum)
  [1] 10.2  9.5  9.4  9.4 10.2 11.4  9.7 10.1  8.9  9.6 10.8 10.0  9.3  8.5 11.2
 [16] 12.0 11.0 10.3 11.5 10.7 10.7 10.7  9.4 10.6 10.3  9.8 10.4 10.4 10.2  9.7
 [31]  9.7 10.7 10.9 11.3  9.7  9.6 10.5 10.0  8.9 10.2 10.1  8.4  9.1 10.7 11.2
 [46]  9.5 10.7  9.4 10.7  9.9 16.3 15.6 16.4 13.1 15.4 14.3 15.9 11.6 15.4 13.2
 [61] 11.5 14.6 13.2 15.1 13.4 15.6 14.6 13.6 14.4 13.1 15.7 14.2 15.2 14.8 14.9
 [76] 15.4 15.8 16.4 14.9 12.8 12.8 12.6 13.6 15.4 14.4 15.5 16.0 14.3 14.0 13.3
 [91] 13.7 15.1 13.6 11.6 13.8 14.1 14.1 14.7 11.7 13.9 18.1 15.5 18.1 16.6 17.5
[106] 19.3 13.6 18.3 16.8 19.4 16.8 16.3 17.4 15.2 16.1 17.2 16.8 20.4 19.5 14.7
[121] 18.1 15.3 19.2 15.7 17.8 18.2 15.6 15.8 16.9 17.6 18.2 20.1 17.0 15.7 15.7
[136] 19.1 17.7 16.8 15.6 17.5 17.8 17.4 15.5 18.2 18.2 17.2 15.7 16.7 17.3 15.8
lapply(iris[, 1:4], sum)
$Sepal.Length
[1] 876.5

$Sepal.Width
[1] 458.6

$Petal.Length
[1] 563.7

$Petal.Width
[1] 179.9
sapply(iris[, 1:4], sum)
Sepal.Length  Sepal.Width Petal.Length  Petal.Width 
       876.5        458.6        563.7        179.9 
tapply(iris[, 1], iris[, 5], sum)
    setosa versicolor  virginica 
     250.3      296.8      329.4 

Exercice :

Soit la fonction suivante :

Exo1 = function(M) {
    res = rep(0, 5)
    for (i in 1:5) {
        tmp = 0
        for (j in 1:4) {
            tmp = tmp + M[i, j]
        }
        res[i] = tmp
    }
    return(res)
}

M = matrix(1:20, nrow = 5, ncol = 4)
Exo1(M)

Proposez une fonction équivalente sans aucune boucle.

# A COMPLETER

5 Lois de probabilité sous R

Le logiciel R permet d’effectuer des calculs avec toutes les lois de probabilité usuelles, et aussi de simuler des échantillons issus de ces lois. Pour chaque distribution, quatre commandes préfixées par une des lettres d, p, q, r et suivi du nom de la distribution (nomdist) sont disponibles :

  • dnomdist : fonction de densité \(f_X(.)\) pour une loi continue ou fonction de probabilité \(\mathbb P(X=k)\) pour une loi discrète
  • pnomdist : fonction de répartition \(F_X(.)=\mathbb P(X\leq .)\)𝐹
  • qnomdist : quantiles
  • rnomdist : génère des réalisations aléatoires indépendantes de la distribution nomdist.

Voici une liste non exhaustive de lois de probabilité disponibles :

Loi nomdist
Gaussienne norm
Binomiale binom
Poisson pois
Uniforme continue unif
Exponentielle exp
Student t
Khi-deux chisq
Fisher f

Exercice :

Simulez un échantillon de \(n=1000\) variables aléatoires gaussiennes de moyenne \(10\) et de variance \(4\) Calculez la moyenne et la variance de l’échantillon.

# A COMPLETER

6 Entrée / Sortie

6.1 Importation d’un jeu de données

Pour importer un tableau de données contenu dans un fichier en un data.frame, on utilise la fonction read.table(). Par exemple, pour un fichier nommé “Tableau.txt”, on utilisera la commande Tab1 <- read.table("Tableau.txt") qui crée un data.frame Tab1. La commande read.table() admet des options dont

  • header : indique si la première ligne contient des noms de variables. Par défaut, la valeur de cette option est FALSE.
  • sep : précise le séparateur de champ dans le fichier entre guillemets (” ” par défaut).
  • dec : le caractère utilisé pour les décimales (“.” par défaut).

Les fonctions read.csv() et read.csv2() sont utilisées pour la lecture de fichiers de données au format .csv.

6.2 Exportation

6.2.1 Exportation en un fichier de données

Si maintenant on désire sauvegarder un jeu de données, on utilise la commande write.table(). Les principales options de cette fonction sont :

  • file : nom du fichier dans lequel écrire (vérifier le répertoire courant)
  • append : prend une valeur logique. Si TRUE, R ajoute les données dans le fichier concerné sans effacer les précédentes. La valeur par défaut est FALSE.
  • sep : précise le séparateur à utiliser.
  • dec : précise le caractère à utiliser pour les décimales.

Exercice :

Chargez le jeu de données ìrisdisponible dans R avec la commandedata(iris) Sauvegardez le jeu de données dans un fichier intitulé SauvIris.txt avec des “;” pour séparateurs. Importez les données du fichier SauvIris.txt

# A COMPLETER

6.2.2 Sauvegarde d’un / des objets R

R permet d’enregistrer des objets entiers, en conservant à la fois les données contenues dans les objets et les structures des objets.

La fonction save.image() peut être utilisée à tout moment pour enregistrer une image de session, c’est à dire l’ensemble des objets dans l’environnement de travail d’une session R. La sauvegarde d’une image de la session vous est également proposée lors de la fermeture de R.

La fonction save() permet d’enregistrer spécifiquement un ou des objets dans un fichier de format .RData. Ce fichier peut être à tout moment rechargé sous R avec la fonction load(). Voici un exemple :

x <- runif(20)
y <- list(a = 1, b = TRUE, c = "oops")
save(x, y, file = "xy.RData")
load("xy.RData")

On peut aussi enregistrer un seul objet, sans inclure le nom de l’objet, à l’aide de la fonction saveRDS(). L’objet, sauvegardé au format .rds peut être rechargé avec la fonction readRDS().