Vous êtes sur la page 1sur 10

Gestion des donnes avec R

Christophe Lalanne & Bruno Falissard

Table des matires


1

Introduction

Importation de chiers CSV

2.1

Structure du chier de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.2

Le concept data frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

2.3

Indexation dlments dans un data frame . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

Autres sources de donnes

3.1

Fichier binaire RData . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.2

Fichier SPSS et Stata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

3.3

Base de donnes relationnelles et autres formats . . . . . . . . . . . . . . . . . . . . . . . . . .

Techniques plus avances

Introduction

La gestion des donnes sous R nest pas aussi vidente quil ny parat au premier abord. Cest essentiellement d au
fait que lon ne voit pas les donnes comme sur un tableur de type Excel. Toutefois, R ore des outils puissants de
recodage des variables et de reformatage des tableaux de donnes, et permet de lire quasiment tous les formats de
chiers de donnes utiliss dans le domaine statistique.

2
2.1

Importation de chiers CSV


Structure du chier de donnes

Considrons le chier de donnes smp2.csv qui regroupe les donnes sur ltude de sant mentale en prison. Ce
chier comporte 26 variables et 799 observations (individus ou units statistiques). Il sagit dun chier de type CSV
(comma separated values) que lon peut ouvrir avec un tableur de type Excel ou nimporte quel diteur de texte.
Souvent dailleurs, lorsque lon double-clique sur un chier portant cette extension (.csv), cest lapplication Excel
(ou Open Oce, par exemple) qui est propose pour lire ce chier. Voici quoi ressemble ce chier en mode texte :
Ce chier est structur de la manire suivante : sur la premire ligne gure le nom des variables. Les donnes de
chaque individu pour chacune de ces variables sont reportes sur une ligne spare. Les donnes (nom de variable
sur la premire ligne, ou valeur prise par une variable pour un individu sur les lignes suivantes), appel champ,
sont spares par un mme symbole, appel sparateur de champ, ici un point-virgule. Dautres sparateurs de
champ peuvent tre utiliss, par exemple des virgules, des taquets de tabulation ou de simples espaces.
1

FIGURE 1 Contenu du chier smp2.csv en vue texte

Le sparateur dcimal quant lui permet dindiquer R comment sont reprsents les nombres virgules. Par
dfaut, R utilise la notation anglo-saxonne (le sparateur dcimal est alors un point, par exemple 9.2), sauf dans
le cas de la commande read.csv2() o lon considre que le sparateur dcimal suit la notation franaise (une
virgule, comme dans 9,2). videmment, il y a des situations impossibles : utiliser comme sparateur de champs des
virgules imposera le point comme sparateur dcimal, autrement R na aucun moyen didentier correctement le
nombre de champs prsents sur chaque ligne du chier.
Si aucune ligne den-tte nest prsente, il faudra prciser loption header = FALSE, et ventuellement fournir
le nom des variables sous forme de liste via loption col.names =. Cela dit il est tout aussi simple dutiliser la
commande colnames() aprs avoir import le chier.
Pour importer des chiers CSV sous R, on utilise la commande read.csv() ou read.csv2(), qui reposent
en fait sur la commande read.table(), mais avec des options par dfaut : sep = ;/dec = , dans le cas de
read.csv2(), et sep = ,/dec = . dans le cas de read.csv(). Dans tous les cas, on suppose que header
= TRUE, cest--dire que le chier comporte bien une ligne den-tte.
Avant dimporter un chier, il faut sassurer que R connat lendroit o ce chier a t enregistr. Pour cela, deux
solutions : soit lon indique le chemin daccs complet au chier, soit on change le rpertoire de travail courant pour
indiquer le rpertoire dans lequel le chier a t enregistr. Dans le premier cas, on aura donc une instruction du
style :

smp <- read.csv2("/Users/chl/mooc/smp2.csv")


