Bases de la programmation R
Bases de la programmation R
programmation R
M. Fall
1
Introduction
• Pour utiliser un langage de programmation, il faut en connaître la syntaxe et la
sémantique, du moins dans leurs grandes lignes.
• C’est dans cet esprit que ce chapitre introduit des notions de base du langage R
telles que l’expression, l’affectation, l’objet, les opérateurs, les fonctions, etc.
2
Commandes R
• L’utilisateur de R interagit avec l’interprète R en entrant des commandes à
l’invite de commande.
• Toute commande R est soit une expression, soit une affectation.
• Normalement, une expression est immédiatement évaluée et le résultat est
affiché à l’écran :
>2+3
[1] 5
> pi
[1] 3.141593
> cos(pi/4)
[1] 0.7071068
3
Commandes R
Affectation
• Lors d’une affectation, une expression est évaluée, mais le résultat est stocké dans un
objet (variable) et rien n’est affiché à l’écran.
> a <- 5
• Le symbole d’affectation est <- >a
[1] 5
> b <- a
>b
[1] 5
• Pour affecter le résultat d’un calcul dans un objet et simultanément afficher ce
résultat, il suffit de placer l’affectation entre parenthèses pour ainsi créer une nouvelle
expression > (a <- 2 + 3)
• Le symbole d’affectation inversé -> existe aussi, mais il est rarement utilisé.
Remarque
• Éviter d’utiliser l’opérateur = pour affecter une valeur à une variable puisque cette
pratique est susceptible d’engendrer de la confusion avec les constructions nom =
valeur dans les appels de fonction. 4
Commandes R
Séparation des commandes
• Que ce soit dans les fichiers de script ou à la ligne de commande, on sépare les
commandes R les unes des autres par un point-virgule ou par un retour à la
ligne (touche ENTER).
• Le point-virgule peut être utile pour séparer deux courtes expressions ou plus sur
une même ligne :
> a <- 5; a + 2
5
Commandes R
• On peut regrouper plusieurs commandes en une seule expression en les
entourant d’accolades { }.
• Le résultat du regroupement est la valeur de la dernière commande :
>{
+ a <- 2 + 3
+ b <- a
+b
+}
[1] 5
• Par conséquent, si le regroupement se termine par une assignation, aucune
valeur n’est retournée ni affichée à l’écran : > {
+ a <- 2 + 3
+ b <- a
+}
• Comme on peut le voir ci-dessus, lorsqu’une commande n’est pas complète à la
fin de la ligne, l’invite de commande de R change de > à + pour nous inciter à
compléter notre commande. 6
Conventions pour les noms d’objets
• Les caractères permis pour les noms d’objets sont les lettres
minuscules a–z et majuscules A–Z, les chiffres 0–9, le point « . » et le
caractère de soulignement «_».
• Le R est sensible à la casse, ce qui signifie que Age, age et AGE sont
trois objets distincts.
7
Conventions pour les noms d’objets
Mots réservés
• Certains noms sont utilisés par le système R, aussi vaut-il mieux éviter
de les utiliser.
c, q, t, C, D, I, diff, length, mean, pi, range, var.
• Certains mots sont réservés et il est interdit de les utiliser comme nom d’objet.
Les mots réservés pour le système sont :
break, else, for, function, if, in, next, repeat, return, while,
TRUE, FALSE,
Inf, NA, NaN, NULL,
NA_integer_, NA_real_, NA_complex_, NA_character_, 1, ..2, etc.
8
Conventions pour les noms d’objets
Les booléens
• Les variables T et F prennent par défaut les valeurs TRUE et FALSE,
respectivement, mais peuvent être réaffectées :
>T
[1] TRUE
>F
[1] FALSE
> TRUE <- 3
Error in TRUE <- 3 : membre gauche de l'assignation
(do_set) incorrect
>(T <- 3)
[1] 3
• Il est recommandé de toujours écrire les valeurs booléennes TRUE et FALSE au
long pour éviter des bogues difficiles à détecter.
9
Les objets R
10
Les objets R
• Tout dans le langage R est un objet : les variables contenant des données, les
fonctions, les opérateurs, même le symbole représentant le nom d’un objet est
lui-même un objet.
• Les objets possèdent au minimum un mode et une longueur et certains peuvent
être dotés d’un ou plusieurs attributs
• Le mode d’un objet est obtenu avec la fonction mode : > v <- c(1, 2, 5, 9)
> mode(v)
[1] "numeric"
• La fonction [Link]() retourne TRUE lorsque l’objet qui est fourni en paramètre est un
entier, FALSE sinon.
• De manière plus générale, les instructions commençant par is. et suivies du nom d’un
mode permettent de tester si l’objet indiqué en paramètre est de ce mode 13
Modes et types de données
a <- "Hello world!"
character (caractère). a
• Les chaînes de caractères sont placées entre ## [1] "Hello world!"
guillemets simples ‘ ou doubles ". typeof(a)
## [1] "character"
17
Valeurs manquantes, indéterminées et infinies
• Dans les applications statistiques, il est souvent utile de pouvoir représenter des
données manquantes.
• Dans R, l’objet spécial NA remplit ce rôle.
• Par défaut, le mode de NA est logical, mais NA ne peut être considéré ni comme
TRUE, ni comme FALSE.
• Toute opération impliquant une donnée NA a comme résultat NA.
• Certaines fonctions (sum, mean, par exemple) ont par conséquent un argument
[Link] qui, lorsque TRUE, élimine les données manquantes avant de faire un
calcul.
• La valeur NA n’est égale à aucune autre, pas même elle-même (selon la règle ci-
dessus, le résultat de la comparaison est NA) : > NA == NA
[1] NA
• Par conséquent, pour tester si les éléments d’un objet sont NA ou non il
• faut utiliser la fonction [Link] : > [Link](NA)
[1] TRUE 18
Vecteurs
19
Les vecteurs
• En R, à toutes fins pratiques, tout est un vecteur.
• Contrairement à certains autres langages de programmation, il n’y a pas de
notion de scalaire en R ; un scalaire est simplement un vecteur de longueur 1.
• Le vecteur est l’unité de base dans les calculs.
• Dans un vecteur simple, tous les éléments doivent être du même mode.
• Les fonctions de base pour créer des vecteurs sont :
• c : concaténation;
• numeric : vecteur de mode numeric ;
• logical : vecteur de mode logical;
• character : vecteur de mode character.
20
Vecteurs
• Il est possible et souvent souhaitable de donner une étiquette à chacun des
éléments d’un vecteur.
> (v <- c(a = 1, b = 2, c = 5))
a b c
1 2 5
> v <- c(1, 2, 5)
> names(v) <- c("a", "b", "c")
>v
a b c
1 2 5
• Ces étiquettes font alors partie des attributs du vecteur.
21
Vecteurs
• L’indiçage dans un vecteur se fait avec les crochets [ ].
• On peut extraire un élément d’un vecteur par sa position ou par son étiquette, si
elle existe.
> v[3]
C
5
> v["c"]
C
5
22
Exercice
• Créer le vecteur v des entiers compris entre 5 et 13
• Quelle est la longueur de v
• Ajouter au vecteur v deux éléments sans valeurs (NA)
• Calculer la moyenne des éléments de v (fonction mean)
• Créer le vecteur noms contenant au moins 3 noms d’étudiants
• Quelle la longueur de noms (nombre d’éléments)
• Donner la longueur (nombre de caractères) de chaque nom du vecteur noms
24
Matrices
• Le R étant un langage spécialisé pour les modélisations mathématiques, il
supporte la manipulation des matrices
• Une matrice est un vecteur avec un attribut dim de longueur 2.
• Cela change implicitement la classe de l’objet pour "matrix" et, de ce fait,
• le mode d’affichage de l’objet ainsi que son interaction avec plusieurs opérateurs
et fonctions.
25
Matrices
• La fonction de base pour créer des matrices est matrix :
26
Matrices : extraction
• On extrait un élément d’une matrice en précisant sa position dans chaque
dimension de celle-ci, séparées par des virgules :
> (m <- matrix(c(40, 80, 45, 21, 55, 32), nrow = 2, ncol = 3))
[,1] [,2] [,3]
[1,] 40 45 55
[2,] 80 21 32
> m[1, 2]
[1] 45
28
Fusion de matrices
• La fonction cbind permet de fusionner horizontalement deux matrices (ou plus)
ayant le même nombre de lignes.
29
Exercices
• Créer une matrice M1(4x5) d’entiers
• Créer une matrice M2(4x3) contenant les entiers de 10 à 21 et ranger les
éléments par ligne
• Créer une matrice M3(2x5) contenant des nombres aléatoires compris entre 60
et 69 (fonction sample)
• Afficher le 1er élément de la 3ième ligne de M1
• Remplacer 1er élément de la 3ième ligne de M1 par le 2ième élément de la 1ère
colonne de M2
• Afficher tous les éléments de 3ième colonne de M3
• Créer la matrice MC qui est le résultat de la fusion de M1 et M2
• Créer la matrice MR qui est le résultat de la fusion de M1 et M3
• Extraire les 4ième et 7ième colonnes de MC.
30
Listes
31
Les listes
• La liste est le mode de stockage le plus général et polyvalent du langage R.
• Il s’agit d’un type de vecteur spécial dont les éléments peuvent être de
n’importe quel mode, y compris le mode list.
• Cela permet donc d’emboîter des listes, d’où le qualificatif de récursif pour ce
type d’objet.
• La fonction de base pour créer des listes est list :
> (x <- list(size = c(1, 5, 2), user = "Joe", new = TRUE))
$size
[1] 1 5 2
$user
[1] "Joe"
$new
[1] TRUE
• Ci-dessus, le premier élément de la liste est de mode "numeric", le second de
mode "character" et le troisième de mode "logical". 32
Les listes
• Il est recommandé de nommer les éléments d’une liste.
• En effet, les listes contiennent souvent des données de types différents et il
peut s’avérer difficile d’identifier les éléments s’ils ne sont pas nommés.
• De plus, comme nous le verrons ci-dessous, il est très simple d’extraire les
éléments d’une liste par leur étiquette.
• La liste demeure un vecteur. On peut donc l’indicer avec l’opérateur [ ].
• Cependant, cela retourne une liste contenant le ou les éléments indicés.
• C’est rarement ce que l’on souhaite.
33
Les listes
• Pour indicer un élément d’une liste et n’obtenir que cet élément, et non une liste
contenant l’élément, il faut utiliser l’opérateur d’indiçage [[ ]].
• Comparer > x[1]
$size
[1] 1 5 2
• Et > x[[1]]
[1] 1 5 2
• Évidemment, on ne peut extraire qu’un seul élément à la fois avec les crochets
doubles [[ ]].
• Si l’indice utilisé dans [[ ]] est un vecteur, il est utilisé récursivement pour indicer
la liste :
• cela sélectionnera la composante de la liste correspondant au premier élément du vecteur,
puis l’élément de la composante correspondant au second élément du vecteur, et ainsi de
suite 34
Les listes
• La meilleure façon d’indicer un seul élément d’une liste est par son
étiquette avec l’opérateur $ :
> x$size
[1] 1 5 2
35
Exercices
• Créer une liste contenant trois éléments dont :
• Le nom de votre classe
• Les noms de 4 étudiants de votre classe
• Et la moyenne de la classe
• Afficher tous les éléments de la liste
• Afficher tous les noms des étudiants
• Afficher le nom de chaque étudiants un à un
• Afficher les noms du premier étudiant et du dernier étudiant
• Nommer les éléments du vecteur correspondant aux noms des étudiants par les
prénoms des étudiants concernés
37
Data frames
• Les vecteurs, les matrices, et les listes sont les types d’objets les plus
fréquemment utilisés en programmation en R.
• Toutefois, un grand nombre de procédures statistiques (pensons à la régression
linéaire, par exemple ) repose davantage sur les data frames pour le stockage
des données.
• Un data frame est une liste de classe "[Link]" dont tous les éléments sont
de la même longueur
• Il est généralement représenté sous la forme d’un tableau à deux dimensions.
• Chaque élément de la liste sous-jacente correspond à une colonne.
• Bien que visuellement similaire à une matrice un data frame est plus général
puisque les colonnes peuvent être de modes différents ;
• pensons à un tableau avec des noms (mode character) dans une colonne et des notes
(mode numeric) dans une autre.
38
Data frames
• On crée un data frame avec la fonction [Link]() ou, pour convertir
un autre type d’objet en data frame, avec [Link]().
• Le data frame peut être indicé à la fois comme une liste et comme une
matrice.
• Les fonctions rbind et cbind peuvent être utilisées pour ajouter des
lignes ou des colonnes à un data frame.
Remarque
• L’élément distinctif entre un data frame et une liste générale, c’est que
tous les éléments du premier doivent être de la même longueur et
que, par conséquent, R les dispose en colonnes.
• Le dataframe est donc le type d’objet désigné pour stocker des données de modes
différents, mais qui se présentent sous forme de tableau à deux dimensions.
39
Exercices
• Créer 3 vecteurs nom, prenom et age contenant respectivement les noms,
prénoms et ages de 5 étudiants
• Créer un dataframe nommé etudiants à partir des 3 vecteurs précédents
• Afficher le dataframe etudiants
• Afficher les deux premières colonnes du dataframe
• Afficher le prénom du troisième étudiant
• Modifier l’age du 5ième étudiant et afficher la ligne de cet étudiant
• Ajouter un sixième étudiant au dataframe
• Ajouter une colonne adresse avec des valeurs au dataframe
40
Indexation
41
Indexation
• L’indexation sert principalement à deux choses : soit extraire des éléments d’un
objet avec la construction x[i], ou les remplacer avec la construction x[i] <- y.
• De même, les opérations d’extraction et de remplacement d’un élément d’une
liste sont de la forme x$etiquette et x$etiquette <- y
• Il existe plusieurs façons d’indicer un vecteur dans le langage R.
42
Indexation
1. Avec un vecteur d’entiers positifs. Les éléments se trouvant aux positions
correspondant aux entiers sont extraits du vecteur, dans l’ordre. C’est la technique la
plus courante : > x <- c(A = 2, B = 4, C = -1, D = -5, E = 8)
> x[c(1, 3)]
A C
2 -1
2. Avec un vecteur d’entiers négatifs. Les éléments se trouvant aux positions
correspondant aux entiers négatifs sont alors éliminés du vecteur : >x[c(-2, -3)]
ADE
2 -5 8
3. Avec un vecteur booléen. Le vecteur d’indiçage doit alors être de la même longueur
que le vecteur indicé. Les éléments correspondant à une valeur TRUE sont extraits
du vecteur, alors que ceux correspondant à FALSE sont éliminés :
>x>0
ABCDE
TRUE TRUE FALSE FALSE TRUE
> x[x > 0]
ABE
248 43
Indexation
4. Avec un vecteur de chaînes de caractères. Utile pour extraire les éléments d’un
vecteur à condition que ceux-ci soient nommés :
> x[c("B", "D")]
B D
4 -5
5. L’indice est laissé vide. Tous les éléments du vecteur sont alors sélectionnés :
> x[ ]
ABCDE
2 4 -1 -5 8
• Cette méthode est essentiellement utilisée avec les matrices et tableaux pour sélectionner
tous les éléments d’une dimension.
44
Exercices
• Créer 2 vecteurs nom et age contenant respectivement les noms et âges de 5 étudiants
• Afficher le nom du troisième étudiant
• Afficher les âges des 2ième ,3ième et 4ième étudiants
• Afficher les noms des 1er et 4ième étudiants
• Afficher les noms de tous les étudiants sauf le 3ième
• Sinon, le plus court vecteur est recyclé un nombre fractionnaire de fois, mais
comme ce résultat est rarement souhaité et provient généralement d’une erreur
de programmation, un avertissement est affiché :
> 1:10 + c(2, 4, 6)
[1] 3 6 9 6 9 12 9 12 15 12
Message d'avis :
In 1:10 + c(2, 4, 6) :
la taille d'un objet plus long n'est pas un multiple de la
taille d'un objet plus court
47
Opérateurs
48
Exercices
• Dans la suite de l’exercice précédent afficher les nom des étudiants agés au moins
de 23 ans.
• Calculer le produit de deux matrices M1 et M2
• Calculer le produit matriciel de deux matrices M3 et M4
• Calculer la somme des matrices M5 et M6 de mêmes formats
• Créer deux vecteurs booléens et afficher le résultat de la conjonction puis de la
disjonction de ces vecteurs
49
Les fonctions
50
Appels de fonctions
• Il n’y a pas de limite pratique quant au nombre d’arguments que peut avoir une
fonction.
• Les arguments d’une fonction peuvent être spécifiés selon l’ordre établi dans la
définition de la fonction.
• Cependant, il est beaucoup plus prudent et fortement recommandé de spécifier les
arguments par leur nom, avec une construction de la forme nom = valeur, surtout après
les deux ou trois premiers arguments.
• L’ordre des arguments est important ; il est donc nécessaire de les nommer s’ils
ne sont pas appelés dans l’ordre.
• Certains arguments ont une valeur par défaut qui sera utilisée si l’argument n’est
pas spécifié dans l’appel de la fonction.
51
Exemple
matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
• La fonction compte cinq arguments : data, nrow, ncol, byrow et dimnames.
• Ici, chaque argument a une valeur par défaut (ce n’est pas toujours le cas).
• Ainsi, un appel à matrix sans argument résulte en une matrice 1 × 1 remplie par
colonne (sans importance, ici) de l’objet NA et dont les dimensions sont
dépourvues d’étiquettes
> matrix()
[,1]
[1,] NA
52
Appels de fonctions
• Appel plus élaboré utilisant tous les arguments. Le premier argument est
rarement nommé :
> matrix(1:6, nrow = 2, ncol = 3, byrow = TRUE, dimnames = list( c("Gauche", "Droit"),
+ c("Rouge", "Vert", "Bleu") ))
53
Fonctions de manipulation de vecteurs
• seq : génération de suites de nombres
> seq(1, 9, by = 2)
[1] 1 3 5 7 9
• seq_len : version plus rapide de seq pour générer la suite des nombres de 1 à la valeur
de l’argument
> seq_len(10)
[1] 1 2 3 4 5 6 7 8 9 10
• rep: répétition de valeurs ou de vecteurs
> rep(2, 10)
[1] 2 2 2 2 2 2 2 2 2 2
• sort: tri en ordre croissant ou décroissant
> sort(c(4, -1, 2, 6))
[1] -1 2 4 6
• rank: rang des éléments d’un vecteur dans l’ordre croissant ou décroissant
> rank(c(4, -1, 2, 6))
[1] 3 1 2 4
54
Fonctions de manipulation de vecteurs
• rev : renverser un vecteur
> rev(1:10)
[1] 10 9 8 7 6 5 4 3 2 1
• head : extraction des 𝑛 premiers éléments d’un vecteur (𝑛 > 0) ou suppression
des 𝑛 derniers (𝑛 < 0)
> head(1:10, 3); head(1:10, -3)
[1] 1 2 3
[1] 1 2 3 4 5 6 7
• tail : extraction des 𝑛 derniers éléments d’un vecteur (𝑛 > 0) ou suppression des
𝑛 premiers (𝑛 < 0)
> tail(1:10, 3); tail(1:10, -3)
[1] 8 9 10
[1] 4 5 6 7 8 9 10
• unique : extraction des éléments différents d’un vecteur
> unique(c(2, 4, 2, 5, 9, 5, 0))
[1] 2 4 5 9 0 55
Recherche d’éléments dans un vecteur
Soit le vecteur x suivant :
>x
[1] 4 -1 2 -3 6
• which : positions des valeurs TRUE dans un vecteur booléen
> which(x < 0)
[1] 2 4
• [Link] : position du minimum dans un vecteur
> [Link](x)
[1] 4
• [Link] : position du maximum dans un vecteur
> [Link](x)
[1] 5
• match : position de la première occurrence d’un élément dans un vecteur
> match(2, x)
[1] 3
56
Arrondi
Soit le vecteur x suivant :
>x
[1] -3.6800000 -0.6666667 3.1415927 0.3333333
[5] 2.5200000
• round : arrondi à un nombre défini de décimales (par défaut 0)
> round(x)
[1] -4 -1 3 0 3
> round(x, 3)
[1] -3.680 -0.667 3.142 0.333 2.520
• floor : plus grand entier inférieur ou égal à l’argument
> floor(x)
[1] -4 -1 3 0 2
• ceiling: plus petit entier supérieur ou égal à l’argument
> ceiling(x)
[1] -3 0 4 1 3
• trunc: troncature vers zéro ; différent de floor pour les nombres négatifs
> trunc(x)
[1] -3 0 3 0 2
57
Sommaires et statistiques descriptives
Soit le vecteur x suivant :
>x
[1] 14 17 7 9 3 4 25 21 24 11
• sum, prod : somme et produit des éléments d’un vecteur
> sum(x); prod(x)
[1] 135
[1] 24938020800
• diff : différences entre les éléments d’un vecteur
> diff(x)
[1] 3 -10 2 -6 1 21 -4 3 -13
• mean : moyenne arithmétique (et moyenne tronquée avec l’argument trim)
> mean(x)
[1] 13.5
• var, sd : variance et écart type
> var(x)
[1] 64.5
58
Sommaires et statistiques descriptives
• min, max : minimum et maximum d’un vecteur
> min(x); max(x)
[1] 3
[1] 25
• range : vecteur contenant le minimum et le maximum d’un vecteur
> range(x)
[1] 3 25
• median : médiane empirique
> median(x)
[1] 12.5
• quantile : quantiles empiriques
> quantile(x)
0% 25% 50% 75% 100%
3.0 7.5 12.5 20.0 25.0
• summary : statistiques descriptives d’un échantillon
> summary(x)
Min. 1st Qu. Median Mean 3rdQu. Max.
3.0 7.5 12.5 13.5 20.0 25.0
59
Sommaires cumulatifs et comparaisons élément par élément
• Soit le vecteur x suivant :
>x
[1] 14 17 7 9 3
62
Commentaires
• Un commentaire est une ligne ou une portion de ligne qui sera ignorée par R.
• Ceci signifie qu’on peut y écrire ce qu’on veut, et qu’on va les utiliser pour ajouter
tout un tas de commentaires à notre code permettant de décrire les différentes
étapes du travail, les choses à se rappeler, les questions en suspens, etc.
63