You are on page 1of 30

.

Les bases du langage R

Introduction à R pour la recherche biomédicale

http://www.aliquote.org/cours/2012_biomed

.
.
Introduction
Qu’est-ce que R ?
▶ R est un logiciel pour le traitement et la modélisation de données
statistiques (Ihaka & Gentleman, 1996; Venables & Ripley, 2002).
▶ Dans cet environnement interactif, l’utilisateur envoie des
commandes, R les interprète et renvoit un résultat.
▶ Il existe des interfaces graphiques plus ou moins avancées (Deducer,
Rcmdr, etc.), mais on ne les utilisera pas.

R est gratuit, possède de nombreuses fonctionnalités pour la modélisation,


le reporting et la visualisation de données. Il s’agit avant tout d’un lan-
gage de programmation inspiré du langage S développé dans les années 80
(Becker & Chambers, 1981; 1984). Le projet est maintenu par la R Foundation
for Statistical Computing, et toutes les informations officielles sur le projet
R se trouvent à cette adresse : http://www.r-project.org.

.
.
Représentation des données
Contrairement à SPSS ou Statistica, on ne travaille pas à partir d’une vue de
type tableur des données, comme MS Excel®.

A B C D
score gender IQ SES score gender IQ SES 1
1 1 M 92 C 1 M 92 C 2
2 5 M 96 A 5 M 96 A 3
3 3 F 97 C 3 F 97 C 4
4 1 F 93 C
5 5 F 101 C
1 F 93 C 5
6 2 F 100 B
5 F 101 C 6
7 2 M 97 B 2 F 100 B 7
2 M 97 B 8

Un tableau Excel sera représenté sous forme d’un data.frame, c’est-à-dire


un tableau avec des données de type mixte (chaînes de caractères, nombres,
dates, etc.) et des lignes/colonnes nommées.
Des sources de données externes au format SPSS, Stata, SAS, ou des bases
de données MySQL, peuvent être importées sans problème majeur.

.
.
Exemple de commandes R
Voici un exemple de régression simple à partir de données artificielles :
n <- 100
x <- runif ( n )
y <- 0 .9 + 0 .65 * x + rnorm ( n )
# Fit a simple linear model
summary ( lm ( y ∼ x ))

Dans l’exemple ci-dessus, on voit que la syntaxe est proche de celle d’un lan-
gage de programmation : on travaille sur des variables à l’aide de fonctions.

Comme dans tout langage, il existe un vocabulaire et une syntaxe spécifique


au langage R, ainsi que des règles sémantiques. Dans une optique introduc-
tive, on s’intéressera essentiellement aux fonctions de base qui permettent
d’effectuer la plupart des opérations statistiques.

.
.
Environnement de travail
Pour travailler avec R, il est nécessaire d’avoir les outils adaptés, en parti-
culier un environnement de développement “intelligent” qui ne gêne pas
l’approche interactive, p.ex. RStudio : http://rstudio.org/.

.
.
Obtenir de l’aide
Il est indispensable de savoir où chercher l’information et de bien se docu-
menter !
▶ sous R directement,
help(topic, package=) ou
help.search(pattern)
▶ la documentation R disponible sur CRAN (Manuals)

▶ la mailing-list R-help

▶ le moteur de recherche Google R-Seek

▶ les sites Stack Exchange (bien lire la FAQ) :

▶ http://stackoverflow.com
▶ http://crossvalidated.com

The R Inferno (Burns, 2011) est une lecture conseillée pour les personnes
désirant approfondir leurs connaissances de R.

.
.
Ressources bibliographiques
En anglais :
▶ Introductory Statistics with R (Dalgaard, 2006)

▶ Biostatistical Design and Analysis Using R (Logan, 2010)

▶ Modern Applied Statistics with S (Venables & Ripley, 2002)

En français :
▶ R pour les débutants (Paradis, 2005)

▶ Comprendre et utiliser les statistiques dans les sciences de la vie


(Falissard, 2005)

Voir aussi http://www.R-project.org/doc/bib/R-books.html.