qui signie que sur un Mac, le chier smp2.csv se trouve dans le sous-rpertoire mooc du rpertoire Documents
du compte utilisateur. Sous Windows, on utilisera par exemple C:/utilisateur/chl/mooc/smp2.csv. Dans
le second cas, on utilisera soit la commande setwd() pour dnir le rpertoire de travail, soit le menu disponible
dans le gestionnaire de chiers de RStudio, comme lillustre la gure suivante.

FIGURE 2 Dnir le rpertoire courant comme rpertoire de travail


En supposant que le rpertoire de travail ait correctement t indiqu, voici comment lon peut charger les donnes
smp2.csv :

smp <- read.csv2("smp2.csv")


Concernant la structure du chier de donnes une fois quil a t import, il est conseill de taper systmatiquement
ces 3 commandes qui permettent de vrier la taille du tableau de donnes (nombre de lignes et nombre de colonnes,
correspondant, respectivement, au nombre dindividus et de variables), le nom des variables (ce qui permet, entre
autres, de sassurer que la ligne den-tte a bien t lue correctement), et le type de reprsentation des variables
(int ou double pour les variables numriques, char ou factor pour les variables qualitatives). Voici ce que
donnent ces commandes pour le chier smp2.csv.
3

dim(smp)
## [1] 799

26

names(smp)
##
##
##
##
##
##
##

[1]
[5]
[9]
[13]
[17]
[21]
[25]

"age"
"n.enfant"
"juge.enfant"
"dep.cons"
"subst.cons"
"ed"
"suicide.past"

"prof"
"n.fratrie"
"place"
"ago.cons"
"scz.cons"
"dr"
"dur.interv"

"duree"
"ecole"
"abus"
"ptsd.cons"
"char"
"suicide.s"

"discip"
"separation"
"grav.cons"
"alc.cons"
"rs"
"suicide.hr"

str(smp)
## 'data.frame':
## $ age
:
## $ prof
:
## $ duree
:
## $ discip
:
## $ n.enfant
:
## $ n.fratrie
:
## $ ecole
:
## $ separation :
## $ juge.enfant :
## $ place
:
## $ abus
:
## $ grav.cons
:
## $ dep.cons
:
## $ ago.cons
:
## $ ptsd.cons
:
## $ alc.cons
:
## $ subst.cons :
## $ scz.cons
:
## $ char
:
## $ rs
:
## $ ed
:
## $ dr
:
## $ suicide.s
:
## $ suicide.hr :
## $ suicide.past:
## $ dur.interv :

799 obs. of 26 variables:


int 31 49 50 47 23 34 24 52 42 45 ...
Factor w/ 8 levels "agriculteur",..: 3 NA 7 6 8 6 3 2 6 6 ...
int 4 NA 5 NA 4 NA NA 5 4 NA ...
int 0 0 0 0 1 0 0 0 1 0 ...
int 2 7 2 0 1 3 5 2 1 2 ...
int 4 3 2 6 6 2 3 9 12 5 ...
int 1 2 2 1 1 2 1 2 1 2 ...
int 0 1 0 1 1 0 1 0 1 0 ...
int 0 0 0 0 NA 0 1 0 1 0 ...
int 0 0 0 1 1 0 1 0 0 0 ...
int 0 0 0 0 0 0 0 0 1 1 ...
int 1 2 2 1 2 1 5 1 5 5 ...
int 0 0 0 0 1 0 1 0 1 0 ...
int 1 0 0 0 0 0 0 0 0 0 ...
int 0 0 0 0 0 0 0 0 0 0 ...
int 0 0 0 0 0 0 0 0 1 1 ...
int 0 0 0 0 0 0 1 0 1 0 ...
int 0 0 0 0 0 0 0 0 0 0 ...
int 1 1 1 1 1 1 1 1 4 1 ...
int 2 2 2 2 2 1 3 2 3 2 ...
int 1 2 3 2 2 2 3 2 3 2 ...
int 1 1 2 2 2 1 2 2 1 2 ...
int 0 0 0 1 0 0 3 0 4 0 ...
int 0 0 0 0 0 0 1 0 1 0 ...
int 0 0 0 0 1 0 1 0 1 0 ...
int NA 70 NA 105 NA NA 105 84 78 60 ...

