% Mes commentaires se mettront sous cette forme
Les copies du PDF seront mises sous deux couleurs, de façon à différencier deux
idées différentes.
Ainsi, comme vous pouvez le voir.
Goulet_introduction_programmation_R
É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.
On peut regrouper plusieurs commandes en une seule expression en les
entourant d’accolades { }.
>{
+ a <- 2 + 3
+ b <- a + b
+}
[1] 5
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.
%je suppose que ‘␣’ c’est pour l’espace
Le R est sensible à la casse, ce qui signifie que foo, Foo et FOO sont trois objets
distincts. Un moyen simple d’éviter des erreurs liées à la casse consiste à
n’employer que des lettres minuscules.
Certains noms sont utilisés par le système R, aussi vaut-il mieux éviter de les
utiliser. En particulier, éviter d’utiliser :
c, q, t, C, D, I, diff, length, mean, pi, range, var.
> v <- c(1, 2, 5, 9)
> mode(v)
[1] "numeric" x
1
% mode ( ) permet de trouver le mode de chacun, de tous les éléments qui
composent R
Le mode prescrit ce qu’un objet peut contenir.
Les objets de mode "numeric", "complex", "logical" et "character" sont des objets
simples (atomic en anglais) qui ne peuvent contenir que des données d’un seul
type.
En revanche, les objets de mode "list" ou "expression" sont des objets récursifs
qui peuvent contenir d’autres objets.
La fonction is.null teste si un objet est NULL ou non.
Inf représente +∞.
-Inf représente −∞.
NaN (Not a Number) représente une forme indéterminée.
Ces valeurs sont testées avec les fonctions is.infinite, is.finite et is.nan.
> matrix (1:6, nrow = 2, ncol = 3)
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
%matrix est utilisé pour les matrices
> array(1:24, dim = c(3, 4, 2))
,,1
[,1] [,2] [,3] [,4]
[1,] 1 4 7 10
[2,] 2 5 8 11
[3,] 3 6 9 12
,,2
[,1] [,2] [,3] [,4]
[1,] 13 16 19 22
2
[2,] 14 17 20 23
[3,] 15 18 21 24
%array pour les matrices de plus de 2 dimensions
%Le remplissage des tableaux est particulier donc faire attention
La fonction rbind permet de fusionner verticalement deux matrices (ou plus)
ayant le même nombre de colonnes. % voir page 28
La fonction cbind permet de fusionner horizontalement deux matrices (ou plus)
ayant le même nombre de lignes. % voir page 28
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.
La fonction de base pour créer des listes est list :
> (x <- list(size = c(1, 5, 2), user = "Joe", new = TRUE))
$size [1]
152
$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"
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
3
Une autre — la meilleure, en fait — 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
Data frame
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.
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.
On crée un data frame avec la fonction data.frame ou, pour convertir un autre
type d’objet en data frame, avec as.data.frame.
Les fonctions rbind et cbind peuvent être utilisées pour ajouter des lignes ou des
colonnes à un data frame.
> Equipe <- c("Washington", "Dallas", "Chicago",
+ "Los Angeles", "St-Louis", "Détroit",
+ "Montréal", "Boston")
> MJ <- c(55, 56, 57, 58, 56, 57, 56, 57)
>V <- c(36, 32, 30, 30, 25, 25, 22, 24)
>D <- c(16, 19, 21, 22, 19, 21, 27, 31)
> DP <- c( 3, 5, 6, 6, 12, 11, 7, 2)
> PTS <- c(75, 69, 66, 66, 62, 61, 51, 50)
On les combine ensuite sous forme de liste nommée.
> list(Equipe = Equipe, MJ = MJ, V = V, D = D,
+ DP = DP, PTS = PTS)
$Equipe
[1] "Washington" "Dallas" "Chicago"
[4] "Los Angeles" "St-Louis" "Détroit"
[7] "Montréal" "Boston"
4
$MJ
[1] 55 56 57 58 56 57 56 57
$V
[1] 36 32 30 30 25 25 22 24
$D
[1] 16 19 21 22 19 21 27 31
$DP
[1] 3 5 6 6 12 11 7 2
$PTS
[1] 75 69 66 66 62 61 51 50
INDICAGE
Il existe cinq façons d’indicer un vecteur dans le langage R. Dans tous les cas,
l’indiçage se fait à l’intérieur de crochets [ ].
L’indiçage 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 de la forme x$etiquette et x$etiquette <- y correspondent à des appels aux
fonctions $ et $<-.
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(A = 2, B = 4, C = -1, D = -5, E = 8)
> x[c(-2, -3)]
ADE
2 -5 8
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
A B C D E
TRUE TRUE FALSE FALSE TRUE
5
> x[x > 0]
ABE
248
Ne pas utiliser '=' pour l'affectation. Les opérateurs d’affectations standard en R
sont '<-' et '->'.
(x <- 5) # affecter et afficher
x <- y <- 5 # affecter la valeur de 'y' à 'x'
Pour regrouper plusieurs expressions en une seule commande, il faut soit les
séparer par un point-virgule ';', soit les regrouper à l'intérieur d'accolades { } et
les séparer par des retours à la ligne. % page 36
mean(x, na.rm = TRUE) # éliminer les 'NA' avant le calcul
is.na(x) # tester si les données sont 'NA'
nrow(x) # nombre de lignes
dim(x)[1] # idem
ncol(x) # nombre de colonnes
dim(x)[2] # idem
Les matrices sont remplies par colonne par défaut. Utiliserl'option 'byrow' pour
remplir par ligne.
matrix(1:12, nrow = 3, byrow = TRUE)
% je suppose que row veut dire ligne
(x <- list(joueur = c("V", "C", "C", "M", "A"), score = c(10, 12, 11, 8, 15), expert =
c(FALSE, TRUE, FALSE, TRUE, TRUE), niveau = 2))
%Un data frame est une liste dont les éléments sont tous de même longueur.
% je suis maintenant à la page 49
CHAPITRE 3
6
%*% produit matriciel
%% modulo
%/% division entière
Par exemple, la définition de la fonction matrix est la suivante :
Matrix (data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL)
> matrix()
[,1]
[1,] NA
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")))
Rouge Vert Bleu
Gauche 1 2 3
Droit 4 5 6
Il est recommandé de consulter les diverses rubriques d’aide pour connaître
toutes les options des fonctions.
Génération de suites de nombres :
> seq(1, 9, by = 2)
[1] 1 3 5 7 9
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
Répétition de valeurs ou de vecteurs
> rep(2, 10)
[1] 2 2 2 2 2 2 2 2 2 2
Tri en ordre croissant ou décroissant
7
> sort(c(4, -1, 2, 6))
[1] -1 2 4 6
Renverser un vecteur
> rev(1:10)
[1] 10 9 8 7 6 5 4 3 2 1
Extraction des éléments différents d’un vecteur
> unique(c(2, 4, 2, 5, 9, 5, 0))
[1] 2 4 5 9
>x
[1] -3.6800000 -0.6666667 3.1415927 0.3333333
[5] 2.5200000
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
Plus grand entier inférieur ou égal à l’argument
> floor(x)
[1] -4 -1 3 0
%partie entière
>x
[1] 14 17 7 9 3 4 25 21 24 11
Moyenne arithmétique (et moyenne tronquée avec l’argument trim)
8
> mean(x) [1] 13.5
Variance et écart type (versions sans biais)
> var(x)
[1] 64.5
% sd pour l’écart type
Vecteur contenant le minimum et le maximum d’un vecteur
> range(x)
[1] 3 25
Médiane empirique
> median(x)
[1] 12.5
Quantiles empiriques
> quantile(x)
0% 25% 50% 75% 100%
3.0 7.5 12.5 20.0 25.0
Statistiques descriptives d’un échantillon
> summary (x)
Min. 1st Qu. Median Mean 3rd Qu. Max.
3.0 7.5 12.5 13.5 20.0 25.0
Transposée
> t(x)
[,1] [,2]
[1,] 2 1
[2,] 4 3
9
Déterminant
> det(x)
[1] 2
1) avec un seul argument (une matrice carrée) : inverse d’une matrice ; 2) avec
deux arguments (une matrice carrée et un vecteur) : solution du système
d’équations linéaires Ax = b
> solve(x)
[,1] [,2]
[1,] 1.5 -2
[2,] -0.5 1
> solve (x, c (1, 2))
[1] -2.5 1.5
%page 59
La syntaxe de outer est :
outer(X, Y, FUN)
Nous avons trouvé ici la fonction clé pour résoudre notre problème sans faire de
boucles. La fonction outer permet de calculer facilement tous les résultats
possibles de la somme de deux dés :
> x <- 1:8 # résultats possibles du premier dé
> y <- 1:6 # résultats possibles du second dé
> outer(x, y, "+") # sommes de toutes les combinaisons
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 2 3 4 5 6 7
[2,] 3 4 5 6 7 8
[3,] 4 5 6 7 8 9
[4,] 5 6 7 8 9 10
[5,] 6 7 8 9 10 11
[6,] 7 8 9 10 11 12
[7,] 8 9 10 11 12 13
[8,] 9 10 11 12 13 14
10
Nous savons déjà que l’expression
> m <- outer(x, y, "+")
Calcule tous les résultats de la somme du lancer des deux dés. Il faut maintenant
extraire de cette matrice les résultats supérieurs à 7 et en faire la moyenne. Par
la propriété d’opération élément par élément, la comparaison
>m>7
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] FALSE FALSE FALSE FALSE FALSE
FALSE
[2,] FALSE FALSE FALSE FALSE FALSE
TRUE
[3,] FALSE FALSE FALSE FALSE TRUE
TRUE
[4,] FALSE FALSE FALSE TRUE TRUE
TRUE
[5,] FALSE FALSE TRUE TRUE TRUE TRUE
[6,] FALSE TRUE TRUE TRUE TRUE TRUE
[7,] TRUE TRUE TRUE TRUE TRUE TRUE
[8,] TRUE TRUE TRUE TRUE TRUE
TRUE
Retourne une matrice booléenne de la même dimension que m. Pour extraire les
résultats de m supérieurs à 7, il suffit d’indicer m avec la matrice booléenne ci-
dessus :
> m[m > 7]
[1] 8 9 8 9 10 8 9 10 11 8 9 10 11 12 8 9
[17] 10 11 12 13 8 9 10 11 12 13 14
Le résultat recherché est donc
> mean(m[m > 7])
[1] 10.07407
Le tout peut s’écrire en une seule expression — quelque peu alambiquée —
ainsi :
> mean((m <- outer(x, y, "+"))[m > 7])
[1] 10.07407
(x <- matrix(1:4, 2)) # matrice 2 x 2
11
(y <- matrix(3:6, 2)) # autre matrice 2 x 2
x*y # produit *élément par élément*
x %*% y # produit matriciel
## Les invocations de la fonction 'matrix' ci-dessous sont
## toutes équivalentes. On remarquera, entre autres, comment
## les arguments sont spécifiés (par nom ou par position).
matrix(1:12, 3, 4)
matrix(1:12, ncol = 4, nrow = 3)
matrix(nrow = 3, ncol = 4, data = 1:12)
matrix(nrow = 3, ncol = 4, byrow = FALSE, 1:12)
matrix(nrow = 3, ncol = 4, 1:12, FALSE)
## Renverser l'ordre d'un vecteur.
rev(x)
diff(x) # x[2] - x[1], x[3] - x[2], etc.
sum(x) # somme des éléments
## PRODUIT EXTÉRIEUR
x <- c(1, 2, 4, 7, 10, 12)
y <- c(2, 3, 6, 7, 9, 11)
outer(x, y) # produit extérieur
x %o% y # équivalent plus court
%Structure de contrôle (très intéressant) page 70 du document
## Chargement du package 'MASS', qui contient plusieurs
## fonctions statistiques très utiles.
library("MASS")
12
CHAPITRE 4
13