.
.
Les objets R
L’élément de base est le vecteur (un scalaire est alors un vecteur de longueur
1) que l’on peut créer avec la commande c et dont les éléments sont de l’un
des “types” (mode) suivants :
▶ numeric, des nombres (entiers ou flottants, integer/double)
▶ logical, des booléens à valeur dans {TRUE, FALSE}
▶ character, des caractères ASCII
Les expressions suivantes sont valides :
nombre <- 3 .141593
v <- c (1 ,2 ,3 ,4)
b <- c (T ,F ,T , F )
s <- c ( " h " ," e " ," l " ," l " ," o " )
a <- b <- rnorm (2)
u <- b

.
.
Adresser les éléments d’un vecteur
On utilise [ pour indexer les n éléments d’un vecteur, sachant que l’index du
premier élément vaut 1 (et non 0 comme dans certains langages) :
v [1]
v [ c (1 ,4)]

On peut adresser les élements d’un vecteur en utilisant les valeurs con-
tenues dans un autre vecteur (principe d’un dictionnaire), par exemple :
v[b ] # valeurs de v telles que b vaut TRUE
s [ v [3]] # v [3]=3 ème valeur de s

On peut encore adresser les éléments d’un vecteur par leur “nom”, le cas
échéant :
names ( v ) <- c ( " toto " ," titi " ," tata " ," tutu " )
v [ " tata " ]

.
.
Application
On peut également vouloir isoler des groupes de valeurs :
▶ Restriction d’un vecteur à certaines de ses valeurs (filtre),

▶ ventilation de scores par niveaux d’un facteur de classification.

Exemple :
n <- 100
age <- sample (25:45 , n , replace = TRUE )
sex <- sample ( c ( " M " ," F " ) , n , replace = TRUE )
length ( age [ sex == " F " ])
length ( sex [ age >= 30 & age <= 40])

Une expression telle que age > 30 retourne un vecteur booléen (“les élé-
ments du vecteur age sont-ils supérieurs (strictement) à 30”). Ce vecteur a
la même longueur que age. Les indices de age pour lesquels cette condition
est vérifiée peuvent être obtenus ainsi :
which ( age > 30)

.
.
Recap’
Voici deux façons d’adresser spécifiquement un sous-ensemble des valeurs
assignées à un vecteur x :
x <- c (1 ,4 ,10 ,3 ,1)
names ( x ) <- letters [1: length ( x )]
idx <- c (1 ,3 ,4)
g <- c (T ,F ,T ,T , F )
all ( x [ idx ] == x [ g ])
idx 1 3 4
avec les caractéristiques suivantes :
▶ length(idx) ≤ length(x)
a b c d e
▶ length(g) = length(x) x 1 4 10 3 1

g T F T T F

.
.
Propriétés des vecteurs
On peut connaître la taille d’un vecteur (length), son nombre d’éléments
uniques (unique), le type de ses éléments (class ou str).

On peut également nommer les éléments d’un vecteur :


x <- rnorm (100)
res <- c ( m = mean ( x ) , s = sd ( x ))

On peut les “assembler” ou effectuer des opérations d’algèbre linéaire :


y <- rnorm (100)
c(ol)bind(ing)
rbind (x , y )
1 2
cbind (x , y )
4 7
t ( x ) % * % x * 1 / ( length ( x ) -1) r(ow)bind(ing)
10 1
1 4 10 3 1
3 5

2 7 1 5 3 1 3

.
.
Générer des vecteurs
En dehors de l’opérateur c, on peut utiliser les commandes pré-définies dans
R:
1:5
seq (1 , 5)
rep ( c (1 ,3) , 5)
rep ( c (1 ,3) , each =5) # rep ( c (1 ,3) , c (5 ,5))

Comme on l’a vu, l’indexation d’un vecteur repose sur… un vecteur :


x <- c (0 ,1 ,1 ,0 ,1 ,0 ,1 ,0 ,0)
x [3]
x [ length ( x )]
x [2:4]
x [ c (2 ,4)]
seq (1 , 10)[ seq (1 , 10 , by =2)] # nombres impairs
seq (1 , 10)[ seq (2 , 10 , by =2)] # nombres pairs

.
.
Opérer sur des vecteurs
On peut également effectuer des opérations de tri sur un vecteur :
x <- 1:10 x 1 2 3 4 5 6 7 8 9 10
xs <- sample ( x )
sort ( xs , decreasing = TRUE ) xs 1 4 8 5 2 6 10 9 3 7

order ( xs ) sorting 10 9 8 7 6 5 4 3 2 1

ou obtenir le rang de ses élements ordering 1 5 9 2 4 6 10 3 8 7

rank ( rev ( xs )) ranking 7 3 9 10 6 2 5 8 4 1

rank ( sample ( LETTERS ))

Attention au traitement des “ex-æquo” ; la commande


rank ( c (1 ,3 ,5 ,5 ,2))

renvoit le vecteur 1 3 4.5 4.5 2, alors que


rank ( c (1 ,3 ,5 ,5 ,2) , ties.method = " first " )

retourne 1 3 4 5 2.

.
.
Valeurs manquantes
Les valeurs manquantes sont représentées par NA, quel que soit le type des
variables.
x <- 1:10
sum ( x )

Certaines fonctions exigent de préciser ce que l’on doit faire en présence de


valeurs manquantes.
x [ c (1 ,3)] <- NA # ou is.na ( x [ c (1 ,3)]) <- TRUE
sum ( x )
sum (x , na.rm = TRUE )
is.na ( x )
sum ( is.na ( x ))

D’autres non :
summary ( x )

.
.
Les matrices
Une matrice est une structure composée de vecteurs de même taille et de
même type.
x1 <- sample (1:100 , 10) x
x2 <- sample (1:100 , 10)
x <- cbind ( x1 , x2 )
x [ , " x1 " ] x1 x2

On peut créer explicitement des matrices comme suit : 53 36

x <- matrix ( sample (1:100 , 10) , ncol =2) 21 16


colnames ( x ) <- paste ( " x " , 1:2 , sep = " " ) 49 85
dim ( x )
34 81
ncol ( x ) # ou nrow ( x )
x [ ,1] # id. à x [ ," x1 "] 73 45
x [1:3 ,]
head ( x )
str ( x )

.
.
Opérations sur les matrices
L’adressage des éléments d’une matrice, ou l’assignation de valeurs, suit le
même principe que pour les vecteurs, sauf que l’on a deux indices (ligne et
colonne).
x <- matrix (1:10 , nrow =2 , byrow = TRUE )
x [1 ,2]

Lorsque l’on souhaite effectuer le même type d’opération sur les colonnes
(ou les lignes) d’une matrice, au lieu d’une boucle
for ( j in 1: ncol ( x ))
print ( mean ( x [ , j ]))

on peut utiliser la fonction apply :


apply (x , 2 , mean ) # ou colMeans ( x ) , plus efficace

L’argument ... (special variable length argument) permet de passer des ar-
guments supplémentaires lors de l’appel à une fonction, p.ex. :
apply (x , 2 , mean , na.rm = TRUE )
.
.
Les facteurs
Un facteur permet d’effectuer une partition des unités statistiques : variable
catégorielle à valeurs discrètes (niveaux, modalités, strates).
La commande
factor (x , levels = , labels = , ordered =)

convertit x en une variable R de type factor.

Comme dans le cas des matrices, il existe des fonctions spéciales qui per-
mettent d’opérer selon les niveaux d’un facteur :
y <- sample (1:100 , 20)
x <- factor ( rep ( c ( " a " ," b " ) , 10))
tapply (y , x , mean )
by (y , x , mean )

On peut tabuler un facteur, comme n’importe quelle collection d’unités dis-


crètes :
table ( x )

.
.
Accéder aux informations d’un facteur
Un facteur reste un vecteur :
x <- factor ( rep ( c ( " t1 " ," t2 " ," t3 " ) , each =10) ,
ordered = TRUE )
x [ c (1 ,3)]

avec des attributs supplémentaires qui peuvent être interrogés à l’aide de


fonctions spécifiques :
levels ( x ) # unique ( x )
nlevels ( x ) # length ( unique ( x ))
is.factor ( x )
summary ( x ) # id. à table ( x )

R ne fait pas de distinction lexicale entre niveaux (variable ordinale) et modal-


ités (variable nominale), mais l’argument ordered= permet d’imposer une
relation d’ordre sur les modalités du facteur.

.
.
Créer des facteurs
Au lieu de factor, on peut utiliser gl ou utiliser/créer un vecteur et le con-
vertir en factor.
x <- rep ( letters [1:3] , each =10)
x <- as.factor ( x )
# ou de manière équivalente
gl (3 , 10 , labels = letters [1:3])

Les commandes interaction et expand.grid sont également utiles pour


générer des combinaisons de niveaux de facteurs (“traitements”).

Attention à ne pas confondre labels= et levels= :


factor ( rep (1:2 , 2) , labels =2:1)
factor ( rep (1:2 , 2) , labels =2:1 , levels =2:1)

.
.
Modifier un facteur
On peut vouloir
▶ changer l’ordre des niveaux (p.ex., catégorie de référence pour une
régression),
▶ supprimer un niveau ou regrouper des niveaux (p.ex., équilibrer les
effectifs entre niveaux).

Exemple :
x <- gl (4 , 5 , 100)
relevel (x , ref =4)
levels ( x ) <- 4:1
levels ( x )[1:2] <- " 3 .5 "

Cela ne change en aucun cas le rang des éléments de x, seulement la modal-


ité qui leur est associée.

.
.
Les erreurs fréquentes
En interne, les facteurs sont stockés sous forme numérique mais on leur
associe des étiquettes (labels) :
as.numeric ( x )

Les “niveaux” d’un facteur sont classés par ordre lexicographique, et la con-
version d’un facteur en nombre peut être délicate parfois.
as.numeric ( f <- factor (1:2 , levels =2:1)[1])
as.numeric ( levels ( f ))[ f ]

Il paut penser à garder en correspondance les niveaux observés et observ-


ables lorsque l’on souhaite modifier un facteur :
a <- gl (4 , 5 , 100)
b <- a [ a ! = 1]
all ( levels ( a ) == levels ( b ))
d <- droplevels ( a [ a ! = 1])

Il est recommendé de toujours vérifier que R code bien les données telles
qu’on se les représente !
.
.
Structure de données avancée
Le data.frame est l’objet de base pour gérer des données de type variable
(numeric, factor, etc.). Un data.frame est une collection de vecteurs de
même taille, mais de type possiblement variable.
score <- c (1 ,5 ,3 ,1 ,5 ,2 ,2)
x1 <- c ( " M " ," M " ," F " ," F " ," F " ," F " ," M " )
x2 <- c (92 ,96 ,97 ,93 ,101 ,100 ,97) a

x3 <- c ( " C " ," A " ," C " ," C " ," C " ," B " ," B " )
a <- data.frame ( score , gender = x1 , score gender IQ SES

IQ = x2 , SES = x3 ) 1 M 92 C
dim ( a ) 5 M 96 A
summary ( a )
3 F 97 C
str ( a )
1 F 93 C
as.matrix ( a )
5 F 101 C

2 F 100 B

2 M 97 B

.
.
Adresser les éléments d’un data.frame
Même principe d’adressage que pour de simple vecteurs ou des matrices,
mais on peut accéder aux colonnes nommées avec l’opérateur $ :
a
a [ ,1:2]
a [1:3 , c (2 ,4)] score gender IQ SES

a $ score [1:3] 1 M 92 C

a $ score [ a $ gender == " M " ] 5 M 96 A

3 F 97 C
with (a , score [ gender == " M " ])
1 F 93 C
# ou de manière équivalente
5 F 101 C
subset (a , gender == " M " ) 2 F 100 B
a $ score [ a $ SES % in % c ( " A " ," C " )] 2 M 97 B

Les commandes with ou subset, comme beaucoup de commandes R, ac-


ceptent comme argument un data.frame ce qui simplifie l’accès aux vari-
ables contenues dans celui-ci. On peut également utiliser attach pour créer
une copie dans l’espace de travail, mais ce n’est pas conseillé.

.
.
Propriétés d’un data.frame
Certaines commandes R traitent les data.frame de manière spéciale. Comme
pour les matrices, on peut utiliser :
summary ( a )
str ( a )
dim ( a )
colnames ( a )

On peut ajouter des colonnes ou des lignes à un data.frame, comme dans


le cas des matrices, p.ex.
cbind (a , 1:7)

mais
rbind (a , c (3 , " M " , 100 , " C " ))

ne produira pas le résultat escompté. Pourquoi ?

.
.
Opérations sur un data.frame
À ce stade, gender n’est pas considéré comme un facteur :
is.factor ( gender )

mais il a été converti en facteur lors de la création du data.frame (cf.


getOption("stringsAsFactors")):
is.factor ( a $ gender )

On peut convertir ou recoder les variables contenues dans a en facteurs


comme suit :
within (a , SES <- factor ( SES , labels = c ( " low " ," mid " ," high " )))

Plus généralement,
within ( data , expr , ... )

permet d’opérer sur les variables d’un data.frame et de rendre ces modi-
fications permanentes, contrairement à with qui ne sert qu’à accéder aux
composantes du data.frame (principe d’accès en “lecture seule”).
.
.
Importer des données externes
blood.txt, cereal.csv
Les fonctions read.table et read.csv permettent d’importer des données
tabulées ou csv (séparateur de champs virgule ou point-virgule).
Exemple :
blood <- read.table ( " blood.txt " , header = TRUE )
cereal <- read.csv ( " cereal.csv " )

Bien vérifier le chemin d’accès au fichier (ou utiliser set.wd), la présence


d’une ligne d’en-tête (header), le type de séparateur de champs (sep), ainsi
que le codage des valeurs manquantes (na.strings).

Un data.frame est créé automatiquement lorsque l’on importe des don-


nées externes, p.ex. un fichier csv.

.
.
Ce qu’il faut retenir

▶ L’élément de base est le vecteur. Un vecteur a une taille définie et est


constitué d’éléments du même type (nombre, caractères, etc.).
▶ Des structures plus complexes, comme les matrix ou les
data.frame, sont constituées de vecteurs.
▶ On peut effectuer des opérations élémentaires d’indexation et de
sélection sur ce type de structures de données.
▶ Les facteurs jouent un rôle particuliers en statistiques, et ils sont
représentées sous forme d’une association nombre/étiquette sous R.
▶ L’importation de données externes, souvent sous forme de fichiers
plats, résulte en un data.frame.

.
.
Index

all, 11, 22 for, 17 na.strings, 27 sample, 10, 14, 16, 18


apply, 17 getOption, 26 names, 9, 11 sd, 12
as.factor, 20 gl, 20–22 ncol, 16, 17 sep, 16, 27
as.matrix, 23 head, 16 nlevels, 19 seq, 13
as.numeric, 22 header, 27 nrow, 17 set.wd, 27
attach, 24 help, 6 numeric, 8, 23 sort, 14
by, 13, 18 help.search, 6 order, 14 str, 12, 16, 23, 25
byrow, 17 in, 17, 24 ordered, 18, 19 subset, 24
c, 8–15, 18, 19, 23–26 interaction, 20 package, 6 sum, 15
cbind, 12, 16, 25 is.factor, 19, 26 paste, 16 summary, 4, 15, 19, 23,
character, 8 is.na, 15 print, 17 25
class, 12 labels, 18, 20, 22, 26 rank, 14 t, 12
colnames, 16, 25 length, 10–13 rbind, 12, 25 table, 18
data.frame, 3, 23–28 LETTERS, 14 read.csv, 27 tapply, 18
decreasing, 14 letters, 11, 20 read.table, 27 ties.method, 14
dim, 16, 23, 25 levels, 18–22 relevel, 21 unique, 12
droplevels, 22 lm, 4 rep, 13, 18–20 which, 10
each, 13, 19, 20 logical, 8 replace, 10 with, 24, 26
expand.grid, 20 matrix, 16, 17, 28 rev, 14 within, 26
factor, 18–20, 22, 23, mean, 12, 17, 18 rnorm, 4, 8, 12
26 na.rm, 15, 17 runif, 4

.
.
Bibliographie
Becker, R. A., & Chambers, J. M. (1981). S: A Language and System for Data Analysis.
Becker, R. A., & Chambers, J. M. (1984). S: An Interactive Environment for Data Analysis
and Graphics. Wadsworth.
Burns, P. (2011, April). The R Inferno. Retrieved from http://www.burns-stat.com
Dalgaard, P. D. (2006). Introductory Statistics with R. Springer.
Falissard, B. (2005). Comprendre et utiliser les statistiques dans les sciences de la vie.
Masson.
Ihaka, R., & Gentleman, R. (1996). R: A language for data analysis and graphics.
Journal of Computational and Graphical Statistics, 5, 299–314.
Logan, M. (2010). Biostatistical Design and Analysis using R. Wiley.
Paradis, E. (2005, Septembre). R pour les débutants. Retrieved from http://cran.r-
project.org
Venables, W. N., & Ripley, B. D. (2002). Modern Applied Statistics with S. Springer.

You might also like