XLS ou CSV. Il est galement possible de lire directement des chiers Excel, voire une sous-partie dune
feuille de calcul (par exemple, une zone de plage A2:C5, soit 12 cellules au total), laide de packages

spcialiss. Cela dit, comme il est tout aussi simple dexporter les donnes au format CSV depuis Excel,
et que ce type de format de donnes pose moins de problme de compatibilit de version entre les
logiciels et les systmes dexploitation, on prfrera gnralement le format CSV.

2.2

Le concept data frame

Une fois import dans R, le chier de donnes devient un tableau rectangulaire appel data frame dans le jargon
technique R. Ici, notre tableau de donnes est accessible via le data frame smp, qui est le nom de variable laquelle
nous avons associ les donnes lors de la lecture avec read.csv2().

class(smp)
## [1] "data.frame"
Il sagit en fait dune structure de donnes deux dimensions (lignes = observations, colonnes = variables) contenant
des donnes potentiellement de type mixte (nombres et chanes de caractres). Une colonne comprendra ainsi
toujours des objets du mme type (par exemple des nombres pour dnoter les valeurs prises par une variable
numrique), mais les direntes colonnes pourront contenir des objets de type dirents (des nombres dans lune,
des caractres dans lautre). Qui plus est, chaque ligne est identie par un identicateur unique, appel rowname.

rownames(smp)[1:10]
##

[1] "1"

"2"

"3"

"4"

"5"

"6"

"7"

"8"

"9"

"10"

Il est important de sassurer que les donnes sont bien reprsentes comme on le souhaite, en particulier que
les variables qualitatives avec un dtermin de modalits (ou niveaux) sont bien traites comme telle par R. En
loccurence, leur type doit tre factor. Cest le cas de la variable prof dans le data frame smp.

summary(smp)
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##

age
Min.
:19.0
1st Qu.:28.0
Median :37.0
Mean
:38.9
3rd Qu.:48.0
Max.
:83.0
NA's
:2
n.enfant
Min.
: 0.00
1st Qu.: 0.00
Median : 1.00
Mean
: 1.75
3rd Qu.: 3.00
Max.
:13.00

prof
duree
discip
ouvrier
:227
Min.
:1.0
Min.
:0.000
sans emploi
:222
1st Qu.:4.0
1st Qu.:0.000
employe
:135
Median :5.0
Median :0.000
artisan
: 90
Mean
:4.3
Mean
:0.232
prof.intermediaire: 58
3rd Qu.:5.0
3rd Qu.:0.000
(Other)
: 61
Max.
:5.0
Max.
:1.000
NA's
: 6
NA's
:223
NA's
:6
n.fratrie
ecole
separation
Min.
: 0.00
Min.
:1.00
Min.
:0.000
1st Qu.: 2.00
1st Qu.:1.00
1st Qu.:0.000
Median : 3.00
Median :2.00
Median :0.000
Mean
: 4.29
Mean
:1.87
Mean
:0.423
3rd Qu.: 6.00
3rd Qu.:2.00
3rd Qu.:1.000
Max.
:21.00
Max.
:5.00
Max.
:1.000
5

##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##
##

NA's
:26
juge.enfant
Min.
:0.000
1st Qu.:0.000
Median :0.000
Mean
:0.277
3rd Qu.:1.000
Max.
:1.000
NA's
:5
dep.cons
Min.
:0.000
1st Qu.:0.000
Median :0.000
Mean
:0.397
3rd Qu.:1.000
Max.
:1.000

place
Min.
:0.000
1st Qu.:0.000
Median :0.000
Mean
:0.229
3rd Qu.:0.000
Max.
:1.000
NA's
:7
ago.cons
Min.
:0.000
1st Qu.:0.000
Median :0.000
Mean
:0.167
3rd Qu.:0.000
Max.
:1.000

subst.cons
Min.
:0.000
1st Qu.:0.000
Median :0.000
Mean
:0.265
3rd Qu.:1.000
Max.
:1.000

scz.cons
Min.
:0.0000
1st Qu.:0.0000
Median :0.0000
Mean
:0.0826
3rd Qu.:0.0000
Max.
:1.0000

ed
Min.
:1.00
1st Qu.:1.00
Median :2.00
Mean
:1.87
3rd Qu.:3.00
Max.
:3.00
NA's
:107
suicide.past
Min.
:0.000
1st Qu.:0.000
Median :0.000
Mean
:0.284
3rd Qu.:1.000
Max.
:1.000
NA's
:14

dr
Min.
:1.00
1st Qu.:1.00
Median :2.00
Mean
:2.15
3rd Qu.:3.00
Max.
:3.00
NA's
:111
dur.interv
Min.
: 0.0
1st Qu.: 48.0
Median : 60.0
Mean
: 61.9
3rd Qu.: 75.0
Max.
:120.0
NA's
:50

NA's

:5
abus
Min.
:0.000
1st Qu.:0.000
Median :0.000
Mean
:0.278
3rd Qu.:1.000
Max.
:1.000
NA's
:7
ptsd.cons
Min.
:0.000
1st Qu.:0.000
Median :0.000
Mean
:0.216
3rd Qu.:0.000
Max.
:1.000

NA's
:11
grav.cons
Min.
:1.00
1st Qu.:2.00
Median :4.00
Mean
:3.64
3rd Qu.:5.00
Max.
:7.00
NA's
:4
alc.cons
Min.
:0.000
1st Qu.:0.000
Median :0.000
Mean
:0.186
3rd Qu.:0.000
Max.
:1.000

char
rs
Min.
:1.00
Min.
:1.00
1st Qu.:1.00
1st Qu.:1.00
Median :1.00
Median :2.00
Mean
:1.51
Mean
:2.06
3rd Qu.:2.00
3rd Qu.:3.00
Max.
:4.00
Max.
:3.00
NA's
:96
NA's
:103
suicide.s
suicide.hr
Min.
:0.00
Min.
:0.0
1st Qu.:0.00
1st Qu.:0.0
Median :0.00
Median :0.0
Mean
:0.79
Mean
:0.2
3rd Qu.:1.00
3rd Qu.:0.0
Max.
:5.00
Max.
:1.0
NA's
:41
NA's
:39

Par contre, la variable abus est une variable binaire, qui prend les valeurs 0 et 1, et on pourrait dans certains cas
vouloir la traiter comme un facteur en associant les modalits 0 et 1 aux tiquettes Non et Oui an de faciliter
la lecture des tableaux et des graphiques. Ceci peut se raliser laide de la commande factor(), comme dans
lexemple ci-dessous.

smp$abus <- factor(smp$abus, levels = c(0,1), labels = c("Non", "Oui"))


Autre approche pour la gestion des data frame. Les packages data.table et dplyr orent des commandes
spciques pour lire des chiers de donnes de type CSV et les reprsenter dans des structures
identiques aux data frame standard de R, mais en apportant des petites amliorations pour leur
manipulation.

2.3

Indexation dlments dans un data frame

On peut dsigner nimporte quel objet dans un data frame par sa position en termes de n de ligne et de n de
colonne. Par exemple, la profession (colonne n2) du 3me individu (ligne n3) sobtiendra ainsi :

smp[3,2]
## [1] prof.intermediaire
## 8 Levels: agriculteur artisan autre cadre employe ... sans emploi
Il est galement possible dutiliser le nom des variables, la place de leur numro, par exemple smp[3,"prof"],
voire mme le rowname de lunit statistique dintrt, soit ici smp["3","prof"] puisque les rowname sont
simplement constitus des numros de rang des observations dans le data frame.
En dautres termes, un data frame nest rien dautre quune structure tabulaire contenant des variables arranges
en colonnes qui portent des noms (names(), ou plus gnralement colnames()) et des observations en lignes,
elles-mme nommes (rownames()). Considrons lillustration ci-dessous ( gauche) :

FIGURE 3 Reprsentation schmatique dun data frame


La variable a est le nom dun data frame contenant 4 variables : score (un score numrique sur une chelle allant de
1 5), gender (le sexe de lindividu, o M = homme et F = femme), IQ (le quotient intellectuel de lindividuel) et SES
(le statut socio-conomique de lindividu, cod en trois classes, A, B et C). le premier individu est donc un homme (M)
de QI global 92 (IQ), dont la classe socio-conomique (SES) est C et ayant un score de 1 point. Comme illustr dans
la gure de droite, cette organisation par ligne/colonne permet dassocier chaque individu lensemble des valeurs
observes pour cet individu sur chaque variable. Qui plus est, il est possible de retourner les valeurs prises par une
variable selon les valeurs observes sur une ou plusieurs autres variables. Par exemple, il est trs simple de retourner
une liste des scores de tous les individus dont le sexe vaut M en tapant simplement une instruction du type

a[a$gender == "M", "score"]


Lexpression a$gender == "M" correspond un test logique, et le rsultat renvoy, pour chaque lment test,
prend la valeur TRUE (vrai) ou FALSE (faux) selon que la condition est vrie ou non. Cela permet de retenir dans
le data frame a que les lignes pour lesquelles la variable gender prend la valeur M. Ensuite, on ltre les colonnes de
a en indiquant "score" comme nom de variable.
En fait, au lieu dutiliser des numros dobservation comme dans lexemple prcdent avec le data frame smp, on
adresse ici des individus ou des lignes selon les valeurs observes pour certaines variables par ces mmes individus.
Ce principe gnral dindexation est schmatis ci-dessous :

FIGURE 4 Principe de la slection indexe dobservations


Supposons donc que nous ayons une liste de trois numros (1, 3, 4), stocks dans une variable appele idx. Il peut
sagir, par exemple, de trois individus dont on connat le numro de position dans le tableau de donnes et pour
lesquels on aimerait vrier les donnes enregistres. Les donnes qui nous intressent sont celles de la variable x,
qui contient 5 lments (numrots de 1 5, mais galement nommes a, b, , e, comme dans le cas des rowname
dun data frame). Alors, il est possible dobtenir directement la 1re, la 3me et la 4me valeur de x en utilisant lune
des notations suivantes : x[c(1,3,4)], x[idx], ou enn x[g]. Dans cette dernire construction, on utilise une
variable auxiliaire g ne contenant que des valeurs boolennes (T pour vrai et F pour faux) ; en dautres termes, on ne
demande renvoyer les valeurs de x que lorsque g vaut TRUE (abbrg T). Une formulation quivalente serait :
x[which(g == "T")]. Voir laide en ligne de la commande which() pour dcortiquer le rsultat produit par
cette commande.

Autres sources de donnes

3.1

Fichier binaire RData

Les chiers R portent lextension .RData ou .rda et peuvent tre lus avec la commande load(). Ils sont gnralement utiles pour sauvegarder des chiers de donnes dans un format compress (prenant moins de place sur le
disque), et plus rapides charger. On peut galement utiliser ce format pour enregistrer nimporte quel objet R (une
variable ou un tableau par exemple), voire plusieurs variables en mme temps. Lorsque la commande load() a t
excute, le nom de la ou des variables sauvegardes dans le chier apparaissent dans lespace de travail, ce que
lon peut vrier en tapant :

ls()
Cest le format utilis par R pour sauvegard lespace de travail lorsque lon ferme une sessions R. Dans ce cas, R
enregistre toutes les variables contenues dans lespace de travail dans un chier nomm .RData (cest donc un
8

chier masqu dans la plupart des explorateurs de chiers). Lorsque lon dmarre R dans un certain rpertoire de
travail, si un tel chier sy trouve prsent, il est automatiquement charg par R.
En fait, plutt que de laisser R enregistrer lespace de travail la n de la session, on peut utiliser la commande
save.image() pour sauvegarder lespace de travail dans un chier spcique.
Historique des commandes. Il est galement possible de sauvegarder lintgralit des commandes
tapes durant une session laide de la commande savehistory().

3.2

Fichier SPSS et Stata

Le package foreign dispose de deux commandes permettant de charger des chiers enregistrs au format SPSS
(chier .sav) ou Stata (chier .dta) : read.spss() et read.dta(). Il est ncessaire de charger le package en
tapant

library(foreign)
avant de pouvoir utiliser ces commandes. Dans le cas de SPSS, il est ncessaire de rajouter loption to.data.frame
= TRUE an dobtenir un data frame et non pas simplement une liste de variables.

3.3

Base de donnes relationnelles et autres formats

Certains packages permettent de se connecter directement sur des bases de donnes de type MySQL ou PostgreSQL
(voire mme MongoDB, Redis, ou sqlite). Dans ce cas, le mode dinteraction avec les donnes est lgrement dirent
car on utilise alors le langage de requte propre au langage, moins dutiliser des packages qui permettent dassurer
la conversion partir des commandes R habituelles telles que subset().
Il existe galement des packages spcialiss dans le chargement et le traitement des chiers de type XML, JSON,
HDF5, etc. Gnralement il sut de chercher sur le site CRAN ou sur http://www.rseek.org.

Techniques plus avances

Il existe bien dautres mthodes pour interagir avec des tableaux de donnes sous R. Citons en particulier trois
situations assez frquentes :
combiner ensemble direntes sources de donnes : pour associer deux tableaux de donnes disposant
dun identicateur commun (par exemple, une colonne avec des identiants uniques pour les individus, le
nom de variable dans chacun des tableaux ntant pas ncessairement le mme), on utilisera la commande
merge() qui permet de fusionner deux data frame A et B en un seul et mme data frame. Selon les options
choisies, all.x = TRUE, all.y = TRUE ou all = TRUE, on conservera toutes les lignes du tableau A
et les colonnes de B seront ajoutes A mme si certaines observations ne sont pas prsentes dans B, ou
cest le tableau B qui servira de base de fusion, ou enn toutes les observations de A et de B seront associes,
mme si elles ne sont pas en compltes correspondance entre les deux tableaux.
aggrger des donnes : partir de donnes individuelles, pour construire des donnes de synthse
(par exemple des moyennes pour chaque groupe) il est possible dutiliser la commande tapply() ou
aggregate(). Cette dernire prsente lavantage de retourner ses rsultats sous forme de data frame,
quil est possible dexploiter ensuite pour continuer les analyses statistiques ou faire des reprsentations
9

graphiques. Le package plyr ou sa version plus rcente, dplyr, fournit des options nettement plus amliores
pour ce type doprations.
transformer des donnes : dans ce qui a t prsent sur les data frame, on considre explicitement que
les valeurs prises par une variables sont regroupes dans une mme colonne, et que donc chaque colonne
reprsente des variables bien distinctes. Il arrive parfois que lon stocke dans chaque colonne dun tableau
les valeurs observes pour chaque modalit ou niveau pris par une variable qualitative (lexemple typique est
une srie de mesures rptes chez les mmes individus trois priodes direntes, et pour lequel on se
retrouve avec un tableau 4 colonnes, ou en plus dune colonne didentiant unique pour les individus, on
dispose de 3 colonnes regroupant les mesures collectes chez chaque individu pour une mme priode). Dans
ce cas, le package reshape2 permet de transformer ce type de tableau, dit en format wide, en un data
frame au format long comprenant trois colonnes : une colonne id dsignant les identiants individus, une
colonne variable contenant les niveaux de la variable manipule (par exemple, priode1, priode2 et
priode3) et une colonne value contenant les mesures associes chaque individu pour chacune des
trois priodes.
Pour plus dinformations, il peut tre utile de consulter lune des rfrences suivantes :
1. Spector, P (2008). Data Manipulation with R. Springer
2. R Cookbook / Manipulating Data
3. Muenchen, B. R for SAS and SPSS Users

10