0% ont trouvé ce document utile (0 vote)
4K vues1 397 pages

Analyse R (Complet)

Transféré par

Yaye Ndew Thiao
Copyright
© © All Rights Reserved
Nous prenons trĂšs au sĂ©rieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
4K vues1 397 pages

Analyse R (Complet)

Transféré par

Yaye Ndew Thiao
Copyright
© © All Rights Reserved
Nous prenons trĂšs au sĂ©rieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd

analyse-R

Introduction
Ă  l’analyse d’enquĂȘtes
avec R et RStudio
DerniĂšre mise Ă  jour : 24 fvrier 2023

DOI 10.5281/zenodo.6398333

Contributeurs
Par ordre alphabétique :

Julien Barnier, Julien Biaudet, François Briatte, Milan Bouchet-Valat, Ewen Gallic, Frédérique Giraud, Joël
Gombin, Mayeul Kauffmann, Christophe Lalanne, Joseph Larmarange, Nicolas Robette.

Création et Maintenance :

Joseph Larmarange — [Link]


analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

GUIDE-R

Pour une version actualisĂ©e et restructurĂ©e de nombreux chapitres d’analyse-R, on pourra se rĂ©fĂ©rer Ă 
guide-R : Guide pour l’analyse de donnĂ©es d’enquĂȘte avec R : [Link]

– 2 –
analyse-R

Présentation
L’objectif premier d’analyse-R est de prĂ©senter comment rĂ©aliser des analyses statistiques et diverses
opérations courantes (comme la manipulation de données ou la production de graphiques) avec R. Il
ne s’agit pas d’un cours de statistiques : les diffĂ©rents chapitres prĂ©supposent donc que vous avez dĂ©jĂ 
une connaissance des différentes techniques présentées. Si vous souhaitez des précisions théoriques /
mĂ©thodologiques Ă  propos d’un certain type d’analyses, nous vous conseillons d’utiliser votre moteur de
recherche préféré. En effet, on trouve sur internet de trÚs nombreux supports de cours (sans compter les
nombreux ouvrages spécialisés disponibles en librairie).

– 3 –
analyse-R

Table des matiĂšres


Si vous débutez avec R et RStudio, nous vous conseillons de parcourir en premier lieu les chapitres
suivants :

1. Manipuler > Prise en main


2. Analyser > Statistiques introductives
3. Manipuler > Manipulations de données
4. Analyser > Statistiques intermédiares

puis de compléter votre lecture en fonction de vos besoins.

Manipuler
Prise en main

Présentation et Philosophie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Installation de R et RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Premier contact . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Premier travail avec des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Extensions (installation, mise Ă  jour) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Introduction au tidyverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Vecteurs, indexation et assignation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
Listes et Tableaux de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
Facteurs et vecteurs labellisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
Organiser ses fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Import de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
OĂč trouver de l’aide ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

Manipulation de données

Visualiser ses données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179


Recodage de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Manipuler les données avec dplyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Manipulations avancées avec [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Tris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265

– 5 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Sous-ensembles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Fusion de tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Gestion des dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Fonctions Ă  fenĂȘtre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Manipuler du texte avec stringr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Réorganiser ses données avec tidyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309

Exporter

Export de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327


Export de graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331

Analyser
Statistiques introductives

Statistique univariée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339


Statistique bivariée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Introduction Ă  ggplot2, la grammaire des graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 401
Graphiques univariés et bivariés avec ggplot2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Données pondérées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473

Statistiques intermédiaires

Intervalles de confiance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485


Comparaisons (moyennes et proportions) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493
DĂ©finir un plan d’échantillonnage complexe avec survey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
Régression linéaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
Régression logistique binaire, multinomiale et ordinale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
Analyse des correspondances multiples (ACM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 607
Classification ascendante hiérarchique (CAH) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 651

Statistiques avancées

Tableaux statistiques avancés avec gtsummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685


Effets d’interaction dans un modùle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781

– 6 –
analyse-R

Multicolinéarité dans la régression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 809


Quel type de modĂšles choisir ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 815
Analyse de survie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 819
Analyse de séquences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 845
Trajectoires de soins : un exemple de données longitudinales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 873
Analyse de réseaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 949
Analyse spatiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 951
Analyse textuelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 953

Approfondir
Graphiques

ggplot2 et la grammaire des graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 955


Étendre ggplot2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 959
Combiner plusieurs graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1009
Exemples de graphiques avancés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1023
Graphiques interactifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1087
lattice : graphiques et formules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1091
Cartes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1107
Autres extensions graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1109

Programmation

Conditions et comparaisons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1137


Formules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1141
Structures conditionnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1157
Vectorisation (dont purrr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1165
Expressions réguliÚres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1187
R Markdown : les rapports automatisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1189

Divers

Mettre en forme des nombres avec scales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1231


Couleurs et Palettes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1241

– 7 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Annotations mathématiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1321


Calculer un Ăąge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1327
Diagramme de Lexis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1335

Index
Index des concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1337
Index des fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1355
Index des extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1385

Licence
Le contenu de ce site est diffusĂ© sous licence Creative Commons Attribution - Pas d’utilisation commerciale -
Partage dans les mĂȘmes conditions ([Link]

CC by-nc-sa

Cela signifie donc que vous ĂȘtes libre de recopier / modifier / redistribuer les contenus d’analyse-R, Ă 
condition que vous citiez la source et que vos modifications soient elle-mĂȘmes distribuĂ©es sous la mĂȘme
licence (autorisant ainsi d’autres Ă  pouvoir rĂ©utiliser Ă  leur tour vos ajouts).

Contribuer
analyse-R est développé avec RStudio et le code source est librement disponible sur GitHub :
[Link]

Ce projet se veut collaboratif. N’hĂ©sitez donc pas Ă  proposer des corrections ou ajouts, voire mĂȘme Ă 
rédiger des chapitres additionnels.

– 8 –
Présentation et Philosophie
Présentation de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Philosophie de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
Présentation de RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

WEBIN-R

Ce chapitre est évoqué dans le webin-R #01 (premier contact avec R & RStudio) sur YouTube.

Présentation de R
R est un langage orientĂ© vers le traitement de donnĂ©es et l’analyse statistique dĂ©rivĂ© du langage S. Il est
dĂ©veloppĂ© depuis une vingtaine d’annĂ©es par un groupe de volontaires de diffĂ©rents pays. C’est un logiciel
libre1, publié sous licence GNU GPL.

L’utilisation de R prĂ©sente plusieurs avantages :

‱ c’est un logiciel multiplateforme, qui fonctionne aussi bien sur des sytùmes Linux, Mac OS X ou
Windows ;
‱ c’est un logiciel libre, dĂ©veloppĂ© par ses utilisateurs et modifiable par tout un chacun ;
‱ c’est un logiciel gratuit ;
‱ c’est un logiciel trĂšs puissant, dont les fonctionnalitĂ©s de base peuvent ĂȘtre Ă©tendues Ă  l’aide de
plusieurs milliers d’extensions ;
‱ c’est un logiciel dont le dĂ©veloppement est trĂšs actif et dont la communautĂ© d’utilisateurs ne
cesse de s’élargir ;
‱ les possibilitĂ©s de manipulation de donnĂ©es sous R sont en gĂ©nĂ©ral largement supĂ©rieures Ă 
celles des autres logiciels usuels d’analyse statistique ;
‱ c’est un logiciel avec d’excellentes capacitĂ©s graphiques et de nombreuses possibilitĂ©s d’export ;
‱ avec Rmarkdown2, il est devenu trĂšs aisĂ© de produire des rapports automatisĂ©s dans divers

1. Pour plus d’informations sur ce qu’est un logiciel libre, voir : [Link]

– 9 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

format (Word, PDF, HTML, 
) ;


‱ R est de plus utilisĂ© dans tous les secteurs scientifiques, y compris dans le domaine des analyses
d’enquĂȘtes et, plus gĂ©nĂ©ralement, des sciences sociales.

Comme rien n’est parfait, on peut Ă©galement trouver quelques inconvĂ©nients :

‱ le logiciel, la documentation de rĂ©fĂ©rence et les principales ressources sont en anglais. Il est


toutefois parfaitement possible d’utiliser R sans spĂ©cialement maĂźtriser cette langue ;
‱ il n’existe pas encore d’interface graphique pour R Ă©quivalente Ă  celle d’autres logiciels comme
SPSS ou Modalisa. R fonctionne Ă  l’aide de scripts (des petits programmes) Ă©ditĂ©s et exĂ©cutĂ©s
au fur et à mesure de l’analyse et se rapprocherait davantage de SAS dans son utilisation (mais
avec une syntaxe et une philosophie trÚs différentes). Ce point, qui peut apparaßtre comme un
gros handicap, s’avĂšre aprĂšs un temps d’apprentissage ĂȘtre un mode d’utilisation d’une grande
souplesse ;
‱ comme R s’apparente davantage à un langage de programmation qu’à un logiciel proprement
dit, la courbe d’apprentissage peut ĂȘtre un peu « raide », notamment pour ceux n’ayant jamais
programmé auparavant.

Il est à noter que le développement autour de R a été particuliÚrement actif ces derniÚres années. On
trouvera dĂšs lors aujourd’hui de nombreuses extensions permettant de se « faciliter la vie » au quotidien,
ce qui n’était pas vraiment encore le cas il y a 5 ans.

Philosophie de R
Quelques points particuliers dans le fonctionnement de R peuvent parfois dérouter les utilisateurs
habituĂ©s Ă  d’autres logiciels :

‱ Sous R, en gĂ©nĂ©ral, on ne voit pas directement les donnĂ©es sur lesquelles on travaille ; on ne
dispose pas en permanence d’une vue des donnĂ©es sous forme de tableau3, comme sous
Modalisa ou SPSS. Ceci peut ĂȘtre dĂ©routant au dĂ©but, mais on se rend vite compte qu’on n’a pas
besoin de voir en permanence les données pour les analyser.
‱ Alors qu’avec la plupart des logiciels on rĂ©flĂ©chira avec un fichier de donnĂ©es ouvert Ă  la fois, sous
R chaque fichier de données correspondra à un objet différent chargé en mémoire, permettant
de manipuler trĂšs facilement plusieurs objets Ă  la fois (par exemple dans le cadre de fusion de
tables4).
‱ Avec les autres logiciels, en gĂ©nĂ©ral la production d’une analyse gĂ©nĂšre un grand nombre de
rĂ©sultats de toutes sortes dans lesquels l’utilisateur est censĂ© retrouver et isoler ceux qui
l’intĂ©ressent. Avec R, c’est l’inverse : par dĂ©faut l’affichage est rĂ©duit au minimum et c’est
l’utilisateur qui demande Ă  voir des rĂ©sultats supplĂ©mentaires ou plus dĂ©taillĂ©s.

2. Voir [Link]

3. On verra qu’il est possible avec RStudio de disposer d’une telle vue.

4. Voir par exemple la section dédiée à ce sujet dans le chapitre sur la manipulation de données.

– 10 –
Présentation et Philosophie

‱ Sous R, les rĂ©sultats des analyses sont eux aussi stockĂ©s dans des objets et sont dĂšs lors
manipulables.

Inhabituel au début, ce fonctionnement permet en fait assez rapidement de gagner du temps dans la
conduite des analyses.

Présentation de RStudio
L’interface de base de R est assez rudimentaire (voir figure ci-aprùs).

Interface de R sous Windows

Figure 1. Interface de R sous Windows

RStudio est un environnement de développement intégré libre, gratuit, et qui fonctionne sous Windows,
Mac OS X et Linux. Il complÚte R et fournit un éditeur de script avec coloration syntaxique, des
fonctionnalitĂ©s pratiques d’édition et d’exĂ©cution du code (comme l’autocomplĂ©tion), un affichage
simultanĂ© du code, de la console R, des fichiers, graphiques et pages d’aide, une gestion des extensions,
une intégration avec des systÚmes de contrÎle de versions comme git, etc. Il intÚgre de base divers outils
comme par exemple la production de rapports au format Rmarkdown. Il est en développement actif et
de nouvelles fonctionnalitĂ©s sont ajoutĂ©es rĂ©guliĂšrement. Son principal dĂ©faut est d’avoir une interface
uniquement anglophone.

– 11 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Interface de RStudio sous Windows

Figure 2. Interface de RStudio sous Windows

Pour une présentation plus générale de RStudio on pourra se référer au site du projet :
[Link]

RStudio peut tout Ă  fait ĂȘtre utilisĂ© pour dĂ©couvrir et dĂ©marrer avec R. Les diffĂ©rents chapitres d’analyse-
R partent du principe que vous utilisez R avec RStudio. Cependant, à part les éléments portant sur
l’interface de RStudio, l’ensemble du code et des fonctions R peuvent ĂȘtre utilisĂ©s directement dans R,
mĂȘme en l’absence de RStudio.

La documentation de RStudio (en anglais) est disponible en ligne Ă  [Link] Pour ĂȘtre
tenu informé des derniÚres évolutions de RStudio, mais également de plusieurs extensions développées
dans le cadre de ce projet, vous pouvez suivre le blog dédié [Link]

– 12 –
Installation de R et RStudio
Installation de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Installation de RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Mise Ă  jour de R sous Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Voir aussi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14

WEBIN-R

Ce chapitre est évoqué dans le webin-R #01 (premier contact avec R & RStudio) sur YouTube.

Il est prĂ©fĂ©rable de commencer par installer R avant d’installer RStudio.

Installation de R
Pour une installation sous Windows, on se rendra sur cette page : [Link]
base/ et l’on suivra le premier lien pour tĂ©lĂ©charger le programme d’installation. Une fois le programme
d’installation lancĂ©, il suffira d’installer R avec les options par dĂ©faut1.

Pour Mac OS X, les fichiers d’installation sont disponibles à [Link]

Si vous travaillez sous Linux, vous devriez pouvoir trouver R via votre gestionnaire de paquets, cela
pouvant dĂ©pendre d’une distribution de Linux Ă  une autre.

1. Dans le cas particulier oĂč votre ordinateur est situĂ© derriĂšre un proxy, il est prĂ©fĂ©rable de choisir Options de dĂ©marrage
personnalisĂ©es lorsque cela vous sera demandĂ© par le programme d’installation, puis Internet2 lorsqu’on vous
demandera le mode de connexion à Internet. Ainsi, R utilisera par défaut la configuration internet du navigateur
Internet Explorer et prendra ainsi en compte les paramĂštres du proxy.

– 13 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Installation de RStudio
Une fois R correctement installé, rendez-vous sur [Link]
pour tĂ©lĂ©charger la derniĂšre version stable de RStudio. Plus prĂ©cisĂ©ment, il s’agit de l’édition Open Source
de RStudio Desktop (en effet, il existe aussi une version serveur).

Choisissez l’installateur correspondant à votre systùme d’exploitation et suivez les instructions du


programme d’installation.

Si vous voulez tester les derniÚres fonctionnalités de RStudio, vous pouvez télécharger la version de
développement (plus riche en fonctionnalités que la version stable, mais pouvant contenir des bugs) sur
[Link]

Mise Ă  jour de R sous Windows


Pour mettre Ă  jour R sous Windows, il suffit de tĂ©lĂ©charger et d’installer la derniĂšre version du programme
d’installation.

Petite particularitĂ©, la nouvelle version sera installĂ©e Ă  cĂŽtĂ© de l’ancienne version. Si vous souhaitez faire
de la place sur votre disque dur, vous pouvez dĂ©sinstaller l’ancienne version en utilisant l’utilitaire
Désinstaller un programme de Windows.

Lorsque plusieurs versions de R sont disponibles, RStudio choisit par défaut la plus récente. Il est vous est
possible de spécifier à RStudio quelle version de R utiliser via le menu Tools > Global Options > General.

Petit défaut, les extensions (packages) sont installées par défaut sous Windows dans le répertoire
Documents de l'utilisateur > R > win-library > x.y avec x.y correspondant au numéro de
la version de R. Ainsi, si l’on travaillait avec la version 3.0 et que l’on passe à la version 3.2, les extensions
que l’on avait sous l’ancienne version ne sont plus disponibles pour la nouvelle version. Une astuce
consiste Ă  recopier le contenu du rĂ©pertoire 3.0 dans le rĂ©pertoire 3.2 . Puis, on lancera RStudio (s’il
Ă©tait dĂ©jĂ  ouvert, on le fermera puis relancera) et on mettra Ă  jour l’ensemble des packages, soit avec
la fonction, [Link] soit en cliquant sur Update dans l’onglet Packages du quadrant infĂ©rieur
droit.

Voir aussi
Un tutoriel détaillé en français sur le blog Quanti : [Link]

– 14 –
Premier contact
L’invite de commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Objets simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
Vecteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
Des fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Quelques fonctions utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Aide sur une fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Interprétation des arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Autocomplétion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

NOTE

Ce chapitre est inspiré de la section Prise en main du support de cours Introduction à R réalisé par
Julien Barnier.

WEBIN-R

Ce chapitre est évoqué dans le webin-R #01 (premier contact avec R & RStudio) sur YouTube.

Une fois RStudio lancĂ©, vous devriez obtenir une fenĂȘtre similaire Ă  la figure ci-aprĂšs.

– 15 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Interface de RStudio au démarrage

Figure 1. Interface de RStudio au démarrage

L’interface de RStudio est divisĂ©e en quatre quadrants :

‱ le quadrant supĂ©rieur gauche est dĂ©diĂ© aux diffĂ©rents fichiers de travail (nous y reviendrons dans
le chapitre Premier travail avec les données, page 35) ;
‱ le quadrant infĂ©rieur gauche correspond Ă  ce que l’on appelle la console, c’est-Ă -dire Ă  R
proprement dit ;
‱ le quadrant supĂ©rieur droit permet de connaĂźtre
◩ la liste des objets en mĂ©moire ou environnement de travail (onglet Environment)
◩ ainsi que l’historique des commandes saisies dans la console (onglet History) ;
‱ le quadrant infĂ©rieur droit affiche
◩ la liste des fichiers du rĂ©pertoire de travail (onglet Files),
◩ les graphiques rĂ©alisĂ©s (onglet Plots),
◩ la liste des extensions disponibles (onglet Packages),
◩ l’aide en ligne (onglet Help)
◩ et un Viewer utilisĂ© pour visualiser certains types de graphiques au format web.

Inutile de tout retenir pour le moment. Nous aborderons chaque outil en temps utile. Pour l’heure,
concentrons-nous sur la console, c’est-Ă -dire le quadrant infĂ©rieur gauche.

L’invite de commandes
Au démarrage, la console contient un petit texte de bienvenue ressemblant à peu prÚs à ce qui suit :

– 16 –
Premier contact

R version 3.2.0 (2015-04-16) -- "Full of Ingredients"


Copyright (C) 2015 The R Foundation for Statistical Computing
Platform: x86_64-w64-mingw32/x64 (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.


You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.


Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or


'[Link]()' for an HTML browser interface to help.
Type 'q()' to quit R.

>

suivi d’une ligne commençant par le caractùre > et sur laquelle devrait se trouver votre curseur. Cette
ligne est appelĂ©e l’invite de commande (ou prompt en anglais). Elle signifie que R est disponible et en
attente de votre prochaine commande.

Nous allons tout de suite lui fournir une premiĂšre commande. Tapez 2 + 3 dans la console et validez
avec la touche Entrée .

R> 2 + 3

[1] 5

En premier lieu, vous pouvez noter la convention typographique utilisée dans ce documents. Les
commandes saisies dans la console sont indiquées sur un fond gris et précédé de R> . Le résultat renvoyé
par R est quant à lui affiché juste en-dessous sur fond blanc.

Bien, nous savons désormais que R sait faire les additions à un chiffre1. Nous pouvons désormais continuer
avec d’autres opĂ©rations arithmĂ©tiques de base :

R> 8 - 12

[1] -4

1. La présence du [1] en début de ligne sera expliquée par la suite dans la section sur les vecteurs, page 23.

– 17 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> 14 * 25

[1] 350

R> -3 / 10

[1] -0.3

R> -0.3

[1] -0.3

On remarquera que R est anglo-saxon. Les nombres sont donc saisies « Ă  l’anglaise », c’est-Ă -dire en
utilisant le point ( . ) comme séparateur pour les décimales.

– 18 –
Premier contact

NOTE

Une petite astuce trĂšs utile lorsque vous tapez des commandes directement dans la console : en
utilisant les flùches Haut et Bas du clavier, vous pouvez naviguer dans l’historique des commandes
tapées précédemment. Vous pouvez alors facilement réexécuter ou modifier une commande
particuliĂšre.

Sous RStudio, l’onglet History du quadrant haut-droite vous permet de consulter l’historique des
commandes que vous avez transmises Ă  R.

Onglet History sous RStudio

Un double-clic sur une commande la recopiera automatiquement dans la console. Vous pouvez
également sélectionner une ou plusieurs commandes puis cliquer sur To Console.

Voir également (en anglais) : [Link]


History.

Lorsqu’on fournit Ă  R une commande incomplĂšte, celui-ci nous propose de la complĂ©ter en nous
présentant une invite de commande spéciale utilisant les signe + . Imaginons par exemple que nous avons
malencontreusement tapé sur Entrée alors que nous souhaitions calculer 4 * 3 :

R> 4 *

On peut alors compléter la commande en saisissant simplement 3 :

– 19 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> 4 *
+ 3

[1] 12

NOTE

Pour des commandes plus complexes, il arrive parfois qu’on se retrouve coincĂ© avec une invite +
sans plus savoir comment compléter la saisie correctement. On peut alors annuler la commande en
utilisant la touche Echap ou Esc sous Windows.

Sous Linux on utilise le traditionnel Control + C .

À noter que les espaces autour des opĂ©rateurs n’ont pas d’importance lorsque l’on saisit les commandes
dans R. Les trois commandes suivantes sont donc équivalentes, mais on privilégie en général la deuxiÚme
pour des raisons de lisibilité du code.

R> 10+2
10 + 2
10 + 2

Des objets

Objets simples
Faire des opĂ©rations arithmĂ©tiques, c’est bien, mais sans doute pas totalement suffisant. Notamment, on
aimerait pouvoir rĂ©utiliser le rĂ©sultat d’une opĂ©ration sans avoir Ă  le resaisir ou Ă  le copier/coller.

Comme tout langage de programmation, R permet de faire cela en utilisant des objets. Prenons tout de
suite un exemple :

R> x <- 2

Que signifie cette commande ? L’opĂ©rateur <- est appelĂ© opĂ©rateur d’assignation. Il prend une valeur
quelconque Ă  droite et la place dans l’objet indiquĂ© Ă  gauche. La commande pourrait donc se lire mettre la
valeur 2 dans l’objet nommĂ© x .

– 20 –
Premier contact

I M P O R TA N T

Il existe trois opĂ©rateurs d’assignation sous R. Ainsi les trois Ă©critures suivantes sont Ă©quivalentes :

R> x <- 2
x = 2
2 -> x

Cependant, pour une meilleure lecture du code, il est conseillĂ© de n’utiliser que <- . Ainsi, l’objet
créé est systématiquement affiché à gauche. De plus, le symbole = sert également pour écrire des
conditions ou Ă  l’intĂ©rieur de fonctions. Il est donc prĂ©fĂ©rable de ne pas l’utiliser pour assigner une
valeur (afin d’éviter les confusions).

On va ensuite pouvoir rĂ©utiliser cet objet dans d’autres calculs ou simplement afficher son contenu :

R> x + 3

[1] 5

R> x

[1] 2

NOTE

Par dĂ©faut, si on donne Ă  R seulement le nom d’un objet, il va se dĂ©brouiller pour nous prĂ©senter son
contenu d’une maniùre plus ou moins lisible.

On peut utiliser autant d’objets qu’on veut. Ceux-ci peuvent contenir des nombres, des chaünes de
caractĂšres (indiquĂ©es par des guillemets droits doubles " ou simples ' ) et bien d’autres choses encore :

– 21 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> x <- 27
y <- 10
foo <- x + y
foo

[1] 37

R> x <- "Hello"


foo <- x
foo

[1] "Hello"

I M P O R TA N T

Les noms d’objets peuvent contenir des lettres, des chiffres, les symboles . et _ . Ils doivent
impérativement commencer par une lettre (jamais par un chiffre). R fait la différence entre les
majuscules et les minuscules, ce qui signifie que x et X sont deux objets différents. On évitera
Ă©galement d’utiliser des caractĂšres accentuĂ©s dans les noms d’objets. Comme les espaces ne sont pas
autorisés on pourra les remplacer par un point ou un tiret bas.

Enfin, signalons que certains noms courts sont rĂ©servĂ©s par R pour son usage interne et doivent ĂȘtre
évités. On citera notamment c , q , t , C , D , F , I , T , max , min 


Dans RStudio, l’onglet Environment dans le quadrant supĂ©rieur droit indique la liste des objets que vous
avez prĂ©cĂ©demment créés, leur type et la taille qu’ils occupent en mĂ©moire.

– 22 –
Premier contact

Onglet Environment de RStudio

Figure 2. Onglet Environment de RStudio

Vecteurs
Imaginons maintenant que nous avons interrogé dix personnes au hasard dans la rue et que nous avons
relevĂ© pour chacune d’elle sa taille en centimĂštres. Nous avons donc une sĂ©rie de dix nombres que nous
souhaiterions pouvoir rĂ©unir de maniĂšre Ă  pouvoir travailler sur l’ensemble de nos mesures.

Un ensemble de donnĂ©es de mĂȘme nature constituent pour R un vecteur (en anglais vector) et se construit
Ă  l’aide d’une fonction nommĂ©e c 2. On l’utilise en lui donnant la liste de nos donnĂ©es, entre parenthĂšses,
séparées par des virgules :

R> tailles <- c(167, 192, 173, 174, 172, 167, 171, 185, 163, 170)

Ce faisant, nous avons créé un objet nommĂ© tailles et comprenant l’ensemble de nos donnĂ©es, que
nous pouvons afficher en saisissant simplement son nom :

R> tailles

[1] 167 192 173 174 172 167 171 185 163 170

Que se passe-t-il s’il on créé un vecteur plus grand ?

2. c est l’abbrĂ©viation de combine. Le nom de cette fonction est trĂšs court car on l’utilise trĂšs souvent.

– 23 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> c(144, 168, 179, 175, 182, 188, 167, 152, 163, 145, 176, 155, 156, 164, 167, 1
55, 157, 185, 155, 169, 124, 178, 182, 195, 151, 185, 159, 156, 184, 172)

[1] 144 168 179 175 182 188 167 152 163 145 176 155 156 164
[15] 167 155 157 185 155 169 124 178 182 195 151 185 159 156
[29] 184 172

On a bien notre suite de trente tailles, mais on peut remarquer la présence de nombres entre crochets au
début de chaque ligne ( [1] , [15] et [29] ). En fait ces nombres entre crochets indiquent la position du
premier élément de la ligne dans notre vecteur. Ainsi, le 167 en début de deuxiÚme ligne est le 15e élément
du vecteur, tandis que le 184 de la troisiĂšme ligne est Ă  la 29e position.

On en dĂ©duira d’ailleurs que lorsque l’on fait :

R> 2

[1] 2

R considÚre en fait le nombre 2 comme un vecteur à un seul élément.

On peut appliquer des opérations arithmétiques simples directement sur des vecteurs :

R> tailles <- c(167, 192, 173, 174, 172, 167, 171, 185, 163, 170)
tailles + 20

[1] 187 212 193 194 192 187 191 205 183 190

R> tailles / 100

[1] 1.67 1.92 1.73 1.74 1.72 1.67 1.71 1.85 1.63 1.70

R> tailles^2

[1] 27889 36864 29929 30276 29584 27889 29241 34225 26569
[10] 28900

On peut aussi combiner des vecteurs entre eux. L’exemple suivant calcule l’indice de masse corporelle à
partir de la taille et du poids :

– 24 –
Premier contact

R> tailles <- c(167, 192, 173, 174, 172, 167, 171, 185, 163, 170)
poids <- c(86, 74, 83, 50, 78, 66, 66, 51, 50, 55)
tailles.m <- tailles / 100
imc <- poids / (tailles.m^2)
imc

[1] 30.84 20.07 27.73 16.51 26.37 23.67 22.57 14.90 18.82
[10] 19.03

I M P O R TA N T

Quand on fait des opérations sur les vecteurs, il faut veiller à soit utiliser un vecteur et un chiffre (dans
des opĂ©rations du type v * 2 ou v + 10 ), soit Ă  utiliser des vecteurs de mĂȘme longueur (dans des
opérations du type u + v ).

Si on utilise des vecteurs de longueur différentes, on peut avoir quelques surprises. Quand R effectue
une opération avec deux vecteurs de longueurs différentes, il recopie le vecteur le plus court de
maniĂšre Ă  lui donner la mĂȘme taille que le plus long, ce qui s’appelle la rĂšgle de recyclage (recycling rule).
Ainsi, c(1,2) + c(4,5,6,7,8) vaudra l’équivalent de c(1,2,1,2,1) + c(4,5,6,7,8) .

On a vu jusque-là des vecteurs composés de nombres, mais on peut tout à fait créer des vecteurs
composés de chaßnes de caractÚres, représentant par exemple les réponses à une question ouverte ou
fermée :

R> reponse <- c("Bac+2", "Bac", "CAP", "Bac", "Bac", "CAP", "BEP")
reponse

[1] "Bac+2" "Bac" "CAP" "Bac" "Bac" "CAP" "BEP"

Enfin, notons que l’on peut accĂ©der Ă  un Ă©lĂ©ment particulier du vecteur en faisant suivre le nom du vecteur
de crochets contenant le numĂ©ro de l’élĂ©ment dĂ©sirĂ©. Par exemple :

R> reponse <- c("Bac+2", "Bac", "CAP", "Bac", "Bac", "CAP", "BEP")
reponse[2]

[1] "Bac"

Cette opĂ©ration s’appelle l’indexation d’un vecteur. Il s’agit ici de sa forme la plus simple, mais il en existe
d’autres beaucoup plus complexes. L’indexation des vecteurs et des tableaux dans R est l’un des Ă©lĂ©ments
particuliĂšrement souples et puissants du langage (mais aussi l’un des plus dĂ©licats Ă  comprendre et Ă 

– 25 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

maĂźtriser). Nous en reparlerons dans le chapitre Vecteurs, indexation et assignation, page 71.

NOTE

Sous RStudio, vous avez du remarquer que ce dernier effectue une coloration syntaxique. Lorsque
vous tapez une commande, les valeurs numériques sont affichées dans une certaine couleur, les
valeurs textuelles dans une autre et les noms des fonctions dans une troisiĂšme. De plus, si vous
tapez une parenthÚse ouvrante, RStudio va créer automatiquement aprÚs le curseur la parenthÚse
fermante correspondante (de mĂȘme avec les guillements ou les crochets). Si vous placez le curseur
juste aprÚs une parenthÚse fermante, la parenthÚse ouvrante correspondante sera surlignée, ce qui
sera bien pratique lors de la rédaction de commandes complexes.

Des fonctions
Nous savons désormais faire des opérations simples sur des nombres et des vecteurs, stocker ces données
et résultats dans des objets pour les réutiliser par la suite.

Pour aller un peu plus loin nous allons aborder, aprùs les objets, l’autre concept de base de R, à savoir les
fonctions. Une fonction se caractérise de la maniÚre suivante :

‱ elle a un nom ;
‱ elle accepte des arguments (qui peuvent avoir un nom ou pas) ;
‱ elle retourne un rĂ©sultat et peut effectuer une action comme dessiner un graphique ou lire un
fichier.

En fait rien de bien nouveau puisque nous avons dĂ©jĂ  utilisĂ© plusieurs fonctions jusqu’ici, dont la plus
visible est la fonction c . Dans la ligne suivante :

R> reponse <- c("Bac+2", "Bac", "CAP", "Bac", "Bac", "CAP", "BEP")

on fait appel à la fonction nommée c , on lui passe en arguments (entre parenthÚses et séparées par des
virgules) une série de chaßnes de caractÚres et elle retourne comme résultat un vecteur de chaßnes de
caractùres, que nous stockons dans l’objet reponse .

Prenons tout de suite d’autres exemples de fonctions courantes :

R> tailles <- c(167, 192, 173, 174, 172, 167, 171, 185, 163, 170)
length(tailles)

[1] 10

– 26 –
Premier contact

R> mean(tailles)

[1] 173.4

R> var(tailles)

[1] 76.71

Ici, la fonction length nous renvoie le nombre d’élĂ©ments du vecteur, la fonction mean nous donne la
moyenne des éléments du vecteur et fonction var sa variance.

Arguments
Les arguments de la fonction lui sont indiqués entre parenthÚses, juste aprÚs son nom. En général les
premiers arguments passés à la fonction sont des données servant au calcul et les suivants des paramÚtres
influant sur ce calcul. Ceux-ci sont en gĂ©nĂ©ral transmis sous la forme d’argument nommĂ©s.

Reprenons l’exemple des tailles prĂ©cĂ©dent :

R> tailles <- c(167, 192, 173, 174, 172, 167, 171, 185, 163, 170)

Imaginons que le deuxiĂšme enquĂȘtĂ© n’ait pas voulu nous rĂ©pondre. Nous avons alors dans notre vecteur
une valeur manquante. Celle-ci est symbolisée dans R par le code NA :

R> tailles <- c(167, NA, 173, 174, 172, 167, 171, 185, 163, 170)

Recalculons notre taille moyenne :

R> mean(tailles)

[1] NA

Et oui, par défaut, R renvoie NA pour un grand nombre de calculs (dont la moyenne) lorsque les données
comportent une valeur manquante. On peut cependant modifier ce comportement en fournissant un
paramÚtre supplémentaire à la fonction mean , nommé [Link] :

– 27 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> mean(tailles, [Link] = TRUE)

[1] 171.3

Positionner le paramĂštre [Link] Ă  TRUE (vrai) indique Ă  la fonction mean de ne pas tenir compte des
valeurs manquantes dans le calcul.

Lorsqu’on passe un argument à une fonction de cette maniùre, c’est-à-dire sous la forme nom=valeur , on
parle d’argument nommĂ©.

I M P O R TA N T

NA signifie not available. Cette valeur particuliĂšre peut ĂȘtre utilisĂ©e pour indiquer une valeur
manquante pour tout type de liste (nombres, textes, valeurs logique, etc.).

Quelques fonctions utiles


Récapitulons la liste des fonctions que nous avons déjà rencontrées :

Fonction Description

c construit un vecteur Ă  partir d’une sĂ©rie de valeurs

length nombre d’élĂ©ments d’un vecteur

mean moyenne d’un vecteur de type numĂ©rique

var variance d’un vecteur de type numĂ©rique

+, -, *, / opérateurs mathématiques de base

ˆ passage à la puissance

On peut rajouter les fonctions de base suivantes :

– 28 –
Premier contact

Fonction Description

min valeur minimale d’un vecteur numĂ©rique

max valeur maximale d’un vecteur numĂ©rique

sd Ă©cart-type d’un vecteur numĂ©rique

: génÚre une séquence de nombres. 1:4 équivaut à c(1,2,3,4)

Aide sur une fonction


Il est trĂšs frĂ©quent de ne plus se rappeler quels sont les paramĂštres d’une fonction ou le type de rĂ©sultat
qu’elle retourne. Dans ce cas on peut trĂšs facilement accĂ©der Ă  l’aide dĂ©crivant une fonction particuliĂšre
avec ? ou help . Ainsi, pour obtenir de l’aide sur la fonction mean , on saisira l’une des deux entrĂ©es
équivalentes suivantes :

R> ?mean
help("mean")

NOTE

L’utilisation du raccourci ? ne fonctionne pas pour certains opĂ©rateurs comme * . Dans ce cas on
pourra utiliser ?'*' ou bien simplement help("*") .

Sous RStudio, le fichier d’aide associĂ© apparaitra dans le quadrant infĂ©rieur droit sous l’onglet Help.

– 29 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Onglet Help de RStudio

Figure 3. Onglet Help de RStudio

Cette page décrit (en anglais) la fonction, ses arguments, son résultat, le tout accompagné de diverses
notes, rĂ©fĂ©rences et exemples. Ces pages d’aide contiennent Ă  peu prĂšs tout ce que vous pourrez chercher
Ă  savoir, mais elles ne sont pas toujours d’une lecture aisĂ©e.

Un autre cas trĂšs courant dans R est de ne pas se souvenir ou de ne pas connaĂźtre le nom de la fonction
effectuant une tĂąche donnĂ©e. Dans ce cas on se reportera aux diffĂ©rentes maniĂšres de trouver de l’aide
dĂ©crites dans le chapitre OĂč trouver de l’aide ?, page 167.

Interprétation des arguments


Prenons l’exemple de la fonction format dont la version de base permet de mettre en forme un nombre.
Affichons le fichier d’aide associĂ©.

– 30 –
Premier contact

R> ?format

La section Usage présente les arguments de cette fonction et leur valeur par défaut :

format(x, trim = FALSE, digits = NULL, nsmall = 0L,


justify = c("left", "right", "centre", "none"),
width = NULL, [Link] = TRUE, scientific = NA,
[Link] = "", [Link] = 3L,
[Link] = "", [Link] = 5L,
[Link] = ".", [Link] = NULL,
drop0trailing = FALSE, ...)

Regardons ce que cette fonction peut faire. Passons-lui un vecteur avec deux nombres :

R> format(c(12.3, 5678))

[1] " 12.3" "5678.0"

Elle renvoie un vecteur de chaßnes de caractÚres. Le nombre de décimales a été harmonisé et des espaces
ont Ă©tĂ© ajoutĂ©s au dĂ©but du premier nombre afin que l’ensemble des valeurs soient alignĂ©es vers la droite.

L’argument trim permet de supprimer les espaces ajoutĂ©s en dĂ©but de chaĂźne.

R> format(c(12.3, 5678), TRUE)

[1] "12.3" "5678.0"

Dans le cas présent, nous avons saisi les arguments de la fonction sans les nommer. DÚs lors, R considÚre
l’ordre dans lesquels nous avons saisi les arguments, ordre qui correspond à celui du fichier d’aide. Il a
dÚs lors considéré que c(12.3, 5678) correspond à la valeur attribuée à x et que TRUE est la valeur
attribuée à trim .

L’argument nsmall permet d’indiquer le nombre minimum de dĂ©cimales que l’on souhaite afficher. Il
est en quatriÚme position. DÚs lors, pour pouvoir le renseigner avec des arguments non nommés, il faut
fournir également une valeur pour le troisiÚme argument digits .

R> format(c(12.3, 5678), TRUE, NULL, 2)

[1] "12.30" "5678.00"

Ce n’est pas forcĂ©ment ce qu’il y a de plus pratique. D’oĂč l’intĂ©rĂȘt des arguments nommĂ©s. En prĂ©cisant
nsmall = dans l’appel de la fonction, on pourra indiquer que l’on souhaite modifier spĂ©cifiquement

– 31 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

cet argument. Lorsque l’on utilise des arguments non nommĂ©s, l’ordre n’importe plus puisque R sera en
capacité de reconnaßtre ses petits.

R> format(nsmall = 2, x = c(12.3, 5678))

[1] " 12.30" "5678.00"

À l’usage, on aura le plus souvent recours Ă  une combinaison d’arguments non nommĂ©s et d’arguments
nommés. On indiquera les premiers arguments (qui correspondent en général aux données de départ)
sans les nommer et on précisera les options souhaitées avec des arguments nommés. Par exemple, pour
un affichage à la française :

R> format(c(12.3, 5678), [Link] = ",", [Link] = " ")

[1] " 12,3" "5 678,0"

Lorsque l’on regarde la section Usage du fichier d’aide, il apparait que certains arguments, suivi par le
symbole = , ont une valeur par dĂ©faut. Il n’est donc pas nĂ©cessaire de les inclure dans l’appel de la fonction,
auquel cas la valeur pas dĂ©faut sera prise en compte. Par contre, d’autres arguments, ici x , n’ont pas de
valeur par défaut et il est donc nécessaire de fournir systématiquement une valeur.

R> format([Link] = ",")

Error in [Link]([Link] = ","): argument "x" is missing, with no de


fault

Enfin, pour certaines fonctions, on verra parfois apparaĂźtre le symbole ... Ce dernier correspond Ă  un
nombre indĂ©terminĂ© d’arguments. Il peut s’agir, comme dans le cas de format d’arguments additionnels
qui seront utilisĂ©s dans certains cas de figure, ou bien d’arguments qui seront transmis Ă  une fonction
secondaire appelée par la fonction principale, ou encore, comme pour le cas de la fonction c , de la
possibilité de saisir un nombre indéfini de données sources.

Autocomplétion
RStudio fournit un outil bien pratique appelĂ© autocomplĂ©tion3. Saisissez les premiĂšres lettres d’une
fonction, par exemple me puis appuyez sur la touche Tabulation . RStudio affichera la liste des
fonctions dont le nom commence par me ainsi qu’un court descriptif de chacune. Un appui sur la touche
Entrée provoquera la saisie du nom complet de la fonction choisie.

3. En bon français, il faudrait dire complÚtement automatique.

– 32 –
Premier contact

Auto-complétion sous RStudio

Figure 4. Auto-complétion sous RStudio

À l’intĂ©rieur des parenthĂšses d’une fonction, vous pouvez utiliser l’autocomplĂ©tion pour retrouver un
argument de cette fonction.

Vous pouvez Ă©galement utiliser l’autocomplĂ©tion pour retrouver le nom d’un objet que vous avez
précédemment créé.

Pour plus de détails, voir la documentation officielle de RStudio ([Link]


articles/205273297-Code-Completion).

– 33 –
Premier travail avec des
données
Regrouper les commandes dans des scripts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Ajouter des commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Tableaux de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Inspection visuelle des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Structure du tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
Accéder aux variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
La fonction str . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Quelques calculs simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Nos premiers graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Et ensuite ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57

NOTE

Ce chapitre est inspiré de la section Premier travail avec les données du support de cours Introduction à
R réalisé par Julien Barnier.

WEBIN-R

Ce chapitre est évoqué dans le webin-R #01 (premier contact avec R & RStudio) sur YouTube.

Regrouper les commandes dans des scripts


Jusqu’à maintenant nous avons utilisĂ© uniquement la console pour communiquer avec R via l’invite de
commandes. Le principal problĂšme de ce mode d’interaction est qu’une fois qu’une commande est tapĂ©e,
elle est pour ainsi dire « perdue », c’est-Ă -dire qu’on doit la saisir Ă  nouveau si on veut l’exĂ©cuter une

– 35 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

seconde fois. L’utilisation de la console est donc restreinte aux petites commandes « jetables », le plus
souvent utilisées comme test.

La plupart du temps, les commandes seront stockĂ©es dans un fichier Ă  part, que l’on pourra facilement
ouvrir, éditer et exécuter en tout ou partie si besoin. On appelle en général ce type de fichier un script.

Pour comprendre comment cela fonctionne, dans RStudio cliquez sur l’icîne en haut à gauche
représentant un fichier avec un signe plus vert, puis choisissez R script.

Créer un nouveau script R dans RStudio

Figure 1. Créer un nouveau script R dans RStudio

Un nouvel onglet apparaßt dans le quadrant supérieur gauche.

– 36 –
Premier travail avec des données

Onglet d’un script R dans RStudio

Figure 2. Onglet d’un script R dans RStudio

Nous pouvons désormais y saisir des commandes. Par exemple, tapez sur la premiÚre ligne la commande
suivante : 2 + 2 . Ensuite, cliquez sur l’icîne Run (en haut à droite de l’onglet du script) ou bien pressez
simulatément les touches CTRL et Entrée 1.

Les lignes suivantes ont dĂ» faire leur apparition dans la console :

R> 2 + 2

[1] 4

Voici donc comment soumettre rapidement Ă  R les commandes saisies dans votre fichier. Vous pouvez
dĂ©sormais l’enregistrer, l’ouvrir plus tard, et en exĂ©cuter tout ou partie. À noter que vous avez plusieurs
possibilités pour soumettre des commandes à R :

‱ vous pouvez exĂ©cuter la ligne sur laquelle se trouve votre curseur en cliquant sur Run ou en
pressant simulatément les touches CTRL et Entrée ;
‱ vous pouvez sĂ©lectionner plusieurs lignes contenant des commandes et les exĂ©cuter toutes en
une seule fois exactement de la mĂȘme maniĂšre ;
‱ vous pouvez exĂ©cuter d’un coup l’intĂ©gralitĂ© de votre fichier en cliquant sur l’icĂŽne Source.

La plupart du travail sous R consistera donc à éditer un ou plusieurs fichiers de commandes et à envoyer
réguliÚrement les commandes saisies à R en utilisant les raccourcis clavier ad hoc.

Pour plus d’information sur l’utilisation des scripts R dans RStudio, voir (en anglais) :
[Link]

1. Sous Mac OS X, on utilise les touches Pomme et Entrée .

– 37 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

NOTE

Quand vous enregistrez un script sous RStudio, il est possible qu’il vous demande de choisir un type
d’encodage des caractĂšres (Choose Encoding). Si tel est le cas, utilisez de prĂ©fĂ©rence UTF-8.

Ajouter des 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.

Un commentaire sous R commence par un ou plusieurs symboles # (qui s’obtient avec les touches
Alt Gr et 3 sur les claviers de type PC). Tout ce qui suit ce symbole jusqu’à la fin de la ligne est considĂ©rĂ©
comme un commentaire. On peut créer une ligne entiÚre de commentaire en la faisant débuter par ## .
Par exemple :

R> ## Tableau croisé de la CSP par le nombre de livres lus.


## Attention au nombre de non réponses !

On peut aussi créer des commentaires pour une ligne en cours :

R> x <- 2 # On met 2 dans x, parce qu'il le vaut bien

I M P O R TA N T

Dans tous les cas, il est trĂšs important de documenter ses fichiers R au fur et Ă  mesure, faute de quoi
on risque de ne plus y comprendre grand chose si on les reprend ne serait-ce que quelques semaines
plus tard.

Avec RStudio, vous pouvez également utiliser les commentaires pour créer des sections au sein de votre
script et naviguer plus rapidement. Il suffit de faire suivre une ligne de commentaires d’au moins 4 signes
moins ( ---- ). Par exemple, si vous saisissez ceci dans votre script :

– 38 –
Premier travail avec des données

R> ## Créer les objets ----

x <- 2
y <- 5

## Calculs ----

x + y

Vous verrez apparaĂźtre en bas Ă  gauche de la fenĂȘtre du script un symbole diĂšse orange. Si vous cliquez
dessus, un menu de navigation s’affichera vous permettant de vous dĂ©placez rapidement au sein de votre
script. Pour plus d’information, voir la documentation de RStudio (en anglais) :
[Link]

Les sections peuvent Ă©galement ĂȘtre facilement créées avec le raccourci clavier CTRL + SHIFT + R .

Navigation rapide dans les scripts sous RStudio

Figure 3. Navigation rapide dans les scripts sous RStudio

Note : on remarquera au passage que le titre de l’onglet est affichĂ© en rouge et suivi d’une astĂ©risque ( * ),
nous indiquant ainsi qu’il y a des modifications non enregistrĂ©es dans notre fichier.

– 39 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Tableaux de données
Dans cette partie nous allons utiliser un jeu de donnĂ©es inclus dans l’extension questionr. L’installation
d’extension est dĂ©crite dans le chapitre Extensions, page 59.

Le jeu de donnĂ©es en question est un extrait de l’enquĂȘte Histoire de vie rĂ©alisĂ©e par l’INSEE en 2003.
Il contient 2000 individus et 20 variables. Pour pouvoir utiliser ces donnĂ©es, il faut d’abord charger
l’extension questionr (aprĂšs l’avoir installĂ©e, bien entendu). Le chargement d’une extension en mĂ©moire
se fait Ă  l’aide de la fonction library . Sous RStudio, vous pouvez Ă©galement charger une extension en
allant dans l’onglet Packages du quadrant infĂ©rieur droit qui liste l’ensemble des packages disponibles et
en cliquant la case à cocher située à gauche du nom du package désiré.

R> library(questionr)

Puis nous allons indiquer Ă  R que nous souhaitons accĂ©der au jeu de donnĂ©es hdv2003 Ă  l’aide de la
fonction data :

R> data(hdv2003)

Bien. Et maintenant, elles sont oĂč mes donnĂ©es ? Et bien elles se trouvent dans un objet nommĂ© hdv2003
dĂ©sormais chargĂ© en mĂ©moire et accessible directement. D’ailleurs, cet objet est maintenant visible dans
l’onglet Environment du quadrant supĂ©rieur droit.

Essayons de taper son nom à l’invite de commande :

R> hdv2003

Le résultat (non reproduit ici) ne ressemble pas forcément à grand-chose
 Il faut se rappeler que par
dĂ©faut, lorsqu’on lui fournit seulement un nom d’objet, R essaye de l’afficher de la maniĂšre la meilleure
(ou la moins pire) possible. La rĂ©ponse Ă  la commande hdv2003 n’est donc rien moins que l’affichage des
données brutes contenues dans cet objet.

Ce qui signifie donc que l’intĂ©gralitĂ© de notre jeu de donnĂ©es est inclus dans l’objet nommĂ© hdv2003 !
En effet, dans R, un objet peut trĂšs bien contenir un simple nombre, un vecteur ou bien le rĂ©sultat d’une
enquĂȘte tout entier. Dans ce cas, les objets sont appelĂ©s des data frames, ou tableaux de donnĂ©es. Ils
peuvent ĂȘtre manipulĂ©s comme tout autre objet. Par exemple :

R> d <- hdv2003

va entraĂźner la copie de l’ensemble de nos donnĂ©es dans un nouvel objet nommĂ© d , ce qui peut paraĂźtre
parfaitement inutile mais a en fait l’avantage de fournir un objet avec un nom beaucoup plus court, ce qui

– 40 –
Premier travail avec des données

diminuera la quantité de texte à saisir par la suite.

Résumons

Comme nous avons désormais décidé de saisir nos commandes dans un script et non plus directement
dans la console, les premiĂšres lignes de notre fichier de travail sur les donnĂ©es de l’enquĂȘte Histoire de vie
pourraient donc ressembler Ă  ceci :

R> ## Chargement des extensions nécessaires ----


library(questionr)
## Jeu de données hdv2003 ----
data(hdv2003)
d <- hdv2003

Inspection visuelle des données


La particularitĂ© de R par rapport Ă  d’autres logiciels comme Modalisa ou SPSS est de ne pas proposer,
par dĂ©faut, de vue des donnĂ©es sous forme de tableau. Ceci peut parfois ĂȘtre un peu dĂ©stabilisant dans
les premiers temps d’utilisation, mĂȘme si l’on perd vite l’habitude et qu’on finit par se rendre compte que
« voir » les donnĂ©es n’est pas forcĂ©ment un gage de productivitĂ© ou de rigueur dans le traitement.

NĂ©anmoins, R propose une interface permettant de visualiser le contenu d’un tableau de donnĂ©es Ă  l’aide
de la fonction View :

R> View(d)

Sous RStudio, on peut aussi afficher la visionneusee (viewer) en cliquant sur la petite icĂŽne en forme
de tableau situĂ©e Ă  droite de la ligne d’un tableau de donnĂ©es dans l’onglet Environment du quadrant
supérieur droit (cf. figure ci-aprÚs).

– 41 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Icîne pour afficher une vue du contenu d’un tableau

Figure 4. Icîne pour afficher une vue du contenu d’un tableau

Dans tous les cas, RStudio lancera le viewer dans un onglet dédié dans le quadrant supérieur gauche. Le
visualiseur de RStudio est plus avancé que celui-de base fournit par R. Il est possible de trier les données
selon une variable en cliquant sur le nom de cette derniÚre. Il y a également un champs de recherche et un
bouton Filter donnant accÚs à des options de filtrage avancées.

La visionneuse de données de RStudio

Figure 5. La visionneuse de données de RStudio

– 42 –
Premier travail avec des données

Structure du tableau
Avant de travailler sur les données, nous allons essayer de comprendre comment elles sont structurées.
Lors de l’import de donnĂ©es depuis un autre logiciel (que nous aborderons dans un autre chapitre,
page 149), il s’agira souvent de vĂ©rifier que l’importation s’est bien dĂ©roulĂ©e.

Nous avons dĂ©jĂ  vu qu’un tableau de donnĂ©es est organisĂ© en lignes et en colonnes, les lignes
correspondant aux observations et les colonnes aux variables. Les fonctions nrow , ncol et dim
donnent respectivement le nombre de lignes, le nombre de colonnes et les dimensions de notre tableau.
Nous pouvons donc d’ores et dĂ©jĂ  vĂ©rifier que nous avons bien 2000 lignes et 20 colonnes :

R> nrow(d)

[1] 2000

R> ncol(d)

[1] 20

R> dim(d)

[1] 2000 20

La fonction names donne les noms des colonnes de notre tableau, c’est-à-dire les noms des variables :

R> names(d)

[1] "id" "age" "sexe"


[4] "nivetud" "poids" "occup"
[7] "qualif" "[Link]" "clso"
[10] "relig" "[Link]" "[Link]"
[13] "[Link]" "[Link]" "[Link]"
[16] "cuisine" "bricol" "cinema"
[19] "sport" "[Link]"

– 43 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Accéder aux variables


d reprĂ©sente donc l’ensemble de notre tableau de donnĂ©es. Nous avons vu que si l’on saisit simplement
d Ă  l’invite de commandes, on obtient un affichage du tableau en question. Mais comment accĂ©der aux
variables, c’est à dire aux colonnes de notre tableau ?

La rĂ©ponse est simple : on utilise le nom de l’objet, suivi de l’opĂ©rateur $ , suivi du nom de la variable,
comme ceci :

R> d$sexe

Au regard du résultat (non reproduit ici), on constate alors que R a bien accédé au contenu de notre
variable sexe du tableau d et a affichĂ© son contenu, c’est-Ă -dire l’ensemble des valeurs prises par la
variable.

Les fonctions head et tail permettent d’afficher seulement les premiùres (respectivement les
derniĂšres) valeurs prises par la variable. On peut leur passer en argument le nombre d’élĂ©ments Ă  afficher :

R> head(d$nivetud)

[1] Enseignement superieur y compris technique superieur


[2] <NA>
[3] Derniere annee d'etudes primaires
[4] Enseignement superieur y compris technique superieur
[5] Derniere annee d'etudes primaires
[6] Enseignement technique ou professionnel court
8 Levels: N'a jamais fait d'etudes ...

R> tail(d$age, 10)

[1] 52 42 50 41 46 45 46 24 24 66

À noter que ces fonctions marchent aussi pour afficher les lignes du tableau d :

R> head(d, 2)

– 44 –
Premier travail avec des données

La fonction str
La fonction str est plus complÚte que names . Elle liste les différentes variables, indique leur type et
donne le cas Ă©chĂ©ant des informations supplĂ©mentaires ainsi qu’un Ă©chantillon des premiĂšres valeurs
prises par cette variable :

R> str(d)

'[Link]': 2000 obs. of 20 variables:


$ id : int 1 2 3 4 5 6 7 8 9 10 ...
$ age : int 28 23 59 34 71 35 60 47 20 28 ...
$ sexe : Factor w/ 2 levels "Homme","Femme": 2 2 1 1 2 2 2 1 2 1 ...
$ nivetud : Factor w/ 8 levels "N'a jamais fait d'etudes",..: 8 NA 3 8 3 6
3 6 NA 7 ...
$ poids : num 2634 9738 3994 5732 4329 ...
$ occup : Factor w/ 7 levels "Exerce une profession",..: 1 3 1 1 4 1 6 1
3 1 ...
$ qualif : Factor w/ 7 levels "Ouvrier specialise",..: 6 NA 3 3 6 6 2 2 N
A 7 ...
$ [Link]: int 8 2 2 1 0 5 1 5 4 2 ...
$ clso : Factor w/ 3 levels "Oui","Non","Ne sait pas": 1 1 2 2 1 2 1 2
1 2 ...
$ relig : Factor w/ 6 levels "Pratiquant regulier",..: 4 4 4 3 1 4 3 4 3
2 ...
$ [Link] : Factor w/ 4 levels "Le plus important",..: 4 NA 2 3 NA 1 NA 4
NA 3 ...
$ [Link] : Factor w/ 3 levels "Satisfaction",..: 2 NA 3 1 NA 3 NA 2 NA 1
...
$ [Link] : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
$ [Link] : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
$ [Link] : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 2 2 1 1 ...
$ cuisine : Factor w/ 2 levels "Non","Oui": 2 1 1 2 1 1 2 2 1 1 ...
$ bricol : Factor w/ 2 levels "Non","Oui": 1 1 1 2 1 1 1 2 1 1 ...
$ cinema : Factor w/ 2 levels "Non","Oui": 1 2 1 2 1 2 1 1 2 2 ...
$ sport : Factor w/ 2 levels "Non","Oui": 1 2 2 2 1 2 1 1 1 2 ...
$ [Link] : num 0 1 0 2 3 2 2.9 1 2 2 ...

La premiĂšre ligne nous informe qu’il s’agit bien d’un tableau de donnĂ©es avec 2000 observations et 20
variables. Vient ensuite la liste des variables. La premiĂšre se nomme id et est de type entier (int). La
seconde se nomme age et est de type numĂ©rique. La troisiĂšme se nomme sexe, il s’agit d’un facteur
(factor).

Un facteur est une variable pouvant prendre un nombre limité de modalités (levels). Ici notre variable a

– 45 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

deux modalités possibles : « Homme » et « Femme ». Ce type de variable est décrit plus en détail dans le
chapitre sur la manipulation de données.

– 46 –
Premier travail avec des données

I M P O R TA N T

La fonction str est essentielle à connaütre et peut s’appliquer à n’importe quel type d’objet. C’est un
excellent moyen de connaĂźtre en dĂ©tail la structure d’un objet. Cependant, les rĂ©sultats peuvent ĂȘtre
parfois trop dĂ©taillĂ©s et on lui priviligiera dans certains cas la fonction describe que l’on abordera
dans les prochains chapitres, cependant moins gĂ©nĂ©rique puisque ne s’appliquant qu’à des tableaux de
donnĂ©es et Ă  des vecteurs, tandis que str peut s’appliquer Ă  absolument tout objet, y compris des
fonctions.

R> describe(d)

20 Variables 2000 Observations


------------------------------------------------------------
id
n missing distinct Info Mean Gmd
2000 0 2000 1 1000 667
.05 .10 .25 .50 .75 .90
101.0 200.9 500.8 1000.5 1500.2 1800.1
.95
1900.0

lowest : 1 2 3 4 5, highest: 1996 1997 1998 1999 2000


------------------------------------------------------------
age
n missing distinct Info Mean Gmd
2000 0 78 1 48.16 19.4
.05 .10 .25 .50 .75 .90
22 26 35 48 60 72
.95
77

lowest : 18 19 20 21 22, highest: 91 92 93 96 97


------------------------------------------------------------
sexe
n missing distinct
2000 0 2

Value Homme Femme


Frequency 899 1101
Proportion 0.45 0.55

– 47 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

------------------------------------------------------------
nivetud
n missing distinct
1888 112 8

lowest : N'a jamais fait d'etudes A ar


rete ses etudes, avant la derniere annee d'etudes primaires Derniere annee
d'etudes primaires 1er cycle
2eme cycle

highest: 1er cycle 2eme


cycle Enseignement tech
nique ou professionnel court Enseignement technique ou prof
essionnel long Enseignement superieur y compris technique
superieur
------------------------------------------------------------
poids
n missing distinct Info Mean Gmd
2000 0 1877 1 5536 4553
.05 .10 .25 .50 .75 .90
799.8 1161.7 2221.8 4631.2 7626.5 10819.0
.95
13647.9

lowest : 78.08 92.68 92.94 127.90 153.01


highest: 27195.84 29548.79 29570.79 29657.94 31092.14
------------------------------------------------------------
occup
n missing distinct
2000 0 7

lowest : Exerce une profession Chomeur Etudiant, eleve Re


traite Retire des affaires
highest: Etudiant, eleve Retraite Retire des affaires Au
foyer Autre inactif

Exerce une profession (1049, 0.524), Chomeur (134, 0.067),


Etudiant, eleve (94, 0.047), Retraite (392, 0.196), Retire
des affaires (77, 0.038), Au foyer (171, 0.086), Autre
inactif (83, 0.042)
------------------------------------------------------------
qualif
n missing distinct

– 48 –
Premier travail avec des données

1653 347 7

lowest : Ouvrier specialise Ouvrier qualifie Technicien


Profession intermediaire Cadre
highest: Technicien Profession intermediaire Cadre
Employe Autre

Ouvrier specialise (203, 0.123), Ouvrier qualifie (292,


0.177), Technicien (86, 0.052), Profession intermediaire
(160, 0.097), Cadre (260, 0.157), Employe (594, 0.359),
Autre (58, 0.035)
------------------------------------------------------------
[Link]
n missing distinct Info Mean Gmd
2000 0 19 0.977 3.283 2.87
.05 .10 .25 .50 .75 .90
0 1 1 2 5 7
.95
9

lowest : 0 1 2 3 4, highest: 14 15 16 18 22

0 (167, 0.084), 1 (407, 0.203), 2 (427, 0.214), 3 (284,


0.142), 4 (210, 0.105), 5 (151, 0.076), 6 (99, 0.050), 7
(94, 0.047), 8 (52, 0.026), 9 (37, 0.018), 10 (21, 0.011),
11 (21, 0.011), 12 (8, 0.004), 13 (10, 0.005), 14 (4,
0.002), 15 (4, 0.002), 16 (1, 0.000), 18 (2, 0.001), 22 (1,
0.000)
------------------------------------------------------------
clso
n missing distinct
2000 0 3

Value Oui Non Ne sait pas


Frequency 936 1037 27
Proportion 0.468 0.518 0.014
------------------------------------------------------------
relig
n missing distinct
2000 0 6

lowest : Pratiquant regulier Pratiquant occasionnel Appartenance


sans pratique Ni croyance ni appartenance Rejet

– 49 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

highest: Pratiquant occasionnel Appartenance sans pratique Ni croyance


ni appartenance Rejet NSP ou NVPR

Pratiquant regulier (266, 0.133), Pratiquant occasionnel


(442, 0.221), Appartenance sans pratique (760, 0.380), Ni
croyance ni appartenance (399, 0.200), Rejet (93, 0.046),
NSP ou NVPR (40, 0.020)
------------------------------------------------------------
[Link]
n missing distinct
1048 952 4

Le plus important (29, 0.028), Aussi important que le reste


(259, 0.247), Moins important que le reste (708, 0.676),
Peu important (52, 0.050)
------------------------------------------------------------
[Link]
n missing distinct
1048 952 3

Value Satisfaction Insatisfaction Equilibre


Frequency 480 117 451
Proportion 0.458 0.112 0.430
------------------------------------------------------------
[Link]
n missing distinct
2000 0 2

Value Non Oui


Frequency 1986 14
Proportion 0.993 0.007
------------------------------------------------------------
[Link]
n missing distinct
2000 0 2

Value Non Oui


Frequency 1953 47
Proportion 0.977 0.024
------------------------------------------------------------
[Link]
n missing distinct
2000 0 2

– 50 –
Premier travail avec des données

Value Non Oui


Frequency 1776 224
Proportion 0.888 0.112
------------------------------------------------------------
cuisine
n missing distinct
2000 0 2

Value Non Oui


Frequency 1119 881
Proportion 0.559 0.440
------------------------------------------------------------
bricol
n missing distinct
2000 0 2

Value Non Oui


Frequency 1147 853
Proportion 0.574 0.426
------------------------------------------------------------
cinema
n missing distinct
2000 0 2

Value Non Oui


Frequency 1174 826
Proportion 0.587 0.413
------------------------------------------------------------
sport
n missing distinct
2000 0 2

Value Non Oui


Frequency 1277 723
Proportion 0.638 0.362
------------------------------------------------------------
[Link]
n missing distinct Info Mean Gmd
1995 5 29 0.972 2.247 1.877
.05 .10 .25 .50 .75 .90
0 0 1 2 3 4
.95

– 51 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

lowest : 0.0 0.1 0.2 0.3 0.4, highest: 8.0 9.0 10.0 11.0 12.0
------------------------------------------------------------

Quelques calculs simples


Maintenant que nous savons accéder aux variables, effectuons quelques calculs simples comme la
moyenne, la mĂ©diane, le minimum et le maximum, Ă  l’aide des fonctions mean , median , min et max .

R> mean(d$age)

[1] 48.16

R> median(d$age)

[1] 48

R> min(d$age)

[1] 18

R> max(d$age)

[1] 97

NOTE

Au sens strict, il ne s’agit pas d’un vĂ©ritable Ăąge moyen puisqu’il faudrait ajouter 0,5 Ă  cette valeur
calculĂ©e, un Ăąge moyen se calculant Ă  partir d’ñges exacts et non Ă  partir d’ñges rĂ©volus. Voir le chapitre
Calculer un Ăąge, page 1327.

– 52 –
Premier travail avec des données

On peut aussi trùs facilement obtenir un tri à plat à l’aide la fonction table :

R> table(d$qualif)

Ouvrier specialise Ouvrier qualifie


203 292
Technicien Profession intermediaire
86 160
Cadre Employe
260 594
Autre
58

La fonction summary , bien pratique, permet d’avoir une vue rĂ©sumĂ©e d’une variable. Elle s’applique Ă  tout
type d’objets (y compris un tableau de donnĂ©es entier) et s’adapte Ă  celui-ci.

R> summary(d$age)

Min. 1st Qu. Median Mean 3rd Qu. Max.


18.0 35.0 48.0 48.2 60.0 97.0

R> summary(d$qualif)

Ouvrier specialise Ouvrier qualifie


203 292
Technicien Profession intermediaire
86 160
Cadre Employe
260 594
Autre NA's
58 347

R> summary(d)

id age sexe
Min. : 1 Min. :18.0 Homme: 899
1st Qu.: 501 1st Qu.:35.0 Femme:1101
Median :1000 Median :48.0
Mean :1000 Mean :48.2
3rd Qu.:1500 3rd Qu.:60.0

– 53 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Max. :2000 Max. :97.0

nivetud
Enseignement technique ou professionnel court :463
Enseignement superieur y compris technique superieur:441
Derniere annee d'etudes primaires :341
1er cycle :204
2eme cycle :183
(Other) :256
NA's :112
poids occup
Min. : 78 Exerce une profession:1049
1st Qu.: 2222 Chomeur : 134
Median : 4631 Etudiant, eleve : 94
Mean : 5536 Retraite : 392
3rd Qu.: 7627 Retire des affaires : 77
Max. :31092 Au foyer : 171
Autre inactif : 83
qualif [Link]
Employe :594 Min. : 0.00
Ouvrier qualifie :292 1st Qu.: 1.00
Cadre :260 Median : 2.00
Ouvrier specialise :203 Mean : 3.28
Profession intermediaire:160 3rd Qu.: 5.00
(Other) :144 Max. :22.00
NA's :347
clso relig
Oui : 936 Pratiquant regulier :266
Non :1037 Pratiquant occasionnel :442
Ne sait pas: 27 Appartenance sans pratique :760
Ni croyance ni appartenance:399
Rejet : 93
NSP ou NVPR : 40

[Link] [Link]
Le plus important : 29 Satisfaction :480
Aussi important que le reste:259 Insatisfaction:117
Moins important que le reste:708 Equilibre :451
Peu important : 52 NA's :952
NA's :952

[Link] [Link] [Link] cuisine bricol


Non:1986 Non:1953 Non:1776 Non:1119 Non:1147
Oui: 14 Oui: 47 Oui: 224 Oui: 881 Oui: 853

– 54 –
Premier travail avec des données

cinema sport [Link]


Non:1174 Non:1277 Min. : 0.00
Oui: 826 Oui: 723 1st Qu.: 1.00
Median : 2.00
Mean : 2.25
3rd Qu.: 3.00
Max. :12.00
NA's :5

Nos premiers graphiques


R est trÚs puissant en termes de représentations graphiques, notamment grùce à des extensions dédiées.
Pour l’heure contentons-nous d’un premier essai Ă  l’aide de la fonction gĂ©nĂ©rique plot .

– 55 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> plot(d$sexe)

Figure 6. Nombre d’observations par sexe

Essayons avec deux variables :

– 56 –
Premier travail avec des données

R> plot(d$[Link], d$age)

Figure 7. Âge des enquĂȘtĂ©s selon qu’ils Ă©coutent ou non du hard rock

Il semblerait bien que les amateurs de hard rock soient plus jeunes.

Et ensuite ?
Nous n’avons qu’entr’aperçu les possibilitĂ©s de R. Avant de pouvoir nous lancer dans des analyses
statisques, il est prĂ©fĂ©rable de revenir un peu aux fondamentaux de R (les types d’objets, la syntaxe, le
recodage de variables
) mais aussi comment installer des extensions, importer des données, etc. Nous
vous conseillons donc de poursuivre la lecture de la section Prise en main puis de vous lancer à l’assault de
la section Statistique introductive.

– 57 –
Extensions (installation, mise
Ă  jour)
Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Le «tidyverse» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Installation depuis CRAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
Installation depuis GitHub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Mise Ă  jour des extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62

GUIDE-R

Une version actualisée de ce chapitre est disponible sur guide-R : Package

WEBIN-R

Ce chapitre est évoqué dans le webin-R #01 (premier contact avec R & RStudio) sur YouTube.

Présentation
L’installation par dĂ©faut du logiciel R contient le cƓur du programme ainsi qu’un ensemble de fonctions de
base fournissant un grand nombre d’outils de traitement de donnĂ©es et d’analyse statistiques.

R Ă©tant un logiciel libre, il bĂ©nĂ©ficie d’une forte communautĂ© d’utilisateurs qui peuvent librement
contribuer au développement du logiciel en lui ajoutant des fonctionnalités supplémentaires. Ces
contributions prennent la forme d’extensions (packages en anglais) pouvant ĂȘtre installĂ©es par l’utilisateur
et fournissant alors diverses fonctionnalités supplémentaires.

Il existe un trĂšs grand nombre d’extensions (plus de 6500 Ă  ce jour), qui sont diffusĂ©es par un rĂ©seau

– 59 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

baptisé CRAN (Comprehensive R Archive Network).

La liste de toutes les extensions disponibles sur CRAN est disponible ici : [Link]
packages/.

Pour faciliter un peu le repérage des extensions, il existe un ensemble de regroupements thématiques
(économétrie, finance, génétique, données spatiales
) baptisés Task views : [Link]
web/views/.

On y trouve notamment une Task view dédiée aux sciences sociales, listant de nombreuses extensions
potentiellement utiles pour les analyses statistiques dans ce champ disciplinaire : [Link]
[Link]/web/views/[Link].

On peut aussi citer le site Awesome R ([Link] qui fournit une liste
d’extensions choisies et triĂ©es par thĂ©matique.

Le «tidyverse»
Hadley Wickham est professeur associĂ© Ă  l’universitĂ© de Rice et scientifique en chef Ă  Rstudio. Il a
dĂ©veloppĂ© de nombreux extensions pour R (plus d’une cinquantaine Ă  ce jours) qui, pour la plupart,
fonctionne de maniĂšre harmonisĂ©e entre elles. Par ailleurs, la plupart s’intĂšgre parfaitement avec
RStudio. Cet ensemble d’extenions est appelĂ© tidyverse et est dĂ©veloppĂ© sur GitHub : [Link]
tidyverse/. Une présentation plus générale du tidyverse est disponible sur le site de RStudio
([Link] et sur un sité dédié ([Link]

Pour certaines tùches, il peut exister plusieurs solutions / extensions différentes pour les réaliser. Dans
la mesure oĂč il n’est pas possible d’ĂȘtre exhaustif, nous avons fait le choix dans le cadre d’analyse-R de
choisir en priorité, lorsque cela est possible, les extensions du tidyverse, en particulier haven, readr et
readxl pour l’import de donnĂ©es, dplyr, tidyr ou reshape2 pour la manipulation de donnĂ©es, ggplot2 pour
les graphiques, lubridate pour la gestion des dates, forcats pour la manipulation des facteurs ou encore
stringr pour la manipulation de chaĂźnes de caractĂšres.

Il existe par ailleurs une extension homonyme tidyverse. L’installation (voir ci-dessous) de cette extension
permets l’installation automatique de l’ensemble des autres extensions du tidyverse. Le chargement de
cette extension avec la fonction library (voir ci-aprÚs) permets de charger en mémoire en une seule
opération les principales extensions du tidyverse, à savoir ggplot2, tibble, tidyr, readr, purrr et dplyr.

Pour une présentation plus poussée, voir le chapitre consacré au tidyverse, page 63.

Installation depuis CRAN


L’installation d’une extension se fait par la fonction [Link] , à qui on fournit le nom de
l’extension. Par exemple, si on souhaite installer l’extension ade4 :

– 60 –
Extensions (installation, mise Ă  jour)

R> [Link]("ade4", dep = TRUE)

L’option dep=TRUE indique Ă  R de tĂ©lĂ©charger et d’installer Ă©galement toutes les extensions dont
l’extension choisie dĂ©pend pour son fonctionnement.

Sous RStudio, on pourra Ă©galement cliquer sur Install dans l’onglet Packages du quadrant infĂ©rieur droit.

Une fois l’extension installĂ©e, elle peut ĂȘtre appelĂ©e depuis la console ou un fichier script avec la fonction
library ou la fonction require :

R> library(ade4)

À partir de lĂ , on peut utiliser les fonctions de l’extension, consulter leur page d’aide en ligne, accĂ©der aux
jeux de donnĂ©es qu’elle contient, etc.

Pour mettre Ă  jour l’ensemble des extensions installĂ©es, <dfndata-index=“mise Ă  jour, extensions”> la
fonction [Link] suffit :

R> [Link]()

Sous RStudio, on pourra alternativement cliquer sur Update dans l’onglet Packages du quadrant infĂ©rieur
droit.

Si on souhaite désinstaller une extension précédemment installée, on peut utiliser la fonction


[Link] :

R> [Link]("ade4")

I M P O R TA N T

Il est important de bien comprendre la différence entre [Link] et library . La


premiĂšre va chercher les extensions sur internet et les installe en local sur le disque dur de
l’ordinateur. On n’a besoin d’effectuer cette opĂ©ration qu’une seule fois. La seconde lit les informations
de l’extension sur le disque dur et les met Ă  disposition de R. On a besoin de l’exĂ©cuter Ă  chaque dĂ©but
de session ou de script.

Installation depuis GitHub


Certains packages sont développés sur GitHub. DÚs lors, la version de développement sur GitHub peut
contenir des fonctions qui ne sont pas encore disponibles dans la version stable disponible sur CRAN. Ils
arrivent aussi parfois que certains packages ne soient disponibles que sur GitHub.

– 61 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

L’installation d’un package depuis GitHub est trùs facile grñce à la fonction install_github de
l’extension devtools (que l’on aura prĂ©alablement installĂ©e depuis CRAN ;-) ).

Mise Ă  jour des extensions


Il est facile de mettre Ă  jour l’ensemble des extensions installĂ©es, soit avec la fonction, [Link]
soit en cliquant sur Update dans l’onglet Packages du quadrant infĂ©rieur droit.

– 62 –
Introduction au tidyverse
Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
tidy data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
tibbles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65

NOTE

La version originale de ce chapitre a été écrite par Julien Barnier dans le cadre de son Introduction à R
et au tidyverse.

Extensions
Le terme tidyverse est une contraction de tidy (qu’on pourrait traduire par “bien rangĂ©â€) et de universe. Il
s’agit en fait d’une collection d’extensions conçues pour travailler ensemble et basĂ©es sur une philosophie
commune.

Elles abordent un trĂšs grand nombre d’opĂ©rations courantes dans R (la liste n’est pas exhaustive) :

‱ visualisation
‱ manipulation des tableaux de donnĂ©es
‱ import/export de donnĂ©es
‱ manipulation de variables
‱ extraction de donnĂ©es du Web
‱ programmation

Un des objectifs de ces extensions est de fournir des fonctions avec une syntaxe cohérente, qui
fonctionnent bien ensemble, et qui retournent des résultats prévisibles. Elles sont en grande partie issues
du travail d’Hadley Wickham, qui travaille dĂ©sormais pour RStudio.

– 63 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Installation
tidyverse est Ă©galement le nom d’une extension qu’on peut installer de maniĂšre classique, soit via le
bouton Install de l’onglet Packages de RStudio, soit en utilisant la commande :

R> [Link]("tidyverse")

Cette commande va en fait installer plusieurs extensions qui constituent le «coeur» du tidyverse, à savoir :

‱ ggplot2 (visualisation)
‱ dplyr (manipulation des donnĂ©es)
‱ tidyr (remise en forme des donnĂ©es)
‱ purrr (programmation)
‱ readr (importation de donnĂ©es)
‱ tibble (tableaux de donnĂ©es)
‱ forcats (variables qualitatives)
‱ stringr (chaünes de caractùres)

De la mĂȘme maniĂšre, charger l’extension avec :

R> library(tidyverse)

Chargera l’ensemble des extensions prĂ©cĂ©dentes.

Il existe d’autres extensions qui font partie du tidyverse mais qui doivent ĂȘtre chargĂ©es explicitement,
comme par exemple readxl (pour l’importation de donnĂ©es depuis des fichiers Excel).

La liste complĂšte des extensions se trouve sur le site officiel du tidyverse.

tidy data
Le tidyverse est en partie fondĂ© sur le concept de tidy data, dĂ©veloppĂ© Ă  l’origine par Hadley Wickham
dans un article de 2014 du Journal of Statistical Software.

Il s’agit d’un modĂšle d’organisation des donnĂ©es qui vise Ă  faciliter le travail souvent long et fastidieux de
nettoyage et de prĂ©paration prĂ©alable Ă  la mise en oeuvre de mĂ©thodes d’analyse.

Les principes d’un jeu de donnĂ©es tidy sont les suivants :

1. chaque variable est une colonne


2. chaque observation est une ligne
3. chaque type d’observation est dans une table diffĂ©rente

– 64 –
Introduction au tidyverse

Un chapitre dĂ©diĂ© Ă  tidyr, page 309 prĂ©sente comment dĂ©finir et rendre des donnĂ©es tidy avec l’extension
tidyr.

Les extensions du tidyverse, notamment ggplot2 et dplyr, sont prévues pour fonctionner avec des
données tidy.

tibbles
GUIDE-R

Une version actualisée de cette section est disponible sur guide-R : Tibbles

Une autre particularité du tidyverse est que ces extensions travaillent avec des tableaux de données au
format tibble , qui est une évolution plus moderne du classique data frame du R de base. Ce format est
fourni est gĂ©rĂ© par l’extension du mĂȘme nom (tibble), qui fait partie du coeur du tidyverse. La plupart des
fonctions des extensions du tidyverse acceptent des data frames en entrée, mais retournent un objet de
classe tibble .

Contrairement aux data frames, les tibbles :

‱ n’ont pas de noms de lignes (rownames)


‱ autorisent des noms de colonnes invalides pour les data frames (espaces, caractĂšres spĂ©ciaux,
nombres
) 1
‱ s’affichent plus intelligemment que les data frames : seules les premiĂšres lignes sont affichĂ©es,
ainsi que quelques informations supplémentaires utiles (dimensions, types des colonnes
)
‱ ne font pas de partial matching sur les noms de colonnes 2
‱ affichent un avertissement si on essaie d’accĂ©der Ă  une colonne qui n’existe pas

Pour autant, les tibbles restent compatibles avec les data frames. On peut ainsi facilement convertir un
data frame en tibble avec as_tibble :

R> library(tidyverse)
as_tibble(mtcars)

# A tibble: 32 × 11
mpg cyl disp hp drat wt qsec vs am
<dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 21 6 160 110 3.9 2.62 16.5 0 1

1. Quand on veut utiliser des noms de ce type, on doit les entourer avec des backticks (`)

2. Dans R de base, si une table d contient une colonne qualif , d$qual retournera cette colonne.

– 65 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

2 21 6 160 110 3.9 2.88 17.0 0 1


3 22.8 4 108 93 3.85 2.32 18.6 1 1
4 21.4 6 258 110 3.08 3.22 19.4 1 0
5 18.7 8 360 175 3.15 3.44 17.0 0 0
6 18.1 6 225 105 2.76 3.46 20.2 1 0
7 14.3 8 360 245 3.21 3.57 15.8 0 0
8 24.4 4 147. 62 3.69 3.19 20 1 0
9 22.8 4 141. 95 3.92 3.15 22.9 1 0
10 19.2 6 168. 123 3.92 3.44 18.3 1 0
# 
 with 22 more rows, and 2 more variables: gear <dbl>,
# carb <dbl>

Si le data frame d’origine a des rownames, on peut d’abord les convertir en colonnes avec
rownames_to_columns :

R> d <- as_tibble(rownames_to_column(mtcars))


d

# A tibble: 32 × 12
rowname mpg cyl disp hp drat wt qsec vs
<chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 Mazda RX4 21 6 160 110 3.9 2.62 16.5 0
2 Mazda RX
 21 6 160 110 3.9 2.88 17.0 0
3 Datsun 7
 22.8 4 108 93 3.85 2.32 18.6 1
4 Hornet 4
 21.4 6 258 110 3.08 3.22 19.4 1
5 Hornet S
 18.7 8 360 175 3.15 3.44 17.0 0
6 Valiant 18.1 6 225 105 2.76 3.46 20.2 1
7 Duster 3
 14.3 8 360 245 3.21 3.57 15.8 0
8 Merc 240D 24.4 4 147. 62 3.69 3.19 20 1
9 Merc 230 22.8 4 141. 95 3.92 3.15 22.9 1
10 Merc 280 19.2 6 168. 123 3.92 3.44 18.3 1
# 
 with 22 more rows, and 3 more variables: am <dbl>,
# gear <dbl>, carb <dbl>

À l’inverse, on peut à tout moment convertir un tibble en data frame avec [Link] :

R> [Link](d)

rowname mpg cyl disp hp drat wt qsec


1 Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46
2 Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02
3 Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61
4 Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44
5 Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02

– 66 –
Introduction au tidyverse

6 Valiant 18.1 6 225.0 105 2.76 3.460 20.22


7 Duster 360 14.3 8 360.0 245 3.21 3.570 15.84
8 Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00
9 Merc 230 22.8 4 140.8 95 3.92 3.150 22.90
10 Merc 280 19.2 6 167.6 123 3.92 3.440 18.30
11 Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90
12 Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40
13 Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60
14 Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00
15 Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98
16 Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82
17 Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42
18 Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47
19 Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52
20 Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90
21 Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01
22 Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87
23 AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30
24 Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41
25 Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05
26 Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90
27 Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70
28 Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90
29 Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50
30 Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50
31 Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60
32 Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60
vs am gear carb
1 0 1 4 4
2 0 1 4 4
3 1 1 4 1
4 1 0 3 1
5 0 0 3 2
6 1 0 3 1
7 0 0 3 4
8 1 0 4 2
9 1 0 4 2
10 1 0 4 4
11 1 0 4 4
12 0 0 3 3
13 0 0 3 3
14 0 0 3 3
15 0 0 3 4
16 0 0 3 4
17 0 0 3 4
18 1 1 4 1
19 1 1 4 2

– 67 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

20 1 1 4 1
21 1 0 3 1
22 0 0 3 2
23 0 0 3 2
24 0 0 3 4
25 0 0 3 2
26 1 1 4 1
27 0 1 5 2
28 1 1 5 2
29 0 1 5 4
30 0 1 5 6
31 0 1 5 8
32 1 1 4 2

Là encore, on peut convertir la colonne rowname en “vrais” rownames avec column_to_rownames :

R> column_to_rownames([Link](d))

mpg cyl disp hp drat wt qsec vs


Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1
Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0
Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1
Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0
Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1
Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1
Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1
Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1
Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0
Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0
Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0
Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0
Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0
Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0
Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1
Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1
Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1
Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1
Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0
AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0
Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0
Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0
Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1

– 68 –
Introduction au tidyverse

Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0


Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1
Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0
Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0
Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0
Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1
am gear carb
Mazda RX4 1 4 4
Mazda RX4 Wag 1 4 4
Datsun 710 1 4 1
Hornet 4 Drive 0 3 1
Hornet Sportabout 0 3 2
Valiant 0 3 1
Duster 360 0 3 4
Merc 240D 0 4 2
Merc 230 0 4 2
Merc 280 0 4 4
Merc 280C 0 4 4
Merc 450SE 0 3 3
Merc 450SL 0 3 3
Merc 450SLC 0 3 3
Cadillac Fleetwood 0 3 4
Lincoln Continental 0 3 4
Chrysler Imperial 0 3 4
Fiat 128 1 4 1
Honda Civic 1 4 2
Toyota Corolla 1 4 1
Toyota Corona 0 3 1
Dodge Challenger 0 3 2
AMC Javelin 0 3 2
Camaro Z28 0 3 4
Pontiac Firebird 0 3 2
Fiat X1-9 1 4 1
Porsche 914-2 1 5 2
Lotus Europa 1 5 2
Ford Pantera L 1 5 4
Ferrari Dino 1 5 6
Maserati Bora 1 5 8
Volvo 142E 1 4 2

– 69 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

NOTE

Les deux fonctions column_to_rownames et rownames_to_column acceptent un argument


supplĂ©mentaire var qui permet d’indiquer un nom de colonne autre que le nom rowname utilisĂ© par
défaut pour créer ou identifier la colonne contenant les noms de lignes.

– 70 –
Vecteurs, indexation et
assignation
Présentation des vecteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Les principaux types de vecteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
Création . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
La fonction c . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
La fonction rep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
La fonction seq . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
L’opĂ©rateur : . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Longueur d’un vecteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
Quelques vecteurs remarquables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Combiner des vecteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Valeurs manquantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
Indexation par position . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Des vecteurs nommés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Indexation par nom . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
Indexation par condition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Assignation par indexation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
En résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90

GUIDE-R

Une version actualisée de ce chapitre est disponible sur guide-R : Vecteurs

WEBIN-R

Ce chapitre est évoqué dans le webin-R #02 (les bases du langage R) sur YouTube.

– 71 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Nous allons reprendre plusieurs éléments de base du langage R que nous avons déjà abordés mais de
maniĂšre plus formelle. Une bonne comprĂ©hension des bases du langage, bien qu’un peu ardue de prime
abord, permet de comprendre le sens des commandes qu’on utilise et de pleinement exploiter la puissance
que R offre en matiÚre de manipulation de données.

Dans ce chapitre, nous reviendrons sur les vecteurs, tandis que les listes et les tableaux de données seront
abordés dans un chapitre dédié, page 91.

Présentation des vecteurs


Les vecteurs sont l’un des objets de base de R et correspondent Ă  une «liste de valeurs». Leurs propriĂ©tĂ©s
fondamentales sont :

‱ les vecteurs sont unidimensionnels (i.e. ce sont des objets Ă  une seule dimension, Ă  la diffĂ©rence
d’une matrice par exemple) ;
‱ toutes les valeurs d’un vecteur sont d’un seul et mĂȘme type ;
‱ les vecteurs ont une longueur qui correspond au nombre de valeurs contenues dans le vecteur.

Les principaux types de vecteurs


Dans R, il existe quatre types fondamentaux de vecteurs :

‱ les nombres rĂ©els (c’est-Ă -dire les nombres dĂ©cimaux que nous utilisons au quotidien),
‱ les nombres entiers,
‱ les chaünes de caractùres (qui correspondent à du texte) et
‱ les valeurs logiques ou valeurs boolĂ©ennes, Ă  savoir «vrai» ou «faux».

Pour connaütre la nature d’un objet, le plus simple est d’utiliser la fonction class . Par exemple :

R> class(12.5)

[1] "numeric"

La rĂ©ponse "numeric" nous indique qu’il s’agit d’un nombre rĂ©el. Parfois, vous pourrez rencontrer le
terme "double" qui désigne également les nombres réels. Notez que R étant anglophone, la décimale
est indiquĂ©e avec un point ( . ) et non avec une virgule comme c’est l’usage en français.

Essayons avec un nombre entier :

– 72 –
Vecteurs, indexation et assignation

R> class(3)

[1] "numeric"

Sous R, lorsqu’on tape un nombre sans autre prĂ©cision, il est considĂ©rĂ© par dĂ©faut comme un nombre rĂ©el.
Pour indiquer spĂ©cifiquement qu’on veut un nombre entier, il faut rajouter le suffixe L :

R> class(3L)

[1] "integer"

Au quotidien, il arrive rarement d’avoir à utiliser ce suffixe, mais il est toujours bon de le connaütre au cas
oĂč vous le rencontriez dans des manuels ou des exemples de code.

Pour saisir une chaĂźne de caractĂšres, on aura recours aux doubles guillemets droits ( " ) :

R> class("abc")

[1] "character"

Il est Ă©galement possible d’utiliser des guillemets simples ( ' ), dĂšs lors qu’on utilise bien le mĂȘme type de
guillemets pour indiquer le début et la fin de la chaßne de caractÚres (par exemple 'abc' ).

Enfin, les valeurs logiques s’indiquent avec TRUE pour vrai et FALSE pour faux. Il est aussi possible
d’utiliser les raccourcis T et F . Attention Ă  bien utiliser les majuscules, R Ă©tant sensible Ă  la casse.

R> class(TRUE)

[1] "logical"

En résumé, les classes R des quatre types fondamentaux de vecteur sont :

Exemple Classe R Type

5L integer nombre entier

3.14 numeric nombre réel

"abcd" character chaĂźne de caractĂšres

TRUE logical booléenne

– 73 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

En plus des types de base, il existe de nombreuses autres classes de vecteurs dans R que nous aborderons
ultĂ©rieurement dans d’autres chapitres. Les plus courantes sont :

Classe R Type

factor facteur, page 122

labelled vecteur labellisé, page 127

Date date, page 293

POSIXct date et heure, page 293

Création

La fonction c
Pour créer un vecteur, on utilisera la fonction c , la lettre «c» étant un raccourci du mot anglais combine
puisque cette fonction permet de combiner des valeurs individuelles dans un vecteur unique. Il suffit de
lui passer la liste des valeurs Ă  combiner :

R> taille <- c(1.88, 1.65, 1.92, 1.76)


taille

[1] 1.88 1.65 1.92 1.76

R> class(taille)

[1] "numeric"

R> sexe <- c("h", "f", "h", "f")


sexe

[1] "h" "f" "h" "f"

– 74 –
Vecteurs, indexation et assignation

R> class(sexe)

[1] "character"

R> urbain <- c(TRUE, TRUE, FALSE, FALSE)


urbain

[1] TRUE TRUE FALSE FALSE

R> class(urbain)

[1] "logical"

Nous l’avons vu, toutes les valeurs d’un vecteur doivent obligatoirement ĂȘtre du mĂȘme type. DĂšs lors, si
on essaie de combiner des valeurs de différents types, R essaiera de les convertir au mieux. Par exemple :

R> x <- c(2L, 3.14, "a")


x

[1] "2" "3.14" "a"

R> class(x)

[1] "character"

Dans le cas présent, toutes les valeurs ont été converties en chaßnes de caractÚres.

La fonction rep
Dans certaines situations, on peut avoir besoin de crĂ©er un vecteur d’une certaine longueur mais dont
toutes les valeurs sont identiques. Cela se réalise facilement avec rep à qui on indiquera la valeur à
répéter puis le nombre de répétitions :

– 75 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> rep(2, 10)

[1] 2 2 2 2 2 2 2 2 2 2

On peut aussi lui indiquer plusieurs valeurs qui seront alors répétées en boucle :

R> rep(c("a", "b"), 3)

[1] "a" "b" "a" "b" "a" "b"

La fonction seq
Dans d’autres situations, on peut avoir besoin de crĂ©er un vecteur contenant une suite de valeurs, ce qui se
rĂ©alise aisĂ©ment avec seq Ă  qui on prĂ©cisera les arguments from (point de dĂ©part), to (point d’arrivĂ©e)
et by (pas). Quelques exemples valent mieux qu’un long discours :

R> seq(1, 10)

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

R> seq(5, 17, by = 2)

[1] 5 7 9 11 13 15 17

R> seq(10, 0)

[1] 10 9 8 7 6 5 4 3 2 1 0

R> seq(100, 10, by = -10)

[1] 100 90 80 70 60 50 40 30 20 10

– 76 –
Vecteurs, indexation et assignation

R> seq(1.23, 5.67, by = 0.33)

[1] 1.23 1.56 1.89 2.22 2.55 2.88 3.21 3.54 3.87 4.20 4.53
[12] 4.86 5.19 5.52

L’opĂ©rateur :
L’opĂ©rateur : est un raccourci de la fonction seq pour crĂ©er une suite de nombres entiers. Il s’utilise
ainsi :

R> 1:5

[1] 1 2 3 4 5

R> 24:32

[1] 24 25 26 27 28 29 30 31 32

R> 55:43

[1] 55 54 53 52 51 50 49 48 47 46 45 44 43

Nous verrons un peu plus loin que ce raccourci est fort pratique.

Longueur d’un vecteur


Un vecteur dispose donc d’une longueur qui correspond au nombre de valeurs qui le composent. Elle
s’obtient avec length :

R> length(taille)

[1] 4

– 77 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> length(c("a", "b"))

[1] 2

Il est possible de faire un vecteur de longueur nulle avec c() . Bien évidemment sa longueur est zéro.

R> length(c())

[1] 0

Quelques vecteurs remarquables


R fournit quelques vecteurs particuliers qui sont directement accessibles :

‱ LETTERS : les 26 lettres de l’alphabet en majuscules


‱ letters : les 26 lettres de l’alphabet en minuscules
‱ [Link] : les noms des 12 mois de l’annĂ©e en anglais
‱ [Link] : la version abrĂ©gĂ©e des 12 mois en anglais
‱ pi : la constante mathĂ©matique π

R> LETTERS

[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N"
[15] "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

R> letters

[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
[15] "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

R> length(letters)

[1] 26

– 78 –
Vecteurs, indexation et assignation

R> [Link]

[1] "January" "February" "March" "April"


[5] "May" "June" "July" "August"
[9] "September" "October" "November" "December"

R> [Link]

[1] "Jan" "Feb" "Mar" "Apr" "May" "Jun" "Jul" "Aug" "Sep"
[10] "Oct" "Nov" "Dec"

R> length([Link])

[1] 12

R> pi

[1] 3.141593

R> length(pi)

[1] 1

Combiner des vecteurs


Pour combiner des vecteurs, rien de plus simple. Il suffit d’utiliser c ! Les valeurs des diffĂ©rents vecteurs
seront mises bout à bout pour créer un unique vecteur.

R> x <- c(2, 1, 3, 4)


length(x)

[1] 4

– 79 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> y <- c(9, 1, 2, 6, 3, 0)


length(y)

[1] 6

R> z <- c(x, y)


z

[1] 2 1 3 4 9 1 2 6 3 0

R> length(z)

[1] 10

R> min_maj <- c(letters, LETTERS)


min_maj

[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
[15] "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z" "A" "B"
[29] "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P"
[43] "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

R> length(min_maj)

[1] 52

Valeurs manquantes
Lorsqu’on travaille avec des donnĂ©es d’enquĂȘte, il est frĂ©quent que certaines donnĂ©es soient manquantes,
en raison d’un refus du participant de rĂ©pondre Ă  une question donnĂ©e ou d’un oubli ou d’un
dysfonctionnement du matériel de mesure, etc.

Une valeur manquante s’indique sous R avec NA (pour not available). Cette valeur peut s’appliquer à
n’importe quel type de vecteur, qu’il soit numĂ©rique, textuel ou logique.

– 80 –
Vecteurs, indexation et assignation

R> taille <- c(1.88, NA, 1.65, 1.92, 1.76, NA)


sexe <- c("h", "f", NA, "h", NA, "f")

Les valeurs manquantes sont prises en compte dans le calcul de la longueur du vecteur.

R> length(taille)

[1] 6

Il ne faut pas confondre NA avec un autre objet qu’on rencontre sous R qui s’appelle NULL et qui
reprĂ©sente l’«objet vide». NULL ne contient absolument rien. La diffĂ©rence se comprend mieux lorsqu’on
essaie de combiner ces objets :

R> c(NULL, NULL, NULL)

NULL

R> length(c(NULL, NULL, NULL))

[1] 0

On peut combiner NULL avec NULL , du vide plus du vide renverra toujours du vide dont la dimension est
égale à zéro.

R> c(NA, NA, NA)

[1] NA NA NA

R> length(c(NA, NA, NA))

[1] 3

Par contre, un vecteur composĂ© de trois valeurs manquantes a une longueur de 3, mĂȘme si toutes ses
valeurs sont manquantes.

– 81 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Indexation par position


L’indexation est l’une des fonctionnalitĂ©s les plus puissantes mais aussi les plus difficiles Ă  maĂźtriser de R.
Il s’agit d’opĂ©rations permettant de sĂ©lectionner des sous-ensembles de valeurs en fonction de diffĂ©rents
critùres. Il existe trois types d’indexation : (i) l’indexation par position, (ii) l’indexation par nom et (iii)
l’indexation par condition. Le principe est toujours le mĂȘme : on indique entre crochets ( [] ) ce qu’on
souhaite garder ou non.

Pour rappel, les crochets s’obtiennent sur un clavier français de type PC en appuyant sur la touche
Alt Gr et la touche ( ou ) .

Commençons par l’indexation par position encore appelĂ©e indexation directe. Ce mode le plus simple
d’indexation consiste Ă  indiquer la position des Ă©lĂ©ments Ă  conserver.

Reprenons notre vecteur taille :

R> taille

[1] 1.88 NA 1.65 1.92 1.76 NA

Si on souhaite le premier élément du vecteur, on peut faire :

R> taille[1]

[1] 1.88

Si on souhaite les trois premiers éléments ou les éléments 2, 5 et 6 :

R> taille[1:3]

[1] 1.88 NA 1.65

R> taille[c(2, 5, 6)]

[1] NA 1.76 NA

Si on veut le dernier élément :

– 82 –
Vecteurs, indexation et assignation

R> taille[length(taille)]

[1] NA

Il est tout à fait possible de sélectionner les valeurs dans le désordre :

R> taille[c(5, 1, 4, 3)]

[1] 1.76 1.88 1.92 1.65

Dans le cadre de l’indexation par position, il est Ă©galement possible de spĂ©cifier des nombres nĂ©gatifs,
auquel cas cela signifiera «toutes les valeurs sauf celles-là». Par exemple :

R> taille[c(-1, -5)]

[1] NA 1.65 1.92 NA

À noter, si on indique une position au-delà de la longueur du vecteur, R renverra NA . Par exemple :

R> taille[23:25]

[1] NA NA NA

Des vecteurs nommés


Les diffĂ©rentes valeurs d’un vecteur peuvent ĂȘtre nommĂ©es. Une premiĂšre maniĂšre de nommer les
Ă©lĂ©ments d’un vecteur est de le faire Ă  sa crĂ©ation :

R> sexe <- c(Michel = "h", Anne = "f", Dominique = NA, Jean = "h", Claude = NA, M
arie = "f")

Lorsqu’on affiche le vecteur, la prĂ©sentation change quelque peu.

R> sexe

Michel Anne Dominique Jean Claude Marie


"h" "f" NA "h" NA "f"

– 83 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

La liste des noms s’obtient avec names .

R> names(sexe)

[1] "Michel" "Anne" "Dominique" "Jean"


[5] "Claude" "Marie"

Pour ajouter ou modifier les noms d’un vecteur, on doit attribuer un nouveau vecteur de noms :

R> names(sexe) <- c("Michael", "Anna", "Dom", "John", "Alex", "Mary")


sexe

Michael Anna Dom John Alex Mary


"h" "f" NA "h" NA "f"

Pour supprimer tous les noms, il y a la fonction unname :

R> anonyme <- unname(sexe)


anonyme

[1] "h" "f" NA "h" NA "f"

Indexation par nom


Lorsqu’un vecteur est nommĂ©, il est dĂšs lors possible d’accĂ©der Ă  ses valeurs Ă  partir de leur nom. Il s’agit
de l’indexation par nom.

R> sexe["Anna"]

Anna
"f"

R> sexe[c("Mary", "Michael", "John")]

Mary Michael John


"f" "h" "h"

Par contre il n’est pas possible d’utiliser l’opĂ©rateur - comme pour l’indexation directe. Pour exclure un

– 84 –
Vecteurs, indexation et assignation

Ă©lĂ©ment en fonction de son nom, on doit utiliser une autre forme d’indexation, l’indexation par condition,
expliquée dans la section suivante. On peut ainsi faire


R> sexe[names(sexe) != "Dom"]


 pour sĂ©lectionner tous les Ă©lĂ©ments sauf celui qui s’appelle «Dom».

Indexation par condition


L’indexation par condition consiste Ă  fournir un vecteur logique indiquant si chaque Ă©lĂ©ment doit ĂȘtre
inclus (si TRUE ) ou exclu (si FALSE ). Par exemple :

R> sexe

Michael Anna Dom John Alex Mary


"h" "f" NA "h" NA "f"

R> sexe[c(TRUE, FALSE, FALSE, TRUE, FALSE, FALSE)]

Michael John
"h" "h"

Écrire manuellement une telle condition n’est pas trùs pratique à l’usage. Mais supposons que nous ayons
également à notre disposition les deux vecteurs suivants, également de longueur 6.

R> urbain <- c(TRUE, FALSE, FALSE, FALSE, TRUE, TRUE)


poids <- c(80, 63, 75, 87, 82, 67)

Le vecteur urbain est un vecteur logique. On peut directement l’utiliser pour avoir le sexe des enquĂȘtĂ©s
habitant en milieu urbain :

R> sexe[urbain]

Michael Alex Mary


"h" NA "f"

Supposons qu’on souhaite maintenant avoir la taille des individus pesant 80 kilogrammes ou plus. Nous
pouvons effectuer une comparaison Ă  l’aide des opĂ©rateurs de comparaison suivants :

– 85 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Opérateur de comparaison Signification

== égal à

!= différent de

> strictement supérieur à

< strictement inférieur à

>= supérieur ou égal à

<= inférieur ou égal à

Voyons tout de suite un exemple :

R> poids >= 80

[1] TRUE FALSE FALSE TRUE TRUE FALSE

Que s’est-il passĂ© ? Nous avons fourni Ă  R une condition et il nous a renvoyĂ© un vecteur logique avec autant
d’élĂ©ments qu’il y a d’observations et dont la valeur est TRUE si la condition est remplie et FALSE dans
les autres cas. Nous pouvons alors utiliser ce vecteur logique pour obtenir la taille des participants pesant
80 kilogrammes ou plus :

R> taille[poids >= 80]

[1] 1.88 1.92 1.76

On peut combiner ou modifier des conditions Ă  l’aide des opĂ©rateurs logiques habituels :

Opérateur logique Signification

& et logique

| ou logique

! négation logique

Comment les utilise-t-on ? Voyons tout de suite un exemple. Supposons que je veuille identifier les
personnes pesant 80 kilogrammes ou plus et vivant en milieu urbain :

– 86 –
Vecteurs, indexation et assignation

R> poids >= 80 & urbain

[1] TRUE FALSE FALSE FALSE TRUE FALSE

Les résultats sont différents si je souhaite isoler les personnes pesant 80 kilogrammes ou plus ou vivant
milieu urbain :

R> poids >= 80 | urbain

[1] TRUE FALSE FALSE TRUE TRUE TRUE

Une remarque importante : quand l’un des termes d’une condition comporte une valeur manquante ( NA ),
le rĂ©sultat de cette condition n’est pas toujours TRUE ou FALSE , il peut aussi ĂȘtre Ă  son tour une valeur
manquante.

R> taille

[1] 1.88 NA 1.65 1.92 1.76 NA

R> taille > 1.8

[1] TRUE NA FALSE TRUE FALSE NA

On voit que le test NA > 1.8 ne renvoie ni vrai ni faux, mais NA .

Une autre consĂ©quence importante de ce comportement est qu’on ne peut pas utiliser l’opĂ©rateur
l’expression == NA pour tester la prĂ©sence de valeurs manquantes. On utilisera Ă  la place la fonction ad
hoc [Link] :

R> [Link](taille > 1.8)

[1] FALSE TRUE FALSE FALSE FALSE TRUE

Pour compliquer encore un peu le tout, lorsqu’on utilise une condition pour l’indexation, si la condition
renvoie NA , R ne sĂ©lectionne pas l’élĂ©ment mais retourne quand mĂȘme la valeur NA . Ceci a donc des
consĂ©quences sur le rĂ©sultat d’une indexation par comparaison.

Par exemple si je cherche Ă  connaĂźtre le poids des personnes mesurant 1,80 mĂštre ou plus :

– 87 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> taille

[1] 1.88 NA 1.65 1.92 1.76 NA

R> poids

[1] 80 63 75 87 82 67

R> poids[taille > 1.8]

[1] 80 NA 87 NA

Les Ă©lĂ©ments pour lesquels la taille n’est pas connue ont Ă©tĂ© transformĂ©s en NA , ce qui n’influera pas le
calcul d’une moyenne. Par contre, lorsqu’on utilisera assignation et indexation ensemble, cela peut crĂ©er
des problĂšmes. Il est donc prĂ©fĂ©rable lorsqu’on a des valeurs manquantes de les exclure ainsi :

R> poids[taille > 1.8 & ![Link](taille)]

[1] 80 87

Pour plus de détails sur les conditions et le calcul logique dans R, on pourra se référer au chapitre dédié,
page 1137.

Assignation par indexation


Dans tous les exemples prĂ©cĂ©dents, on a utilisĂ© l’indexation pour extraire une partie d’un vecteur, en
plaçant l’opĂ©ration d’indexation Ă  droite de l’opĂ©rateur <- .

Mais l’indexation peut Ă©galement ĂȘtre placĂ©e Ă  gauche de cet opĂ©rateur d’assignation. Dans ce cas, les
Ă©lĂ©ments sĂ©lectionnĂ©s par l’indexation sont alors remplacĂ©s par les valeurs indiquĂ©es Ă  droite de
l’opĂ©rateur <- .

Prenons donc un exemple simple :

– 88 –
Vecteurs, indexation et assignation

R> v <- 1:5


v

[1] 1 2 3 4 5

R> v[1] <- 3


v

[1] 3 2 3 4 5

Cette fois, au lieu d’utiliser quelque chose comme x <- v[1] , qui aurait placĂ© la valeur du premier
élément de v dans x , on a utilisé v[1] <- 3 , ce qui a mis à jour le premier élément de v avec la valeur
3. Ceci fonctionne Ă©galement pour les diffĂ©rents types d’indexation Ă©voquĂ©s prĂ©cĂ©demment :

R> sexe["Alex"] <- "f"

Enfin on peut modifier plusieurs Ă©lĂ©ments d’un seul coup soit en fournissant un vecteur, soit en profitant
du mécanisme de recyclage. Les deux commandes suivantes sont ainsi rigoureusement équivalentes :

R> sexe[c(1, 3, 4)] <- c("Homme", "Homme", "Homme")


sexe[c(1, 3, 4)] <- "Homme"

L’assignation par indexation peut aussi ĂȘtre utilisĂ©e pour ajouter une ou plusieurs valeurs Ă  un vecteur :

R> length(sexe)

[1] 6

R> sexe[7] <- "f"


sexe

Michael Anna Dom John Alex Mary


"Homme" "f" "Homme" "Homme" "f" "f" "f"

R> length(sexe)

[1] 7

– 89 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

On commence à voir comment l’utilisation de l’indexation par conditions et de l’assignation va nous


permettre de faire des recodages (que nous aborderons plus en détail dans un chapitre dédié, page 201).

En résumé
‱ Un vecteur est un objet unidimensionnel contenant une liste de valeurs qui sont toutes du mĂȘme
type (entiÚres, numériques, textuelles ou logiques).
‱ La fonction class permet de connaütre le type du vecteur et la fonction length sa longueur,
c’est-Ă -dire son nombre d’élĂ©ments.
‱ La fonction c sert Ă  crĂ©er et Ă  combiner des vecteurs.
‱ Les valeurs manquantes sont reprĂ©sentĂ©es avec NA .
‱ Un vecteur peut ĂȘtre nommĂ©, c’est-Ă -dire qu’un nom textuel a Ă©tĂ© associĂ© Ă  chaque Ă©lĂ©ment. Cela
peut se faire lors de sa création ou avec la fonction names .
‱ L’indexation consiste Ă  extraire certains Ă©lĂ©ments d’un vecteur. Pour cela, on indique ce qu’on
souhaite extraire entre crochets ( [] ) juste aprùs le nom du vecteur. Le type d’indexation
dĂ©pend du type d’information transmise.
‱ S’il s’agit de nombres entiers, c’est l’indexation par position : les nombres reprĂ©sentent la
position dans le vecteur des Ă©lĂ©ments qu’on souhaite extraire. Un nombre nĂ©gatif s’interprĂšte
comme «tous les éléments sauf celui-là».
‱ Si on indique des chaünes de caractùres, c’est l’indexation par nom : on indique le nom des
Ă©lĂ©ments qu’on souhaite extraire. Cette forme d’indexation ne fonctionne que si le vecteur est
nommé.
‱ Si on transmet des valeurs logiques, le plus souvent sous la forme d’une condition, c’est
l’indexation par condition : TRUE indique les Ă©lĂ©ments Ă  extraire et FALSE les Ă©lĂ©ments Ă 
exclure. Il faut ĂȘtre vigilant aux valeurs manquantes ( NA ) dans ce cas prĂ©cis.
‱ Enfin, il est possible de ne modifier que certains Ă©lĂ©ments d’un vecteur en ayant recours Ă  la fois
à l’indexation ( [] ) et à l’assignation ( <- ).

– 90 –
Listes et Tableaux de
données
Listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Propriétés et création . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Indexation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Tableaux de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Propriétés et création . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Indexation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Afficher les données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
En résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

GUIDE-R

Une version actualisée de ce chapitre est disponible sur guide-R : Listes & Tableaux de données

NOTE

Il est prĂ©fĂ©rable d’avoir dĂ©jĂ  lu le chapitre Vecteurs, indexation et assignation, page 71 avant d’aborder
celui-ci.

WEBIN-R

Ce chapitre est évoqué dans le webin-R #02 (les bases du langage R) sur YouTube.

– 91 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Listes
Par nature, les vecteurs ne peuvent contenir que des valeurs de mĂȘme type (numĂ©rique, textuel ou
logique). Or, on peut avoir besoin de reprĂ©senter des objets plus complexes composĂ©s d’élĂ©ments
disparates. C’est ce que permettent les listes.

Propriétés et création
Une liste se crée tout simplement avec la fonction list :

R> l1 <- list(1:5, "abc")


l1

[[1]]
[1] 1 2 3 4 5

[[2]]
[1] "abc"

Une liste est un ensemble d’objets, quels qu’ils soient, chaque Ă©lĂ©ment d’une liste pouvant avoir ses
propres dimensions. Dans notre exemple précédent, nous avons créé une liste l1 composée de deux
Ă©lĂ©ments : un vecteur d’entiers de longueur 5 et un vecteur textuel de longueur 1. La longueur d’une liste
correspond aux nombres d’élĂ©ments qu’elle contient et s’obtient avec length :

R> length(l1)

[1] 2

Comme les vecteurs, une liste peut ĂȘtre nommĂ©e et les noms des Ă©lĂ©ments d’une liste sont accessibles
avec names :

R> l2 <- list(minuscules = letters, majuscules = LETTERS, mois = [Link])


l2

$minuscules
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
[15] "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

– 92 –
Listes et Tableaux de données

$majuscules
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N"
[15] "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

$mois
[1] "January" "February" "March" "April"
[5] "May" "June" "July" "August"
[9] "September" "October" "November" "December"

R> length(l2)

[1] 3

R> names(l2)

[1] "minuscules" "majuscules" "mois"

Que se passe-t-il maintenant si on effectue la commande suivante ?

R> l <- list(l1, l2)

À votre avis, quelle est la longueur de cette nouvelle liste l ? 5 ?

R> length(l)

[1] 2

Eh bien non ! Elle est de longueur 2 car nous avons créé une liste composée de deux éléments qui sont
eux-mĂȘmes des listes. Cela est plus lisible si on fait appel Ă  la fonction str qui permet de visualiser la
structure d’un objet.

R> str(l)

List of 2
$ :List of 2
..$ : int [1:5] 1 2 3 4 5
..$ : chr "abc"
$ :List of 3
..$ minuscules: chr [1:26] "a" "b" "c" "d" ...

– 93 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

..$ majuscules: chr [1:26] "A" "B" "C" "D" ...


..$ mois : chr [1:12] "January" "February" "March" "April" ...

Une liste peut contenir tous types d’objets, y compris d’autres listes. Pour combiner les Ă©lĂ©ments d’une
liste, il faut utiliser la fonction append :

R> l <- append(l1, l2)


length(l)

[1] 5

R> str(l)

List of 5
$ : int [1:5] 1 2 3 4 5
$ : chr "abc"
$ minuscules: chr [1:26] "a" "b" "c" "d" ...
$ majuscules: chr [1:26] "A" "B" "C" "D" ...
$ mois : chr [1:12] "January" "February" "March" "April" ...

On peut noter en passant qu’une liste peut tout Ă  fait n’ĂȘtre que partiellement nommĂ©e.

Indexation
Les crochets simples ( [] ) fonctionnent comme pour les vecteurs. On peut utiliser à la fois l’indexation
par position, l’indexation par nom et l’indexation par condition.

R> l

[[1]]
[1] 1 2 3 4 5

[[2]]
[1] "abc"

$minuscules
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
[15] "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

$majuscules

– 94 –
Listes et Tableaux de données

[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N"
[15] "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

$mois
[1] "January" "February" "March" "April"
[5] "May" "June" "July" "August"
[9] "September" "October" "November" "December"

R> l[c(1, 3, 4)]

[[1]]
[1] 1 2 3 4 5

$minuscules
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
[15] "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

$majuscules
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N"
[15] "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

R> l[c("majuscules", "minuscules")]

$majuscules
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N"
[15] "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

$minuscules
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
[15] "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

R> l[c(TRUE, TRUE, FALSE, FALSE, TRUE)]

[[1]]
[1] 1 2 3 4 5

[[2]]
[1] "abc"

$mois
[1] "January" "February" "March" "April"

– 95 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

[5] "May" "June" "July" "August"


[9] "September" "October" "November" "December"

MĂȘme si on extrait un seul Ă©lĂ©ment, l’extraction obtenue avec les crochets simples renvoie toujours une
liste, ici composĂ©e d’un seul Ă©lĂ©ment :

R> str(l[1])

List of 1
$ : int [1:5] 1 2 3 4 5

Supposons que je souhaite calculer la moyenne des valeurs du premier élément de ma liste. Essayons la
commande suivante :

R> mean(l[1])

Warning in [Link](l[1]): l'argument n'est ni


numérique, ni logique : renvoi de NA

[1] NA

Nous obtenons un message d’erreur. En effet, R ne sait pas calculer une moyenne à partir d’une liste. Ce
qu’il lui faut, c’est un vecteur de valeurs numĂ©riques. Autrement dit, ce que nous cherchons Ă  obtenir c’est
le contenu mĂȘme du premier Ă©lĂ©ment de notre liste et non une liste Ă  un seul Ă©lĂ©ment.

C’est ici que les doubles crochets ( [[]] ) vont rentrer en jeu. Pour ces derniers, nous pourrons utiliser
l’indexation par position ou l’indexation par nom, mais pas l’indexation par condition. De plus, le critùre
qu’on indiquera doit indiquer un et un seul Ă©lĂ©ment de notre liste. Au lieu de renvoyer une liste Ă  un
Ă©lĂ©ment, les doubles crochets vont renvoyer l’élĂ©ment dĂ©signĂ©. Vite, un exemple :

R> str(l[1])

List of 1
$ : int [1:5] 1 2 3 4 5

R> str(l[[1]])

int [1:5] 1 2 3 4 5

Maintenant, nous pouvons calculer notre moyenne :

– 96 –
Listes et Tableaux de données

R> mean(l[[1]])

[1] 3

Nous pouvons aussi tester l’indexation par nom.

R> l[["mois"]]

[1] "January" "February" "March" "April"


[5] "May" "June" "July" "August"
[9] "September" "October" "November" "December"

Mais il faut avouer que cette écriture avec doubles crochets et guillemets est un peu lourde.
Heureusement, un nouvel acteur entre en scùne : le symbole dollar ( $ ). C’est un raccourci des doubles
crochets pour l’indexation par nom qu’on utilise ainsi :

R> l$mois

[1] "January" "February" "March" "April"


[5] "May" "June" "July" "August"
[9] "September" "October" "November" "December"

Les écritures l$mois et l[["mois"]] sont équivalentes. Attention ! Cela ne fonctionne que pour
l’indexation par nom.

R> l$1

Error: unexpected numeric constant in "l$1"

L’assignation par indexation fonctionne Ă©galement avec les doubles crochets ou le signe dollar :

R> l[[2]] <- list(c("un", "vecteur", "textuel"))


l$mois <- c("Janvier", "Février", "Mars")
l

[[1]]
[1] 1 2 3 4 5

[[2]]
[[2]][[1]]

– 97 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

[1] "un" "vecteur" "textuel"

$minuscules
[1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n"
[15] "o" "p" "q" "r" "s" "t" "u" "v" "w" "x" "y" "z"

$majuscules
[1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N"
[15] "O" "P" "Q" "R" "S" "T" "U" "V" "W" "X" "Y" "Z"

$mois
[1] "Janvier" "Février" "Mars"

Tableaux de données
Il y a un type d’objets que nous avons dĂ©jĂ  abordĂ© dans le chapitre Premier travail avec les donnĂ©es,
page 35, il s’agit du tableau de donnĂ©es ou data frame en anglais.

Propriétés et création
Dans R, les tableaux de données sont tout simplement des listes avec quelques propriétés spécifiques :

‱ les tableaux de donnĂ©es ne peuvent contenir que des vecteurs ;


‱ tous les vecteurs d’un tableau de donnĂ©es ont la mĂȘme longueur ;
‱ tous les Ă©lĂ©ments d’un tableau de donnĂ©es sont nommĂ©s et ont chacun un nom unique.

DĂšs lors, un tableau de donnĂ©es correspond aux fichiers de donnĂ©es qu’on a l’habitude de manipuler dans
d’autres logiciels de statistiques comme SPSS ou Stata. Les variables sont organisĂ©es en colonnes et les
observations en lignes.

On peut créer un tableau de données avec la fonction [Link] :

R> df <- [Link](


sexe = c("f", "f", "h", "h"),
age = c(52, 31, 29, 35),
blond = c(FALSE, TRUE, TRUE, FALSE)
)
df

– 98 –
Listes et Tableaux de données

R> str(df)

'[Link]': 4 obs. of 3 variables:


$ sexe : chr "f" "f" "h" "h"
$ age : num 52 31 29 35
$ blond: logi FALSE TRUE TRUE FALSE

NOTE

Historiquement, la fonction [Link] avait un gros dĂ©faut : si on ne dĂ©sactivait pas l’option


stringsAsFactors elle transformait les chaĂźnes de caractĂšres, ici la variable sexe en facteurs (un
type de vecteur que nous aborderons plus en détail dans un prochain chapitre, page 121).

Depuis la version 4.0.0, l’option stringsAsFactors vaut maintenant FALSE par dĂ©faut.

R> df <- [Link](


sexe = c("f", "f", "h", "h"),
age = c(52, 31, 29, 35),
blond = c(FALSE, TRUE, TRUE, FALSE),
stringsAsFactors = FALSE
)
df

R> str(df)

'[Link]': 4 obs. of 3 variables:


$ sexe : chr "f" "f" "h" "h"
$ age : num 52 31 29 35
$ blond: logi FALSE TRUE TRUE FALSE

Un tableau de donnĂ©es Ă©tant une liste, la fonction length renverra le nombre d’élĂ©ments de la liste, donc
dans le cas présent le nombre de variables, et names leurs noms :

R> length(df)

[1] 3

– 99 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> names(df)

[1] "sexe" "age" "blond"

Comme tous les Ă©lĂ©ments d’un tableau de donnĂ©es ont la mĂȘme longueur, cet objet peut ĂȘtre vu comme
bidimensionnel. Les fonctions nrow , ncol et dim donnent respectivement le nombre de lignes, le
nombre de colonnes et les dimensions de notre tableau.

R> nrow(df)

[1] 4

R> ncol(df)

[1] 3

R> dim(df)

[1] 4 3

De plus, tout comme les colonnes ont un nom, il est aussi possible de nommer les lignes avec [Link] :

R> [Link](df) <- c("Anna", "Mary-Ann", "Michael", "John")


df

Indexation
Les tableaux de données étant des listes, nous pouvons donc utiliser les crochets simples ( [] ), les
crochets doubles ( [[]] ) et le symbole dollar ( $ ) pour extraire des parties de notre tableau, de la mĂȘme
maniùre que pour n’importe quelle liste.

R> df[1]

– 100 –
Listes et Tableaux de données

R> df[[1]]

[1] "f" "f" "h" "h"

R> df$sexe

[1] "f" "f" "h" "h"

Cependant, un tableau de donnĂ©es Ă©tant un objet bidimensionnel, il est Ă©galement possible d’extraire des
données sur deux dimensions, à savoir un premier critÚre portant sur les lignes et un second portant sur
les colonnes. Pour cela, nous utiliserons les crochets simples ( [] ) en séparant nos deux critÚres par une
virgule ( , ).

Un premier exemple :

R> df

R> df[3, 2]

[1] 29

Cette premiĂšre commande indique que nous souhaitons la troisiĂšme ligne de la seconde colonne,
autrement dit l’ñge de Michael. Le mĂȘme rĂ©sultat peut ĂȘtre obtenu avec l’indexation par nom, l’indexation
par condition, ou un mélange de tout ça.

R> df["Michael", "age"]

[1] 29

R> df[c(F, F, T, F), c(F, T, F)]

[1] 29

R> df[3, "age"]

[1] 29

– 101 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> df["Michael", 2]

[1] 29

Il est également possible de préciser un seul critÚre. Par exemple, si je souhaite les deux premiÚres
observations, ou les variables sexe et blond :

R> df[1:2, ]

R> df[, c("sexe", "blond")]

Il a suffi de laisser un espace vide avant ou aprÚs la virgule. ATTENTION ! Il est cependant impératif de
laisser la virgule pour indiquer à R qu’on souhaite effectuer une indexation à deux dimensions. Si on oublie
la virgule, cela nous ramĂšne au mode de fonctionnement des listes. Et le rĂ©sultat n’est pas forcĂ©ment le
mĂȘme :

R> df[2, ]

R> df[, 2]

[1] 52 31 29 35

R> df[2]

– 102 –
Listes et Tableaux de données

NOTE

Au passage, on pourra noter quelques subtilités sur le résultat renvoyé.

R> str(df[2, ])

'[Link]': 1 obs. of 3 variables:


$ sexe : chr "f"
$ age : num 31
$ blond: logi TRUE

R> str(df[, 2])

num [1:4] 52 31 29 35

R> str(df[2])

'[Link]': 4 obs. of 1 variable:


$ age: num 52 31 29 35

R> str(df[[2]])

num [1:4] 52 31 29 35

df[2, ] signifie qu’on veut toutes les variables pour le second individu. Le rĂ©sultat est un tableau de
donnĂ©es Ă  une ligne et trois colonnes. df[2] correspond au mode d’extraction des listes et renvoie
donc une liste Ă  un Ă©lĂ©ment, en l’occurrence un tableau de donnĂ©es Ă  quatre observations et une
variable. df[[2]] quant à lui renvoie le contenu de cette variable, soit un vecteur numérique de
longueur quatre. Reste df[, 2] qui renvoie toutes les observations pour la seconde colonne. Or
l’indexation bidimensionnelle a un fonctionnement un peu particulier : par dĂ©faut elle renvoie un
tableau de donnĂ©es mais s’il y a une seule variable dans l’extraction, c’est un vecteur qui est renvoyĂ©.
Pour plus de dĂ©tails, on pourra consulter l’entrĂ©e d’aide de [.[Link] .

Afficher les données


Prenons un tableau de donnĂ©es un peu plus consĂ©quent, en l’occurrence un jeu de donnĂ©es disponible

– 103 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

dans l’extension questionr et correspondant Ă  un extrait de l’enquĂȘte Histoire de vie rĂ©alisĂ©e par l’INSEE en
2003. Il contient 2000 individus et 20 variables.

R> library(questionr)
data(hdv2003)
d <- hdv2003

Si on demande d’afficher l’objet d dans la console (rĂ©sultat non reproduit ici), R va afficher l’ensemble du
contenu de d Ă  l’écran ce qui, sur un tableau de cette taille, ne sera pas trĂšs lisible. Pour une exploration
visuelle, le plus simple est souvent d’utiliser la visionneuse intĂ©grĂ©e Ă  RStudio et qu’on peut appeler avec
la fonction View .

R> View(d)

Les fonctions head et tail , qui marchent Ă©galement sur les vecteurs, permettent d’afficher seulement
les premiĂšres (respectivement les derniĂšres) lignes d’un tableau de donnĂ©es :

R> head(d)

R> tail(d, 2)

L’extension dplyr, que nous n’aborderons en dĂ©tails que plus tard, page 241, propose une fonction
glimpse (ce qui signifie «aperçu» en anglais) qui permet de visualiser rapidement et de maniÚre
condensĂ©e le contenu d’un tableau de donnĂ©es.

R> library(dplyr)
glimpse(d)

Rows: 2,000
Columns: 20
$ id <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1

$ age <int> 28, 23, 59, 34, 71, 35, 60, 47, 20, 

$ sexe <fct> Femme, Femme, Homme, Homme, Femme, F

$ nivetud <fct> "Enseignement superieur y compris te

$ poids <dbl> 2634.3982, 9738.3958, 3994.1025, 573

$ occup <fct> "Exerce une profession", "Etudiant, 

$ qualif <fct> Employe, NA, Technicien, Technicien,

$ [Link] <int> 8, 2, 2, 1, 0, 5, 1, 5, 4, 2, 3, 4, 

$ clso <fct> Oui, Oui, Non, Non, Oui, Non, Oui, N

$ relig <fct> Ni croyance ni appartenance, Ni croy

$ [Link] <fct> Peu important, NA, Aussi important q

$ [Link] <fct> Insatisfaction, NA, Equilibre, Satis

$ [Link] <fct> Non, Non, Non, Non, Non, Non, Non, N


– 104 –
Listes et Tableaux de données

$ [Link] <fct> Non, Non, Non, Non, Non, Non, Non, N



$ [Link] <fct> Non, Non, Non, Non, Non, Non, Oui, O

$ cuisine <fct> Oui, Non, Non, Oui, Non, Non, Oui, O

$ bricol <fct> Non, Non, Non, Oui, Non, Non, Non, O

$ cinema <fct> Non, Oui, Non, Oui, Non, Oui, Non, N

$ sport <fct> Non, Oui, Oui, Oui, Non, Oui, Non, N

$ [Link] <dbl> 0.0, 1.0, 0.0, 2.0, 3.0, 2.0, 2.9, 1


L’extension labelled propose une fonction look_for qui permet de lister les diffĂ©rentes variables d’un
fichier de données :

R> library(labelled)
look_for(d)

pos variable label col_type values

<chr> <chr> <chr> <chr> <chr>

1 id — int range: 1 - 2000

2 age — int range: 18 - 97

3 sexe — fct Homme

Femme

4 nivetud — fct N'a jamais fait d'etudes

A arrete ses etudes, avant la derniere annee


d'etudes primaires
Derniere annee d'etudes primaires

1er cycle

2eme cycle

Enseignement technique ou professionnel court

Enseignement technique ou professionnel long

Enseignement superieur y compris technique su


perieur
5 poids — dbl range: 78.0783403 - 31092.14132

6 occup — fct Exerce une profession

– 105 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Chomeur

Etudiant, eleve

Retraite

Retire des affaires

Au foyer

Autre inactif

7 qualif — fct Ouvrier specialise

Ouvrier qualifie

Technicien

Profession intermediaire

Cadre

Employe

Autre

8 [Link] — int range: 0 - 22

9 clso — fct Oui

Non

Ne sait pas

10 relig — fct Pratiquant regulier

Pratiquant occasionnel

Appartenance sans pratique

Ni croyance ni appartenance

Rejet

NSP ou NVPR

– 106 –
Listes et Tableaux de données

11 [Link] — fct Le plus important

Aussi important que le reste

Moins important que le reste

Peu important

12 [Link] — fct Satisfaction

Insatisfaction

Equilibre

13 [Link] — fct Non

Oui

14 [Link] — fct Non

Oui

15 [Link] — fct Non

Oui

16 cuisine — fct Non

Oui

17 bricol — fct Non

Oui

18 cinema — fct Non

Oui

19 sport — fct Non

Oui

20 [Link] — dbl range: 0 - 12

Lorsqu’on a un gros tableau de donnĂ©es avec de nombreuses variables, il peut ĂȘtre difficile de retrouver la
ou les variables d’intĂ©rĂȘt. Il est possible d’indiquer Ă  look_for un mot-clĂ© pour limiter la recherche. Par
exemple :

– 107 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> look_for(d, "trav")

pos variable label col_type values


<chr> <chr> <chr> <chr> <chr>
11 [Link] — fct Le plus important
Aussi important que le reste
Moins important que le reste
Peu important
12 [Link] — fct Satisfaction
Insatisfaction
Equilibre

Il est à noter que si la recherche n’est pas sensible à la casse (i.e. aux majuscules et aux minuscules), elle est
sensible aux accents.

La mĂ©thode summary qui fonctionne sur tout type d’objet permet d’avoir quelques statistiques de base
sur les différentes variables de notre tableau, les statistiques affichées dépendant du type de variable.

R> summary(d)

id age sexe
Min. : 1.0 Min. :18.00 Homme: 899
1st Qu.: 500.8 1st Qu.:35.00 Femme:1101
Median :1000.5 Median :48.00
Mean :1000.5 Mean :48.16
3rd Qu.:1500.2 3rd Qu.:60.00
Max. :2000.0 Max. :97.00

nivetud
Enseignement technique ou professionnel court :463
Enseignement superieur y compris technique superieur:441
Derniere annee d'etudes primaires :341
1er cycle :204
2eme cycle :183
(Other) :256
NA's :112
poids occup
Min. : 78.08 Exerce une profession:1049
1st Qu.: 2221.82 Chomeur : 134
Median : 4631.19 Etudiant, eleve : 94
Mean : 5535.61 Retraite : 392
3rd Qu.: 7626.53 Retire des affaires : 77
Max. :31092.14 Au foyer : 171
Autre inactif : 83

– 108 –
Listes et Tableaux de données

qualif [Link]
Employe :594 Min. : 0.000
Ouvrier qualifie :292 1st Qu.: 1.000
Cadre :260 Median : 2.000
Ouvrier specialise :203 Mean : 3.283
Profession intermediaire:160 3rd Qu.: 5.000
(Other) :144 Max. :22.000
NA's :347
clso relig
Oui : 936 Pratiquant regulier :266
Non :1037 Pratiquant occasionnel :442
Ne sait pas: 27 Appartenance sans pratique :760
Ni croyance ni appartenance:399
Rejet : 93
NSP ou NVPR : 40

[Link] [Link]
Le plus important : 29 Satisfaction :480
Aussi important que le reste:259 Insatisfaction:117
Moins important que le reste:708 Equilibre :451
Peu important : 52 NA's :952
NA's :952

[Link] [Link] [Link] cuisine bricol


Non:1986 Non:1953 Non:1776 Non:1119 Non:1147
Oui: 14 Oui: 47 Oui: 224 Oui: 881 Oui: 853

cinema sport [Link]


Non:1174 Non:1277 Min. : 0.000
Oui: 826 Oui: 723 1st Qu.: 1.000
Median : 2.000
Mean : 2.247
3rd Qu.: 3.000
Max. :12.000
NA's :5

On peut également appliquer summary à une variable particuliÚre.

– 109 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> summary(d$sexe)

Homme Femme
899 1101

R> summary(d$age)

Min. 1st Qu. Median Mean 3rd Qu. Max.


18.00 35.00 48.00 48.16 60.00 97.00

L’extension questionr fournit Ă©galement une fonction bien pratique pour dĂ©crire les diffĂ©rentes variables
d’un tableau de donnĂ©es. Il s’agit de describe . Faisons de suite un essai :

R> describe(d)

20 Variables 2000 Observations


------------------------------------------------------------
id
n missing distinct Info Mean Gmd
2000 0 2000 1 1000 667
.05 .10 .25 .50 .75 .90
101.0 200.9 500.8 1000.5 1500.2 1800.1
.95
1900.0

lowest : 1 2 3 4 5, highest: 1996 1997 1998 1999 2000


------------------------------------------------------------
age
n missing distinct Info Mean Gmd
2000 0 78 1 48.16 19.4
.05 .10 .25 .50 .75 .90
22 26 35 48 60 72
.95
77

lowest : 18 19 20 21 22, highest: 91 92 93 96 97


------------------------------------------------------------
sexe
n missing distinct
2000 0 2

– 110 –
Listes et Tableaux de données

Value Homme Femme


Frequency 899 1101
Proportion 0.45 0.55
------------------------------------------------------------
nivetud
n missing distinct
1888 112 8

lowest : N'a jamais fait d'etudes A arret


e ses etudes, avant la derniere annee d'etudes primaires Derniere annee d'etudes
primaires 1er cycle
2eme cycle

highest: 1er cycle 2eme cy


cle Enseignement technique
ou professionnel court Enseignement technique ou professionnel
long Enseignement superieur y compris technique superieur

------------------------------------------------------------
poids
n missing distinct Info Mean Gmd
2000 0 1877 1 5536 4553
.05 .10 .25 .50 .75 .90
799.8 1161.7 2221.8 4631.2 7626.5 10819.0
.95
13647.9

lowest : 78.07834 92.68033 92.93637 127.90122 153.01026


highest: 27195.83782 29548.78954 29570.78696 29657.94035 31092.14132
------------------------------------------------------------
occup
n missing distinct
2000 0 7

lowest : Exerce une profession Chomeur Etudiant, eleve Retra


ite Retire des affaires
highest: Etudiant, eleve Retraite Retire des affaires Au fo
yer Autre inactif

Exerce une profession (1049, 0.524), Chomeur (134, 0.067),


Etudiant, eleve (94, 0.047), Retraite (392, 0.196), Retire
des affaires (77, 0.038), Au foyer (171, 0.086), Autre
inactif (83, 0.042)
------------------------------------------------------------
qualif
n missing distinct

– 111 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

1653 347 7

lowest : Ouvrier specialise Ouvrier qualifie Technicien


Profession intermediaire Cadre
highest: Technicien Profession intermediaire Cadre
Employe Autre

Ouvrier specialise (203, 0.123), Ouvrier qualifie (292,


0.177), Technicien (86, 0.052), Profession intermediaire
(160, 0.097), Cadre (260, 0.157), Employe (594, 0.359),
Autre (58, 0.035)
------------------------------------------------------------
[Link]
n missing distinct Info Mean Gmd
2000 0 19 0.977 3.283 2.87
.05 .10 .25 .50 .75 .90
0 1 1 2 5 7
.95
9

lowest : 0 1 2 3 4, highest: 14 15 16 18 22

0 (167, 0.084), 1 (407, 0.203), 2 (427, 0.214), 3 (284,


0.142), 4 (210, 0.105), 5 (151, 0.076), 6 (99, 0.050), 7
(94, 0.047), 8 (52, 0.026), 9 (37, 0.018), 10 (21, 0.011),
11 (21, 0.011), 12 (8, 0.004), 13 (10, 0.005), 14 (4,
0.002), 15 (4, 0.002), 16 (1, 0.000), 18 (2, 0.001), 22 (1,
0.000)
------------------------------------------------------------
clso
n missing distinct
2000 0 3

Value Oui Non Ne sait pas


Frequency 936 1037 27
Proportion 0.468 0.518 0.014
------------------------------------------------------------
relig
n missing distinct
2000 0 6

lowest : Pratiquant regulier Pratiquant occasionnel Appartenance sa


ns pratique Ni croyance ni appartenance Rejet
highest: Pratiquant occasionnel Appartenance sans pratique Ni croyance ni
appartenance Rejet NSP ou NVPR

Pratiquant regulier (266, 0.133), Pratiquant occasionnel

– 112 –
Listes et Tableaux de données

(442, 0.221), Appartenance sans pratique (760, 0.380), Ni


croyance ni appartenance (399, 0.200), Rejet (93, 0.046),
NSP ou NVPR (40, 0.020)
------------------------------------------------------------
[Link]
n missing distinct
1048 952 4

Le plus important (29, 0.028), Aussi important que le reste


(259, 0.247), Moins important que le reste (708, 0.676),
Peu important (52, 0.050)
------------------------------------------------------------
[Link]
n missing distinct
1048 952 3

Value Satisfaction Insatisfaction Equilibre


Frequency 480 117 451
Proportion 0.458 0.112 0.430
------------------------------------------------------------
[Link]
n missing distinct
2000 0 2

Value Non Oui


Frequency 1986 14
Proportion 0.993 0.007
------------------------------------------------------------
[Link]
n missing distinct
2000 0 2

Value Non Oui


Frequency 1953 47
Proportion 0.977 0.024
------------------------------------------------------------
[Link]
n missing distinct
2000 0 2

Value Non Oui


Frequency 1776 224
Proportion 0.888 0.112
------------------------------------------------------------
cuisine
n missing distinct
2000 0 2

– 113 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Value Non Oui


Frequency 1119 881
Proportion 0.559 0.440
------------------------------------------------------------
bricol
n missing distinct
2000 0 2

Value Non Oui


Frequency 1147 853
Proportion 0.574 0.426
------------------------------------------------------------
cinema
n missing distinct
2000 0 2

Value Non Oui


Frequency 1174 826
Proportion 0.587 0.413
------------------------------------------------------------
sport
n missing distinct
2000 0 2

Value Non Oui


Frequency 1277 723
Proportion 0.638 0.362
------------------------------------------------------------
[Link]
n missing distinct Info Mean Gmd
1995 5 29 0.972 2.247 1.877
.05 .10 .25 .50 .75 .90
0 0 1 2 3 4
.95
5

lowest : 0.0 0.1 0.2 0.3 0.4, highest: 8.0 9.0 10.0 11.0 12.0
------------------------------------------------------------

Comme on le voit sur cet exemple, describe nous affiche le type des variables, les premiĂšres valeurs de
chacune, le nombre de valeurs manquantes, le nombre de valeurs différentes (uniques) ainsi que quelques
autres informations suivant le type de variables.

Il est possible de restreindre l’affichage à seulement quelques variables en indiquant le nom de ces
derniĂšres.

– 114 –
Listes et Tableaux de données

R> describe(d, c("age", "[Link]"))

age [Link]

20 Variables 2000 Observations


------------------------------------------------------------
id
n missing distinct Info Mean Gmd
2000 0 2000 1 1000 667
.05 .10 .25 .50 .75 .90
101.0 200.9 500.8 1000.5 1500.2 1800.1
.95
1900.0

lowest : 1 2 3 4 5, highest: 1996 1997 1998 1999 2000


------------------------------------------------------------
age
n missing distinct Info Mean Gmd
2000 0 78 1 48.16 19.4
.05 .10 .25 .50 .75 .90
22 26 35 48 60 72
.95
77

lowest : 18 19 20 21 22, highest: 91 92 93 96 97


------------------------------------------------------------
sexe
n missing distinct
2000 0 2

Value Homme Femme


Frequency 899 1101
Proportion 0.45 0.55
------------------------------------------------------------
nivetud
n missing distinct
1888 112 8

lowest : N'a jamais fait d'etudes A arret


e ses etudes, avant la derniere annee d'etudes primaires Derniere annee d'etudes
primaires 1er cycle
2eme cycle

highest: 1er cycle 2eme cy


cle Enseignement technique
ou professionnel court Enseignement technique ou professionnel

– 115 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

long Enseignement superieur y compris technique superieur

------------------------------------------------------------
poids
n missing distinct Info Mean Gmd
2000 0 1877 1 5536 4553
.05 .10 .25 .50 .75 .90
799.8 1161.7 2221.8 4631.2 7626.5 10819.0
.95
13647.9

lowest : 78.07834 92.68033 92.93637 127.90122 153.01026


highest: 27195.83782 29548.78954 29570.78696 29657.94035 31092.14132
------------------------------------------------------------
occup
n missing distinct
2000 0 7

lowest : Exerce une profession Chomeur Etudiant, eleve Retra


ite Retire des affaires
highest: Etudiant, eleve Retraite Retire des affaires Au fo
yer Autre inactif

Exerce une profession (1049, 0.524), Chomeur (134, 0.067),


Etudiant, eleve (94, 0.047), Retraite (392, 0.196), Retire
des affaires (77, 0.038), Au foyer (171, 0.086), Autre
inactif (83, 0.042)
------------------------------------------------------------
qualif
n missing distinct
1653 347 7

lowest : Ouvrier specialise Ouvrier qualifie Technicien


Profession intermediaire Cadre
highest: Technicien Profession intermediaire Cadre
Employe Autre

Ouvrier specialise (203, 0.123), Ouvrier qualifie (292,


0.177), Technicien (86, 0.052), Profession intermediaire
(160, 0.097), Cadre (260, 0.157), Employe (594, 0.359),
Autre (58, 0.035)
------------------------------------------------------------
[Link]
n missing distinct Info Mean Gmd
2000 0 19 0.977 3.283 2.87
.05 .10 .25 .50 .75 .90
0 1 1 2 5 7

– 116 –
Listes et Tableaux de données

.95
9

lowest : 0 1 2 3 4, highest: 14 15 16 18 22

0 (167, 0.084), 1 (407, 0.203), 2 (427, 0.214), 3 (284,


0.142), 4 (210, 0.105), 5 (151, 0.076), 6 (99, 0.050), 7
(94, 0.047), 8 (52, 0.026), 9 (37, 0.018), 10 (21, 0.011),
11 (21, 0.011), 12 (8, 0.004), 13 (10, 0.005), 14 (4,
0.002), 15 (4, 0.002), 16 (1, 0.000), 18 (2, 0.001), 22 (1,
0.000)
------------------------------------------------------------
clso
n missing distinct
2000 0 3

Value Oui Non Ne sait pas


Frequency 936 1037 27
Proportion 0.468 0.518 0.014
------------------------------------------------------------
relig
n missing distinct
2000 0 6

lowest : Pratiquant regulier Pratiquant occasionnel Appartenance sa


ns pratique Ni croyance ni appartenance Rejet
highest: Pratiquant occasionnel Appartenance sans pratique Ni croyance ni
appartenance Rejet NSP ou NVPR

Pratiquant regulier (266, 0.133), Pratiquant occasionnel


(442, 0.221), Appartenance sans pratique (760, 0.380), Ni
croyance ni appartenance (399, 0.200), Rejet (93, 0.046),
NSP ou NVPR (40, 0.020)
------------------------------------------------------------
[Link]
n missing distinct
1048 952 4

Le plus important (29, 0.028), Aussi important que le reste


(259, 0.247), Moins important que le reste (708, 0.676),
Peu important (52, 0.050)
------------------------------------------------------------
[Link]
n missing distinct
1048 952 3

Value Satisfaction Insatisfaction Equilibre

– 117 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Frequency 480 117 451


Proportion 0.458 0.112 0.430
------------------------------------------------------------
[Link]
n missing distinct
2000 0 2

Value Non Oui


Frequency 1986 14
Proportion 0.993 0.007
------------------------------------------------------------
[Link]
n missing distinct
2000 0 2

Value Non Oui


Frequency 1953 47
Proportion 0.977 0.024
------------------------------------------------------------
[Link]
n missing distinct
2000 0 2

Value Non Oui


Frequency 1776 224
Proportion 0.888 0.112
------------------------------------------------------------
cuisine
n missing distinct
2000 0 2

Value Non Oui


Frequency 1119 881
Proportion 0.559 0.440
------------------------------------------------------------
bricol
n missing distinct
2000 0 2

Value Non Oui


Frequency 1147 853
Proportion 0.574 0.426
------------------------------------------------------------
cinema
n missing distinct
2000 0 2

– 118 –
Listes et Tableaux de données

Value Non Oui


Frequency 1174 826
Proportion 0.587 0.413
------------------------------------------------------------
sport
n missing distinct
2000 0 2

Value Non Oui


Frequency 1277 723
Proportion 0.638 0.362
------------------------------------------------------------
[Link]
n missing distinct Info Mean Gmd
1995 5 29 0.972 2.247 1.877
.05 .10 .25 .50 .75 .90
0 0 1 2 3 4
.95
5

lowest : 0.0 0.1 0.2 0.3 0.4, highest: 8.0 9.0 10.0 11.0 12.0
------------------------------------------------------------

On peut également transmettre juste une variable :

R> describe(d$sexe)

d$sexe
n missing distinct
2000 0 2

Value Homme Femme


Frequency 899 1101
Proportion 0.45 0.55

En résumé
Les Listes

‱ Les listes sont des objets unidimensionnels pouvant contenir tout type d’objet, y compris
d’autres listes.
‱ Elles ont une longueur qu’on obtient avec length .
‱ On crĂ©e une liste avec list et on peut fusionner des listes avec append .

– 119 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

‱ Tout comme les vecteurs, les listes peuvent ĂȘtre nommĂ©es et les noms des Ă©lĂ©ments s’obtiennent
avec names .
‱ Les crochets simples ( [] ) permettent de sĂ©lectionner les Ă©lĂ©ments d’une liste, en utilisant
l’indexation par position, l’indexation par nom ou l’indexation par condition. Cela renvoie
toujours une autre liste.
‱ Les doubles crochets ( [[]] ) renvoient directement le contenu d’un Ă©lĂ©ment de la liste qu’on
aura sélectionné par position ou par nom.
‱ Le symbole $ est un raccourci pour facilement sĂ©lectionner un Ă©lĂ©ment par son nom,
liste$nom étant équivalent à liste[["nom"]] .

Les Tableaux de données

‱ Les tableaux de donnĂ©es sont des listes avec des propriĂ©tĂ©s particuliĂšres :
i. tous les éléments sont des vecteurs ;
ii. tous les vecteurs ont la mĂȘme longueur ;
iii. tous les vecteurs ont un nom et ce nom est unique.
‱ On peut crĂ©er un tableau de donnĂ©es avec [Link] .
‱ Les tableaux de donnĂ©es correspondent aux fichiers de donnĂ©es qu’on utilise usuellement dans
d’autres logiciels de statistiques : les variables sont reprĂ©sentĂ©es en colonnes et les observations
en lignes.
‱ Ce sont des objets bidimensionnels : ncol renvoie le nombre de colonnes et nrow le nombre
de lignes.
‱ Les doubles crochets ( [[]] ) et le symbole dollar ( $ ) fonctionnent comme pour les listes et
permettent d’accĂ©der aux variables.
‱ Il est possible d’utiliser des coordonnĂ©es bidimensionnelles avec les crochets simples ( [] ) en
indiquant un critÚre sur les lignes puis un critÚre sur les colonnes, séparés par une virgule ( , ).

– 120 –
Facteurs et vecteurs
labellisés
Facteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Vecteurs labellisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Les étiquettes de variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Les étiquettes de valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Assignation et condition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Quelques fonctions supplémentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138

GUIDE-R

Une version actualisĂ©e de ce chapitre est disponible sur guide-R : Facteurs et forcats, Étiquettes de
variables, Étiquettes de valeurs & Valeurs manquantes

WEBIN-R

Ce chapitre est évoqué dans le webin-R #02 (les bases du langage R) sur YouTube.

Dans le chapire sur les vecteurs, page 71, nous avons abordé les types fondementaux de vecteurs
(numériques, textuels, logiques). Mais il existe de nombreux autres classes de vecteurs afin de représenter
des données diverses (comme les dates). Dans ce chapitre, nous nous intéressons plus particuliÚrement
aux variables catégorielles.

Les facteurs (ou factors an anglais) sont un type de vecteur géré nativement par R et utilisés dans de
nombreux domaines (modÚles statistiques, représentations graphiques, 
).

Les facteurs sont souvent mis en regard des donnĂ©es labellisĂ©es telles qu’elles sont utilisĂ©es dans d’autres
logiciels comme SPSS ou Stata. Or, les limites propres aux facteurs font qu’ils ne sont pas adpatĂ©s pour
rendre compte des différents usages qui sont fait des données labellisées. Plusieurs extensions (telles que

– 121 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

memisc ou Hmisc) ont proposĂ© leur propre solution qui, bien qu’elles apportaient un plus pour la gestion
des données labellisées, ne permettaient pas que celles-ci soient utilisées en dehors de ces extensions ou
des extensions compatibles. Nous aborderons ici une nouvelle classe de vecteurs, la classe labelled ,
introduite par l’extension haven (que nous aborderons dans le cadre de l’import de donnĂ©es, page 149) et
qui peut ĂȘtre manipulĂ©e avec l’extension homonyme labelled.

Facteurs
Dans ce qui suit on travaillera sur le jeu de donnĂ©es tirĂ© de l’enquĂȘte Histoire de vie, fourni avec l’extension
questionr.

R> library(questionr)
data(hdv2003)
d <- hdv2003

Jetons un Ɠil à la liste des variables de d :

R> str(d)

'[Link]': 2000 obs. of 20 variables:


$ id : int 1 2 3 4 5 6 7 8 9 10 ...
$ age : int 28 23 59 34 71 35 60 47 20 28 ...
$ sexe : Factor w/ 2 levels "Homme","Femme": 2 2 1 1 2 2 2 1 2 1 ...
$ nivetud : Factor w/ 8 levels "N'a jamais fait d'etudes",..: 8 NA 3 8 3 6
3 6 NA 7 ...
$ poids : num 2634 9738 3994 5732 4329 ...
$ occup : Factor w/ 7 levels "Exerce une profession",..: 1 3 1 1 4 1 6 1
3 1 ...
$ qualif : Factor w/ 7 levels "Ouvrier specialise",..: 6 NA 3 3 6 6 2 2 N
A 7 ...
$ [Link]: int 8 2 2 1 0 5 1 5 4 2 ...
$ clso : Factor w/ 3 levels "Oui","Non","Ne sait pas": 1 1 2 2 1 2 1 2
1 2 ...
$ relig : Factor w/ 6 levels "Pratiquant regulier",..: 4 4 4 3 1 4 3 4 3
2 ...
$ [Link] : Factor w/ 4 levels "Le plus important",..: 4 NA 2 3 NA 1 NA 4
NA 3 ...
$ [Link] : Factor w/ 3 levels "Satisfaction",..: 2 NA 3 1 NA 3 NA 2 NA 1
...
$ [Link] : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
$ [Link] : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
$ [Link] : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 2 2 1 1 ...
$ cuisine : Factor w/ 2 levels "Non","Oui": 2 1 1 2 1 1 2 2 1 1 ...

– 122 –
Facteurs et vecteurs labellisés

$ bricol : Factor w/ 2 levels "Non","Oui": 1 1 1 2 1 1 1 2 1 1 ...


$ cinema : Factor w/ 2 levels "Non","Oui": 1 2 1 2 1 2 1 1 2 2 ...
$ sport : Factor w/ 2 levels "Non","Oui": 1 2 2 2 1 2 1 1 1 2 ...
$ [Link] : num 0 1 0 2 3 2 2.9 1 2 2 ...

Nous voyons que de nombreuses variables de ce tableau de données, telles que sexe ou nivetud, sont
du type facteur.

Les facteurs prennent leurs valeurs dans un ensemble de modalités prédéfinies et ne peuvent en prendre
d’autres. La liste des valeurs possibles est donnĂ©e par la fonction levels :

R> levels(d$sexe)

[1] "Homme" "Femme"

Si on veut modifier la valeur du sexe du premier individu de notre tableau de données avec une valeur non
autorisĂ©e, on obient un message d’erreur et une valeur manquante est utilisĂ©e Ă  la place :

R> d$sexe[1] <- "Chihuahua"

Warning in `[<-.factor`(`*tmp*`, 1, value = structure(c(NA,


2L, 1L, 1L, : niveau de facteur incorrect, NAs générés

R> d$sexe[1]

[1] <NA>
Levels: Homme Femme

R> d$sexe[1] <- "Homme"


d$sexe[1]

[1] Homme
Levels: Homme Femme

On peut trĂšs facilement crĂ©er un facteur Ă  partir d’une variable textuelle avec la fonction factor :

– 123 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> v <- factor(c("H", "H", "F", "H"))


v

[1] H H F H
Levels: F H

Par dĂ©faut, les niveaux d’un facteur nouvellement créés sont l’ensemble des valeurs de la variable
textuelle, ordonnĂ©es par ordre alphabĂ©tique. Cette ordre des niveaux est utilisĂ© Ă  chaque fois qu’on utilise
des fonctions comme table , par exemple :

R> table(v)

v
F H
1 3

On peut modifier cet ordre au moment de la crĂ©ation du facteur en utilisant l’option levels :

R> v <- factor(c("H", "H", "F", "H"), levels = c("H", "F"))


table(v)

v
H F
3 1

On peut aussi modifier l’ordre des niveaux d’une variable dĂ©jĂ  existante :

R> d$qualif <- factor(d$qualif, levels = c(


"Ouvrier specialise", "Ouvrier qualifie",
"Employe", "Technicien", "Profession intermediaire", "Cadre", "Autre"
))
table(d$qualif)

Ouvrier specialise Ouvrier qualifie


203 292
Employe Technicien
594 86
Profession intermediaire Cadre
160 260
Autre

– 124 –
Facteurs et vecteurs labellisés

58

NOTE

L’extension questionr propose une interface interactive pour le rĂ©ordonnancement des niveaux d’un
facteur. Cette fonction, nommée iorder , vous permet de réordonner les modalités de maniÚre
graphique et de générer le code R correspondant.

Dans l’exemple prĂ©cĂ©dant, si vous exĂ©cutez :

R> iorder(d, "qualif")

RStudio devrait ouvrir une fenĂȘtre semblable Ă  celle de la figure ci-dessous.

Interface de la commande iorder

Vous pouvez alors dĂ©placer les modalitĂ©s par glisser-dĂ©poser, vĂ©rifier le rĂ©sultat dans l’onglet
VĂ©rification et, une fois le rĂ©sultat satisfaisant, rĂ©cupĂ©rer le code gĂ©nĂ©rĂ© pour l’inclure dans votre
script.

– 125 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

On peut Ă©galement modifier les niveaux eux-mĂȘmes. Imaginons que l’on souhaite crĂ©er une nouvelle
variable [Link] contenant les noms abrégés des catégories socioprofessionnelles de qualif. On peut
alors procéder comme suit :

R> d$[Link] <- factor(d$qualif,


levels = c(
"Ouvrier specialise", "Ouvrier qualifie",
"Employe", "Technicien", "Profession intermediaire", "Cadre", "Autre"
),
labels = c("OS", "OQ", "Empl", "Tech", "Interm", "Cadre", "Autre")
)
table(d$[Link])

OS OQ Empl Tech Interm Cadre Autre


203 292 594 86 160 260 58

Dans ce qui précÚde, le paramÚtre levels de factor permet de spécifier quels sont les niveaux retenus
dans le facteur résultat, ainsi que leur ordre. Le paramÚtre labels , lui, permet de modifier les noms
de ces niveaux dans le facteur rĂ©sultat. Il est donc capital d’indiquer les noms de labels exactement
dans le mĂȘme ordre que les niveaux de levels . Pour s’assurer de ne pas avoir commis d’erreur, il est
recommandĂ© d’effectuer un tableau croisĂ© entre l’ancien et le nouveau facteur :

R> table(d$qualif, d$[Link])

OS OQ Empl Tech Interm Cadre


Ouvrier specialise 203 0 0 0 0 0
Ouvrier qualifie 0 292 0 0 0 0
Employe 0 0 594 0 0 0
Technicien 0 0 0 86 0 0
Profession intermediaire 0 0 0 0 160 0
Cadre 0 0 0 0 0 260
Autre 0 0 0 0 0 0

Autre
Ouvrier specialise 0
Ouvrier qualifie 0
Employe 0
Technicien 0
Profession intermediaire 0
Cadre 0
Autre 58

– 126 –
Facteurs et vecteurs labellisés

On a donc ici un premier moyen d’effectuer un recodage des modalitĂ©s d’une variable de type facteur.
D’autres mĂ©thodes existent, que nous aborderons dans le chapitre Recodage, page 201.

À noter que par dĂ©faut, les valeurs manquantes ne sont pas considĂ©rĂ©es comme un niveau de facteur. On
peut cependant les transformer en niveau en utilisant la fonction addNA . Ceci signifie cependant qu’elle
ne seront plus considérées comme manquantes par R mais comme une modalité à part entiÚre :

R> summary(d$[Link])

Satisfaction Insatisfaction Equilibre NA's


480 117 451 952

R> summary(addNA(d$[Link]))

Satisfaction Insatisfaction Equilibre <NA>


480 117 451 952

La fonction addNAstr de l’extension questionr fait la mĂȘme chose mais permet de spĂ©cifier l’étiquette de
la modalité des valeurs manquantes.

R> library(questionr)
summary(addNAstr(d$[Link], "Manquant"))

Satisfaction Insatisfaction Equilibre Manquant


480 117 451 952

Vecteurs labellisés
Nous abordons ici une nouvelle classe de vecteurs, la classe haven_labelled , introduite récemment par
l’extension haven (que nous aborderons dans le cadre de l’import de donnĂ©es, page 149) et qui peut ĂȘtre
manipulĂ©e avec l’extension homonyme labelled.

Pour cette section, nous allons utiliser d’autres donnĂ©es d’exemple, Ă©galement disponibles dans
l’extension questionr. Il s’agit d’un ensemble de trois tableaux de donnĂ©es ( menages , femmes et
enfants ) contenant les donnĂ©es d’une enquĂȘte de fĂ©conditĂ©. Commençons par les charger en mĂ©moire :

R> library(questionr)
data(fecondite)

Pour ailleurs, nous allons avoir besoin de l’extension labelled qui permet de manipuler ces donnĂ©es

– 127 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

labellisées.

R> library(labelled)

Les étiquettes de variable


Les Ă©tiquettes de variable permettent de donner un nom long, plus explicite, aux diffĂ©rentes colonnes d’un
tableau de données (ou encore directement à un vecteur autonome).

La visonneuse de donnĂ©es de RStudio sait reconnaĂźtre et afficher ces Ă©tiquettes de variable lorsqu’elles
existent. Essayez par exemple la commande suivante :

R> View(femmes)

Les fonctions look_for de l’extension laballed et describe de l’extension questionr affichent


Ă©galement les Ă©tiquettes de variables lorsqu’elles existent.

R> look_for(femmes, "rés")

pos variable label col_type values


<chr> <chr> <chr> <chr> <chr>
7 milieu Milieu de résidence dbl+lbl [1] urbain
[2] rural
8 region Région de résidence dbl+lbl [1] Nord
[2] Est
[3] Sud
[4] Ouest

R> describe(femmes$id_femme)

[2000 obs.] Identifiant de l'enquĂȘtĂ©e


numeric: 391 1643 85 881 1981 1072 1978 1607 738 1656 ...
min: 1 - max: 2000 - NAs: 0 (0%) - 2000 unique values

Pour manipuler les Ă©tiquettes de variable, il suffit d’utiliser la fonction var_label de l’extension labelled.

R> var_label(femmes$id_menage)

[1] "Identifiant du ménage"

– 128 –
Facteurs et vecteurs labellisés

R> var_label(femmes$id_menage) <- "ID du ménage auquel elle appartient"


var_label(femmes$id_menage)

[1] "ID du ménage auquel elle appartient"

On utilisera la valeur NULL pour supprimer une étiquette :

R> v <- c(1, 5, 2, 4, 1)


var_label(v)

NULL

R> var_label(v) <- "Ma variable"


var_label(v)

[1] "Ma variable"

R> var_label(v) <- NULL


var_label(v)

NULL

R> var_label(v) <- "Une autre étiquette"


var_label(v)

[1] "Une autre étiquette"

Le fait d’ajouter une Ă©tiquette Ă  un vecteur ne modifie en rien son type. Regardons la structure de notre
objet v :

R> str(v)

num [1:5] 1 5 2 4 1
- attr(*, "label")= chr "Une autre étiquette"

Que voit-on ? Notre vecteur possùde maintenant ce qu’on appelle un attribut, c’est-à-dire une information
supplémentaire qui lui est attachée. Un objet peut avoir plusieurs attributs. Ici, notre étiquette de variable

– 129 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

est strockĂ© dans un attribut nommĂ© "label" . Cela ne modifie en rien sa nature. Il ne s’agit que
d’information en plus. Toutes les fonctions ne tiennent pas compte des Ă©tiquettes de variable. Peu
importe ! La prĂ©sence d’un attribut ne les empĂȘchera de fonctionner. De mĂȘme, mĂȘme si l’extension
labelled n’est pas installĂ©e sur votre machine, vous pourrez toujours manipuler vos donnĂ©es comme si de
rien n’était.

On peut associer une Ă©tiquette de variable Ă  n’importe quel type de variable, qu’elle soit numĂ©rique,
textuelle, un facteur ou encore des dates.

Les étiquettes de valeur


Les Ă©tiquettes de valeur consistent Ă  attribuer une Ă©tiquette textuelle Ă  certaines valeurs d’un vecteur.
Elles ne peuvent s’appliquer qu’aux vecteurs numĂ©riques ou textuels.

Lorsqu’un vecteur possĂšde des Ă©tiquettes de valeur, sa classe change et devient labelled . Regardons
dĂ©jĂ  quelques exemples. Tout d’abord, jetons un apercu au contenu de l’objet femmes grace Ă  la fonction
glimpse de l’extension dplyr.

R> library(dplyr)
glimpse(femmes)

Rows: 2,000
Columns: 17
$ id_femme <dbl> 391, 1643, 85, 881, 1981, 1072, 197

$ id_menage <dbl> 381, 1515, 85, 844, 1797, 1015, 179

$ poids <dbl> 1.803150, 1.803150, 1.803150, 1.803

$ date_entretien <date> 2012-05-05, 2012-01-23, 2012-01-21

$ date_naissance <date> 1997-03-07, 1982-01-06, 1979-01-01

$ age <dbl> 15, 30, 33, 43, 25, 18, 45, 23, 49,

$ milieu <dbl+lbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2

$ region <dbl+lbl> 4, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3

$ educ <dbl+lbl> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0

$ travail <hvn_lbl_> 1, 1, 0, 1, 1, 0, 1, 0, 1, 1, 

$ matri <dbl+lbl> 0, 2, 2, 2, 1, 0, 1, 1, 2, 5, 2

$ religion <dbl+lbl> 1, 3, 2, 3, 2, 2, 3, 1, 3, 3, 2

$ journal <dbl+lbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

$ radio <dbl+lbl> 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1

$ tv <dbl+lbl> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1

$ nb_enf_ideal <hvn_lbl_> 4, 4, 4, 4, 4, 5, 10, 5

$ test <hvn_lbl_> 0, 9, 0, 0, 1, 0, 0, 0, 0, 1, 


Il apparaĂźt que la variable region est de type haven_labelled . On peut le confirmer


avec class .

– 130 –
Facteurs et vecteurs labellisés

R> class(femmes$region)

[1] "haven_labelled" "vctrs_vctr" "double"

Regardons les premiĂšres valeurs prises par cette variable.

R> head(femmes$region)

<labelled<double>[6]>: Région de résidence


[1] 4 4 4 4 4 3

Labels:
value label
1 Nord
2 Est
3 Sud
4 Ouest

Nous voyons que quatre étiquettes de valeurs ont été associées à notre variable. Le code 1 correspond
ainsi à la région «Nord», le code 2 à la région «Est», etc. Laissons de cÎté pour le moment la colonne is_na
que nous aborderons dans une prochaine section.

La liste des étiquettes est également renvoyée par la fonction describe de questionr.

R> describe(femmes$region)

[2000 obs.] Région de résidence


labelled double: 4 4 4 4 4 3 3 3 3 3 ...
min: 1 - max: 4 - NAs: 0 (0%) - 4 unique values
4 value labels: [1] Nord [2] Est [3] Sud [4] Ouest

n %
[1] Nord 707 35.4
[2] Est 324 16.2
[3] Sud 407 20.3
[4] Ouest 562 28.1
Total 2000 100.0

L’extension labelled fournit la fonction val_labels qui renvoie la liste des Ă©tiquettes de valeurs d’une
variable sous la forme d’un vecteur nommĂ© et la fonction val_label (notez l’absence de ‘s’) qui renvoie
l’étiquette associĂ©e Ă  une valeur particuliĂšre. S’il n’y a pas d’étiquette de valeur, ces fonctions renvoient
NULL .

– 131 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> val_labels(femmes$region)

Nord Est Sud Ouest


1 2 3 4

R> val_label(femmes$region, 2)

[1] "Est"

R> val_label(femmes$region, 6)

NULL

R> val_labels(femmes$age)

NULL

Re-regardons d’un peu plus prùs les premiùres valeurs de notre variable region.

R> head(femmes$region)

<labelled<double>[6]>: Région de résidence


[1] 4 4 4 4 4 3

Labels:
value label
1 Nord
2 Est
3 Sud
4 Ouest

On s’aperçoit qu’il s’agit de valeurs numĂ©riques. Et l’affichage indique que notre variable est plus
précisément du type labelled double . Pour rappel, double est synonyme de numeric . Autrement
dit, la classe haven_labelled ne modifie pas le type sous-jacent d’un vecteur, que l’on peut toujours
obtenir avec la fonction typeof . Nous pouvons également tester si notre variable est numérique avec la
fonction [Link] .

– 132 –
Facteurs et vecteurs labellisés

R> typeof(femmes$region)

[1] "double"

R> [Link](femmes$region)

[1] TRUE

À la diffĂ©rence des facteurs, le type original d’une variable labellisĂ©e n’est pas modifiĂ© par la prĂ©sence
d’étiquettes de valeur. Ainsi, il reste possible de calculer une moyenne Ă  partir de notre variable region
(mĂȘme si cela n’est pas pertinent ici d’un point de vue sĂ©mantique).

R> mean(femmes$region)

[1] 2.412

Avec un facteur, nous aurions eu un bon message d’erreur.

R> mean(d$nivetud)

Warning in [Link](d$nivetud): l'argument n'est ni


numérique, ni logique : renvoi de NA

[1] NA

Nous allons voir qu’il est aussi possible d’associer des Ă©tiquettes de valeurs Ă  des vecteurs textuels.
CrĂ©ons tout d’abord un vecteur textuel qui nous servira d’exemple.

R> v <- c("f", "f", "h", "f", "h")


v

[1] "f" "f" "h" "f" "h"

Le plus facile pour lui associer des Ă©tiquettes de valeur est d’utiliser val_label .

– 133 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> val_label(v, "f") <- "femmes"


val_label(v, "h") <- "hommes"
v

<labelled<character>[5]>
[1] f f h f h

Labels:
value label
f femmes
h hommes

R> typeof(v)

[1] "character"

Notre vecteur v a automatiquement été transformé en un vecteur de la classe labelled . Mais son type
sous-jacent est restĂ© "character" . Par ailleurs, les donnĂ©es elle-mĂȘme n’ont pas Ă©tĂ© modifiĂ©es et ont
conservé leurs valeurs originales.

Il est Ă©galement possible de dĂ©finir/modifier/supprimer l’ensemble des Ă©tiquettes de valeur d’une variable
avec val_labels en lui assignant un vecteur nommé.

R> val_labels(v) <- c(Homme = "h", Femme = "f", "Valeur indéterminée" = "i")
v

<labelled<character>[5]>
[1] f f h f h

Labels:
value label
h Homme
f Femme
i Valeur indéterminée

Comme précédemment, on utilisera NULL pour supprimer une ou toutes les étiquettes.

R> val_label(v, "i") <- NULL


v

<labelled<character>[5]>

– 134 –
Facteurs et vecteurs labellisés

[1] f f h f h

Labels:
value label
h Homme
f Femme

R> val_labels(v) <- NULL


v

[1] "f" "f" "h" "f" "h"

R> class(v)

[1] "character"

Si l’on supprime toutes les Ă©tiquettes de valeur, alors notre vecteur retrouve sa classe initiale.

Assignation et condition
Les Ă©tiquettes de valeur sont plus souples que les facteurs, en ce sens qu’il n’est pas obligatoire d’indiquer
une Ă©tiquette pour chaque valeur prise par une variable. Alors qu’il n’est pas possible avec un facteur
d’assigner une valeur qui n’a pas Ă©tĂ© prĂ©alablement dĂ©finie comme une des modalitĂ©s possibles du facteur,
nous n’avons pas cette limite avec les vecteurs labellisĂ©s.

R> femmes$region[3] <- 5

Important : quand on assigne une valeur Ă  un facteur, on doit transmettre le texte correspondant Ă  la
modalité, alors que pour un vecteur labellisé on transmettra le code sous-jacent (pour rappel, les
Ă©tiquettes de valeur ne sont qu’une information additionnelle).

De plus, nous avons vu que les donnĂ©es initiales n’étaient pas modifiĂ©es par l’ajout ou la suppression
d’étiquettes de valeur, alors que pour les facteurs ce n’est pas vrai. Pour mieux comprendre, essayons la
commande suivante :

R> unclass(factor(v))

[1] 1 1 2 1 2
attr(,"levels")

– 135 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

[1] "f" "h"

Un facteur stocke de maniĂšre interne les valeurs sous la forme d’une suite d’entiers, dĂ©marrant toujours
par 1, forcĂ©ment consĂ©cutifs, et dont les valeurs dĂ©pendent de l’ordre des facteurs. Pour s’en rendre
compte :

R> unclass(factor(v, levels = c("h", "f")))

[1] 2 2 1 2 1
attr(,"levels")
[1] "h" "f"

R> unclass(factor(v, levels = c("f", "h")))

[1] 1 1 2 1 2
attr(,"levels")
[1] "f" "h"

Ce qui importe pour un facteur ce sont les modalités de ce dernier tandis que pour un vecteur labellisé ce
sont les valeurs du vecteur elles-mĂȘmes. Cela reste vrai pour l’écriture de conditions.

Prenons un premier exemple avec un facteur :

R> describe(d$sexe)

[2000 obs.]
nominal factor: "Homme" "Femme" "Homme" "Homme" "Femme" "Femme" "Femme" "Homme"
"Femme" "Homme" ...
2 levels: Homme | Femme
NAs: 0 (0%)

n %
Homme 900 45
Femme 1100 55
Total 2000 100

R> table(d$sexe == "Homme")

FALSE TRUE

– 136 –
Facteurs et vecteurs labellisés

1100 900

R> table(d$sexe == 1)

FALSE
2000

La condition valide est celle utilisant "Homme" qui est la valeur de la modalité du facteur.

Et avec un vecteur labellisé ?

R> describe(femmes$milieu)

[2000 obs.] Milieu de résidence


labelled double: 2 2 2 2 2 2 2 2 2 2 ...
min: 1 - max: 2 - NAs: 0 (0%) - 2 unique values
2 value labels: [1] urbain [2] rural

n %
[1] urbain 912 45.6
[2] rural 1088 54.4
Total 2000 100.0

R> table(femmes$milieu == "urbain")

Erreur : Can't combine `..1` <character> and `..2` <double>.

R> table(femmes$milieu == 1)

FALSE TRUE
1088 912

Ici, pour ĂȘtre valide, la condition doit porter sur les valeurs de la variable elle-mĂȘme et non sur les
étiquette.

– 137 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Quelques fonctions supplémentaires


L’extension labelled fournit quelques fonctions supplĂ©mentaires qui peuvent s’avĂ©rer utiles :

‱ labelled pour crĂ©er directement des vecteurs labellisĂ©s ;


‱ nolabel_to_na pour convertir les valeurs n’ayant pas d’étiquette en NA ;
‱ val_labels_to_na qui, Ă  l’inverse, converti les valeurs avec Ă©tiquette en NA ;
‱ sort_val_labels pour trier l’ordre des Ă©tiquettes de valeurs.

On pourra se rĂ©ferrer Ă  l’aide de chacune de ces fonctions.

L’import de donnĂ©es labellisĂ©es, page 149 et le recodage de variables, page 208 (dont la conversion d’un
vecteur labellisé en facteur) seront quant à eux abordés dans les prochains chapitres.

– 138 –
Organiser ses fichiers
Le répertoire de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Les projets dans RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Créer un nouveau projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Fonctionnement par défaut des projets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Options des projets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Naviguer d’un projet à un autre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Voir aussi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Appeler un script depuis un autre script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146

WEBIN-R

Ce chapitre est évoqué dans le webin-R #02 (les bases du langage R) sur YouTube.

Ce chapitre est évoqué dans le webin-R #03 (statistiques descriptives avec gtsummary et esquisse)
sur YouTube.

Le répertoire de travail
À chaque fois que l’on demandera à R de charger ou d’enregistrer un fichier (en particulier lorsque l’on
cherchera Ă  importer des donnĂ©es, voir le chapitre dĂ©diĂ©, page 149), R Ă©valuera le nom du fichier qu’on
lui a transmis par rapport au répertoire de travail actuellement défini, qui correspond au répertoire dans
lequel R est actuellement en train de s’exĂ©cuter.

Pour connaßtre de le répertoire de travail actuel, on pourra utiliser la fonction getwd :

R> getwd()

Lorsque l’on travaille sous RStudio, le rĂ©pertoire de travail est Ă©galement affichĂ© dans le quadrant
infĂ©rieur droit, en gris, Ă  la droite du mot Console (voir la capture d’écran ci-aprĂšs).

– 139 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Affichage du répertoire de travail sous RStudio

Figure 1. Affichage du répertoire de travail sous RStudio

Le symbole ~ correspond dans ce cas-lĂ  au rĂ©pertoire utilisateur systĂšme, dont l’emplacement dĂ©pend du
systĂšme d’exploitation. Sous Windows, il s’agit du rĂ©pertoire Mes documents ou Documents (le nom varie
suivant la version de Windows).

Le rĂ©pertoire de travail peut ĂȘtre modifiĂ© avec la fonction setwd ou, sous RStudio, via le menu Session >
Set Working Directory. Cependant, nous allons voir que nous n’aurons en pratique presque jamais besoin de
le faire si l’on travaille avec RStudio.

Les projets dans RStudio


RStudio dispose d’une fonctionnalitĂ© trĂšs pratique pour organiser son travail en diffĂ©rents projets.

L’idĂ©e principale est de rĂ©unir tous les fichiers / documents relatifs Ă  un mĂȘme projet (que ce soit les
données, les scripts, les rapports automatisés
) dans un répertoire dédié1.

Le menu Projects est accessible via une icĂŽne dĂ©diĂ©e situĂ©e tout en haut Ă  droite (voir la capture d’écran
ci-aprĂšs).

1. Dans lequel il sera possible de créer des sous-répertoires.

– 140 –
Organiser ses fichiers

AccĂšs au menu Projects sous RStudio

Figure 2. AccĂšs au menu Projects sous RStudio

Créer un nouveau projet


Dans le menu Projects on sĂ©lectionnera l’option New project. RStudio nous demandera dans un premier
temps si l’on souhaite crĂ©er un projet (i) dans un nouveau rĂ©pertoire, (ii) dans un rĂ©pertoire dĂ©jĂ  existant
ou bien (iii) à partir d’un gestionnaire de versions (Git ou SVN).

– 141 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Options de création de projet sous RStudio

Figure 3. Options de création de projet sous RStudio

Si vous débutez avec R, laissez de cÎté pour le moment les gestionnaires de versions qui sont destinés aux
utilisateurs avancĂ©s. Dans le cadre d’un usage courant, on aura recours Ă  New Directory.

RStudio nous demande alors le type de projet que l’on souhaite crĂ©er : (i) un projet vide, (ii) une extension
R ou (iii) une application Shiny.

– 142 –
Organiser ses fichiers

Les différents types de projet sous RStudio

Figure 4. Les différents types de projet sous RStudio

Il est encore un peu tÎt pour se lancer dans la création de sa propre extension pour R (voir le chapitre
Développer un package). Les applications Shiny (voir le chapitre dédié) sont des applications webs
interactives. LĂ  encore, on attendra une meilleure maĂźtrise de R pour se lancer dans ce type de projets.
Dans un contexte d’analyse d’enquĂȘtes, on choisira dĂšs lors Empty project.

– 143 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

CrĂ©ation d’un projet dans un nouveau rĂ©pertoire avec RStudio

Figure 5. CrĂ©ation d’un projet dans un nouveau rĂ©pertoire avec RStudio

En premier lieu, on indiquera le nom de notre projet, qui sera également le nom du répertoire qui sera créé
pour stocker les donnĂ©es du projet. Puis, on indiquera le rĂ©pertoire parent, c’est-Ă -dire le rĂ©pertoire dans
lequel le répertoire de notre projet sera créé.

Les deux options suivantes concernent que les utilisateurs avancĂ©s. RStudio nous demande s’il on veut
activer Git sur ce projet (Git Ă©tant un gestionnaire de versions, l’option n’étant affichĂ©e que si Git est
installĂ© sur votre PC) et s’il on souhaite utiliser l’extension packrat sur ce projet. packrat permet une
gestion des extensions utilisĂ©es, projet par projet, ce qui n’est vraiment utile que dans le cadre d’analyses
bien spécifiques.

Il ne nous reste plus qu’à cliquer sur Create Project.

Fonctionnement par défaut des projets


Lorsque l’on ouvre un projet, RStudio effectue diffĂ©rentes actions :

‱ le nom du projet est affichĂ© en haut Ă  droite Ă  cĂŽtĂ© de l’icĂŽne projets ;


‱ une nouvelle session R est exĂ©cutĂ©e (ainsi s’il on passe d’un projet Ă  un autre, les objets du projet

– 144 –
Organiser ses fichiers

qu’on vient de fermer ne sont plus en mĂ©moire) ;


‱ le rĂ©pertoire de travail de R est dĂ©fini comme Ă©tant le rĂ©pertoire du projet (d’oĂč le fait que l’on
n’a pas Ă  se prĂ©occuper de dĂ©finir le rĂ©pertoire de travail lorsque l’on travaille avec des projets
RStudio) ;
‱ les objets créés (et sauvegardĂ©s dans le fichier .Rdata ) lors d’une prĂ©cĂ©dente sĂ©ance de travail
sont chargés en mémoire ;
‱ l’historique des commandes saisies lors de nos prĂ©cĂ©dentes sĂ©ances de travail sont chargĂ©es
dans l’onglet History ;
‱ les scripts ouverts lors d’une prĂ©cĂ©dente sĂ©ance de travail sont automatiquement ouverts ;
‱ divers paramĂštres de RStudio sont restaurĂ©s dans l’état dans lequel ils Ă©taient la derniĂšre fois
que l’on a travaillĂ© sur ce projet.

Autrement dit, lorsque l’on ouvre un projet RStudio, on revient Ă  l’état de notre projet tel qu’il Ă©tait la
derniĂšre fois que l’on a travaillĂ© dessus. Pratique, non ?

Petite prĂ©cision toutefois, les extensions que l’on avait chargĂ©es en mĂ©moire avec la fonction library
ne sont pas systématiquement rechargées en mémoire. Il faudra donc les appeler à nouveau lors de notre
séance de travail.

Options des projets


Via le menu Projects > Projects options (accessible via l’icîne projets en haut à droite), il est possible de
personnaliser plusieurs options spécifiquement pour ce projet.

On retiendra surtout les 3 options principales de l’onglet General :

‱ Ă  l’ouverture du projet, doit-on charger en mĂ©moire les objets sauvegardĂ©s lors d’une
précédente séance de travail ?
‱ Ă  la fermeture du projet, doit-son sauvegarder (dans le fichier .Rdata ) les diffĂ©rents objets
en mĂ©moire ? Si l’on choisit l’option Ask, alors une fenĂȘtre vous demandera s’il faut faire cette
sauvegarde chaque fois que vous fermerez le projet.
‱ à la fermeture du projet, faut-il sauver l’historique des commandes ?

Naviguer d’un projet à un autre


RStudio se souvient des derniers projets sur lesquels vous avez travaillé. Lorsque vous cliquez sur le menu
projets, vous verrez une liste de ces différents projets. Il suffit de cliquer sur le nom du projet désiré pour
fermer automatiquement le projet en cours et ouvrir le projet désiré.

Votre projet n’apparait pas dans la liste ? Pas de panique. Il suffit de sĂ©lectionner Open project puis de
parcourir vos répertoires pour indiquer à RStudio le projet à ouvrir.

Vous pouvez noter au passage une option Open project in new window qui permet d’ouvrir un projet dans
une nouvelle fenĂȘtre. En effet, il est tout Ă  fait possible d’avoir plusieurs projets ouverts en mĂȘme temps.

– 145 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Dans ce cas là, chaque projet aura sa propre session R. Les objets chargés en mémoire pour le projet A ne
seront pas accessibles dans le cadre du projet B et inversement.

Voir aussi
On pourra se référer à la documentation officielle de RStudio : [Link]
articles/200526207-Using-Projects.

Appeler un script depuis un autre script


Au sein d’un mĂȘme projet, on peut avoir plusieurs scripts R. Cela permet de mieux organiser son code. Par
exemple, on pourra avoir un premier script chargĂ© d’importer les donnĂ©es, un second dĂ©diĂ© Ă  la crĂ©ation
de nouvelles variables et un troisiÚme dédié aux analyses statistiques.

Il est possible d’appeler un script au sein d’un autre script à l’aide de la fonction source à laquelle on
précisera le nom de fichier du script en question.

Supposons par exemple que l’on ait prĂ©parĂ© un script preparation.R chargĂ© d’importer les donnĂ©es et
de les mettre en forme. Au debut de notre script analyses.R , on pourra indiquer :

R> source("preparation.R")

Si l’on exĂ©cute notre script analyses.R , au moment de l’appel Ă  source("preparation.R") , le fichier


preparation.R sera chargé en mémoire et exécuté, puis le programme continuera avec les commandes
suivant du fichier analyses.R .

Ici, on a indiqué à source le fichier preparation.R sans mention de répertoire. DÚs lors, R va aller
chercher ce fichier dans le rĂ©pertoire de travail. Sur un gros projet, on peut ĂȘtre amenĂ© Ă  organiser ses
fichiers en plusieurs sous-répertoires pour une meilleure lisibilité. DÚs lors, il faudra indiquer le chemin
relatif pour accĂ©der Ă  un fichier, c’est-Ă -dire le chemin Ă  partir du rĂ©pertoire de travail. Supposons que
notre fichier preparation.R est enregistré dans un sous-répertoire import . Dans ce cas-là, on
appelera notre fichier ainsi :

– 146 –
Organiser ses fichiers

R> source("import/preparation.R")

NOTE

On remarquera qu’on a utilisĂ© une barre oblique ou slash ( / ) entre le nom du rĂ©pertoire et le nom
du fichier, ce qui est l’usage courant sous Linux et Mac OS X, tandis que sous Windows on utilise
d’ordinaire une barre oblique inversĂ©e ou antislash ( \ ). Sous R, on utilisera toujours la barre oblique
simple ( / ), R sachant « retrouver ses petits » selon le systĂšme d’exploitation.

Par ailleurs, l’autocomplĂ©tion de RStudio fonctionne aussi pour les noms de fichiers. Essayez par
exemple d’appuyer sur la touche Tab aprùs avoir taper les premiùres lettres du nom de votre fichier.

– 147 –
Import de données
Importer des fichiers texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Structure d’un fichier texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Interface graphique avec RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Dans un script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Importer depuis des logiciels de statistique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
SPSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Stata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
dBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Feuille de calcul Google Sheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Données spatiales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Shapefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Rasters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Connexion à des bases de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Interfaçage via l’extension DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
Utilisation de dplyr et dbplyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Autres sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
Sauver ses données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165

GUIDE-R

Une version actualisée de ce chapitre est disponible sur guide-R : Import & Export de données

– 149 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

I M P O R TA N T

Importer des donnĂ©es est souvent l’une des premiĂšre opĂ©rations que l’on effectue lorsque l’on dĂ©bute
sous R, et ce n’est pas la moins compliquĂ©e. En cas de problĂšme il ne faut donc pas hĂ©siter Ă  demander
de l’aide par les diffĂ©rents moyens disponibles (voir le chapitre OĂč trouver de l’aide ?, page 167) avant
de se décourager.

N’hĂ©sitez donc pas Ă  relire rĂ©guliĂšrement ce chapitre en fonction de vos besoins.

Avant toute chose, il est impératif de bien organiser ses différents fichiers (voir le chapitre dédié,
page 139). Concernant les donnĂ©es sources que l’on utilisera pour ses analyses, je vous recommande
de les placer dans un sous-répertoire dédié de votre projet.

Lorsque l’on importe des donnĂ©es, il est Ă©galement impĂ©ratif de vĂ©rifier que l’import s’est
correctement déroulé (voir la section Inspecter les données, page 41 du chapitre Premier travail avec
les données).

Importer des fichiers texte


Les fichiers texte constituent un des formats les plus largement supportés par la majorité des logiciels
statistiques. Presque tous permettent d’exporter des donnĂ©es dans un format texte, y compris les tableurs
comme Libre Office, Open Office ou Excel.

Cependant, il existe une grande variétés de format texte, qui peuvent prendre différents noms selon les
outils, tels que texte tabulé ou texte (séparateur : tabulation), CSV (pour comma-separated value, sachant que
suivant les logiciels le sĂ©parateur peut ĂȘtre une virgule ou un point-virgule).

Structure d’un fichier texte


Dùs lors, avant d’importer un fichier texte dans R, il est indispensable de regarder comment ce dernier est
structuré. Il importe de prendre note des éléments suivants :

‱ La premiùre ligne contient-elle le nom des variables ? Ici c’est le cas.


‱ Quel est le caractĂšre sĂ©parateur entre les diffĂ©rentes variables (encore appelĂ© sĂ©parateur de
champs) ? Dans le cadre d’un fichier CSV, il aurait pu s’agir d’une virgule ou d’un point-virgule.
‱ Quel est le caractĂšre utilisĂ© pour indiquer les dĂ©cimales (le sĂ©parateur dĂ©cimal) ? Il s’agit en
gĂ©nĂ©ral d’un point (Ă  l’anglo-saxonne) ou d’une virgule (Ă  la française).
‱ Les valeurs textuelles sont-elles encadrĂ©es par des guillemets et, si oui, s’agit-il de guillements
simple ( ' ) ou de guillemets doubles ( " ) ?
‱ Pour les variables textuelles, y a-t-il des valeurs manquantes et si oui comment sont-elles

– 150 –
Import de données

indiquées ? Par exemple, le texte NA est parfois utilisé.

Il ne faut pas hésitez à ouvrir le fichier avec un éditeur de texte pour le regarder de plus prÚs.

Interface graphique avec RStudio


RStudio fournit une interface graphique pour faciliter l’import d’un fichier texte. Pour cela, il suffit d’aller
dans le menu File > Import Dataset et de choisir l’option From CSV1. Cette option est Ă©galement disponible
via l’onglet Environment dans le quadrant haut-droite.

Pour la suite de la démonstration, nous allons utiliser le fichier exemple [Link]


analyse-R/data/exemple_texte_tabule.txt.

Importer un fichier texte avec RStudio

Figure 1. Importer un fichier texte avec RStudio

L’interface de RStudio vous prĂ©sente sous Import Options les diffĂ©rentes options d’import disponible. La
section Data Preview vous permet de voir en temps réel comment les données sont importées. La section
Code Preview vous indique le code R correspondant à vos choix. Il n’y a plus qu’à le copier/coller dans un de
vos scripts ou Ă  cliquer sur Import pour l’exĂ©cuter.

Vous pourrez remarquer que RStudio fait appel Ă  l’extension readr du tidyverse pour l’import des donnĂ©es
via la fonction read_csv .

1. L’option CSV fonctionne pour tous les fichiers de type texte, mĂȘme si votre fichier a une autre extension, .txt par
exemple

– 151 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

readr essaie de deviner le type de chacune des colonnes, en se basant sur les premiĂšres observations.
En cliquant sur le nom d’une colonne, il est possible de modifier le type de la variable importĂ©e. Il est
Ă©galement possible d’exclure une colonne de l’import (skip).

Dans un script
L’interface graphique de RStudio fournit le code d’import. On peut Ă©galement l’adapter Ă  ces besoins en
consultant la page d’aide de read_csv pour plus de dĂ©tails. Par exemple :

R> library(readr)
d <- read_delim("[Link]
[Link]",
delim = "\t", quote = "'"
)

Rows: 7 Columns: 4
── Column specification ────────────────────────────────────
Delimiter: "\t"
chr (2): Sexe, Etudes
dbl (1): Age
num (1): Taille

â„č Use `spec()` to retrieve the full column specification for this data.
â„č Specify the column types or set `show_col_types = FALSE` to quiet this message.

Le premier Ă©lĂ©ment peut ĂȘtre un lien internet ou bien le chemin local vers un fichier. Afin d’organiser au
mieux vos fichiers, voir le chapitre Organiser ses fichiers, page 139.

NOTE

Certains caractĂšres sont parfois prĂ©cĂ©dĂ©s d’une barre oblique inversĂ©e ou antislash ( \ ). Cela
correspond à des caractÚres spéciaux. En effet, " est utilisé pour délimiter dans le code le début et
la fin d’une chaüne de caractùres. Comment indiquer à R le caractùre " proprement dit. Et bien avec
\" . De mĂȘme, \t sera interprĂ©tĂ© comme une tabulation et non comme la lettre t .

Pour une liste complÚte des caractÚres spéciaux, voir ?Quotes .

R> class(d)

[1] "spec_tbl_df" "tbl_df" "tbl" "[Link]"

– 152 –
Import de données

R> d

L’objet renvoyĂ© est un tableau de donnĂ©es ou [Link]. Plus prĂ©cisĂ©ment, il s’agit d’un tibble, c’est-Ă -
dire un tableau de données légÚrement amélioré facilement utilisable avec les différentes extensions du
tidyverse. Pas de panique, c’est un tableau de donnĂ©es comme les autres. Disons qu’il est possible de faire
un peu plus de choses avec. Pour cela, voir le chapitre dédié à dplyr, page 241.

readr propose plusieurs fonctions proches : read_delim , read_csv , read_csv2 et read_tsv . Elles
fonctionnent toutes de maniĂšre identique et ont les mĂȘmes arguments. Seule diffĂ©rence, les valeurs par
défaut de certainsparamÚtres.

NOTE

Dans des manuels ou des exemples en ligne, vous trouverez parfois mention des fonctions
[Link] , [Link] , read.csv2 , [Link] ou encore read.delim2 . Il s’agit des
fonctions natives et historiques de R (extension utils) dĂ©diĂ©es Ă  l’import de fichiers textes. Elles sont
similaires Ă  celles de readr dans l’idĂ©e gĂ©nĂ©rale mais diffĂšrent dans leurs dĂ©tails et les traitements
effectuĂ©s sur les donnĂ©es (pas de dĂ©tection des dates par exemple). Pour plus d’information, vous
pouvez vous rĂ©fĂ©rer Ă  la page d’aide de ces fonctions.

Importer depuis des logiciels de statistique


Plusieurs extensions existent pour importer des fichiers de donnĂ©es issus d’autres logiciels de statistiques.
En premier lieu, il y a foreign, installée par défaut avec R et décrite en détails dans le manuel R Data Import/
Export disponible sur [Link] Un des soucis majeurs de cette extension
réside dans la maniÚre dont elle traite les métadonnées utilisées en particulier dans les fichiers SAS, SPSS
et Stata, à savoir les étiquettes de variable, les étiquettes de valeur et les valeurs manquantes déclarées.
En effet, chaque fonction va importer ces mĂ©tadonnĂ©es sous la forme d’attributs dont le nom diffĂšre
d’une fonction Ă  l’autre. Par ailleurs, selon les options retenues, les variables labellisĂ©es seront parfois
transformées ou non en facteurs. Enfin, foreign ne sait pas toujours importer les différents types de
variables représentant des dates et des heures.

L’extension haven (qui fait partie du “tidyverse”) tente de remĂ©dier Ă  plusieurs des limitations rencontrĂ©es
avec foreign :

‱ le format des mĂ©tadonnĂ©es importĂ© est uniforme, quel que soit le type de fichier source (SAS,
SPSS ou Stata) ;
‱ les variables labellisĂ©es ne sont pas transformĂ©es en facteurs, mais hĂ©ritent d’une nouvelle
classe haven_labelled , la valeur initiale restant inchangée ;
‱ les diffĂ©rents formats de date sont convertis dans des classes R appropriĂ©es, utilisables en
particulier avec lubridate ;

– 153 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

‱ haven peut lire les fichiers SAS natifs (extension .sas7bdat ) ce que ne peut pas faire foreign ;
‱ haven peut lire les fichiers Stata 13 et 14, alors que foreign ne sait lire ces fichiers que jusqu’à la
version 12 ;
‱ les tableaux de donnĂ©es produits ont directement la classe tbl_df ce qui permets d’utiliser
directement les fonctionnalitĂ©s de l’extension dplyr.

À noter, il est Ă©galement possible d’utiliser l’interface graphique de RStudio pour l’import des fichiers
SPSS, Stata, SAS et Excel.

I M P O R TA N T

Données labellisées

À la diffĂ©rence de foreign, haven ne convertit pas les variables avec des Ă©tiquettes de valeurs en
facteurs mais en vecteurs labellisés du type haven_labelled qui sont présentés en détail dans le
chapitre Facteurs et vecteurs labellisés, page 127 et dans le chapitre recodage de variables, page 208
oĂč est discutĂ©e la question de savoir Ă  quel moment convertir les donnĂ©es labellisĂ©es.

SPSS
Les fichiers générés par SPSS sont de deux types : les fichiers SPSS natifs natifs (extension .sav ) et les
fichiers au format SPSS export (extension .por ).

Dans les deux cas, on aura recours Ă  la fonction read_spss :

– 154 –
Import de données

R> library(haven)
donnees <- read_spss("data/[Link]", user_na = TRUE)

I M P O R TA N T

Gestion des valeurs manquantes

Dans SPSS, il est possible de définir des valeurs à considérées comme manquantes. Plus précisément
jusqu’à 3 valeurs spĂ©cfiques et/ou les valeurs comprises entre un minimum et un maximum. Par
dĂ©faut, read_spss convertir toutes ces valeurs en NA lors de l’import.

Or, il est parfois important de garder les différentes valeurs originelles, notamment dans le cadre
de l’analyse de donnĂ©es d’enquĂȘte, un manquant du type «ne sait pas» n’étant pas Ă©quivalent Ă  un
manquant du type «refus» ou du type «variable non collectée».

Dùs lors, nous vous recommandons d’appeler read_spss avec l’option user_na = TRUE . Dans ce
cas-là, les valeurs manquantes définies dans SPSS ne seront pas converties en NA , tout en conservant
la définition des valeurs définies comme manquantes. Il sera alors toujours possible de convertir,
dans un second temps et en fonction des besoins, ces valeurs à considérer comme manquantes en
NA grace aux fonctions de l’extension labelled , en particulier user_na_to_na , na_values et
na_range .

À noter que les fonctions describe et freq de l’extension questionr que nous arboderons dans
d’autres chapitres savent exploiter ces valeurs Ă  considĂ©rer comme manquantes.

– 155 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

NOTE

Si vous prĂ©fĂ©rez utiliser l’extension foreign, la fonction correspondante est [Link] . On indiquera
Ă  la fonction de renvoyer un tableau de donnĂ©es avec l’argument [Link] = TRUE .

Par défaut, les variables numériques pour lesquelles des étiquettes de valeurs ont été définies sont
transformées en variables de type facteur, les étiquettes définies dans SPSS étant utilisées comme
labels du facteur. De mĂȘme, si des valeurs manquantes ont Ă©tĂ© dĂ©finies dans SPSS, ces derniĂšres seront
toutes transformées en NA (R ne permettant pas de gérer plusieurs types de valeurs manquantes). Ce
comportement peut ĂȘtre modifiĂ© avec [Link] et [Link] .

R> library(foreign)
donnees <- [Link]("data/[Link]", [Link] = TRUE, [Link]
bels = FALSE, [Link] = FALSE)

Il est important de noter que [Link] de l’extension foreign ne sait pas importer les dates. Ces
derniÚres sont donc automatiquement transformées en valeurs numériques.

SPSS stocke les dates sous la forme du nombre de secondes depuis le début du calendrier grégorien, à
savoir le 14 octobre 1582. DĂšs lors, si l’on des dates dans un fichier SPSS et que ces derniĂšres ont Ă©tĂ©
converties en valeurs numériques, on pourra essayer la commande suivante :

R> donnees$date <- [Link](donnees$date, origin = "1582-10-14")

SAS
Les fichiers SAS se présentent en général sous deux format : format SAS export (extension .xport ou
.xpt ) ou format SAS natif (extension .sas7bdat ).

Les fichiers SAS natifs peuvent ĂȘtre importĂ©es directement avec read_sas de l’extension haven :

R> library(haven)
donnees <- read_sas("data/fichier.sas7bdat")

Au besoin, on pourra prĂ©ciser en deuxiĂšme argument le nom d’un fichier SAS catalogue (extension
.sas7bcat ) contenant les métadonnées du fichier de données.

– 156 –
Import de données

R> library(haven)
donnees <- read_sas("data/fichier.sas7bdat", "data/fichier.sas7bcat")

Les fichiers au format SAS export peuvent ĂȘtre importĂ©s via la fonction [Link] de l’extension
foreign. Celle-ci s’utilise trùs simplement, en lui passant le nom du fichier en argument :

R> library(foreign)
donnees <- [Link]("data/[Link]")

Stata
Pour les fichiers Stata (extension .dta ), on aura recours aux fonctions read_dta et read_stata de
l’extension haven. Ces deux fonctions sont identiques.

R> library(haven)
donnees <- read_dta("data/[Link]")

I M P O R TA N T

Gestion des valeurs manquantes

Dans Stata, il est possible de définir plusieurs types de valeurs manquantes, qui sont notées sous
la forme .a à .z . Pour conserver cette information lors de l’import, haven a introduit dans R
le concept de tagged NA ou tagged missing value. Plus de détails sur ces données manquantes
«étiquettĂ©es», on se rĂ©fĂ©rera Ă  la page d’aide de la fonction tagged_na .

– 157 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

NOTE

Si l’on prĂ©fĂšre utiliser l’extension foreign, on aura recours Ă  la fonction [Link] .

L’option [Link] indique si les variables labellisĂ©es doit ĂȘtre converties automatiquement
en facteurs. Pour un résultat similaire à celui de haven, on choisira donc :

R> library(foreign)
donnees <- [Link]("data/[Link]", [Link] = FALSE)

L’option [Link] permet de convertir les dates du format Stata dans un format de dates gĂ©rĂ©
par R. Cependant, cela ne marche pas toujours. Dans ces cas lĂ , l’opĂ©ration suivante peut fonctionner.
Sans garantie néanmoins, il est toujours vivement conseillé de vérifier le résultat obtenu !

R> donnees$date <- [Link](donnees$Date, origin = "1960-01-01")

Excel
Une premiÚre approche pour importer des données Excel dans R consiste à les exporter depuis Excel dans
un fichier texte (texte tabulĂ© ou CSV) puis de suivre la procĂ©dure d’importation d’un fichier texte.

Une feuille Excel peut Ă©galement ĂȘtre importĂ©e directement avec l’extension readxl qui appartient Ă  la
mĂȘme famille que haven et readr.

La fonction read_excel permet d’importer Ă  la fois des fichiers .xls (Excel 2003 et prĂ©cĂ©dents) et
.xlsx (Excel 2007 et suivants).

R> library(readxl)
donnees <- read_excel("data/[Link]")

Une seule feuille de calculs peut ĂȘtre importĂ©e Ă  la fois. On pourra prĂ©ciser la feuille dĂ©sirĂ©e avec sheet
en indiquant soit le nom de la feuille, soit sa position (premiùre, seconde, 
).

R> donnees <- read_excel("data/[Link]", sheet = 3)


donnees <- read_excel("data/[Link]", sheet = "mes_donnees")

On pourra préciser avec col_names si la premiÚre ligne contient le nom des variables.

Par défaut, read_excel va essayer de deviner le type (numérique, textuelle, date) de chaque colonne. Au
besoin, on pourra indiquer le type souhaité de chaque colonne avec col_types .

– 158 –
Import de données

RStudio propose Ă©galement pour les fichiers Excel un assitant d’importation, similaire Ă  celui pour les
fichiers texte, permettant de faciliter l’import.

NOTE

Une premiùre alternative est l’extenstion openxlsx et sa fonction [Link] .

Une seconde alternative est l’extension xlsx qui propose deux fonctions diffĂ©rentes pour importer
des fichiers Excel : [Link] et read.xlsx2 . La finalitĂ© est la mĂȘme mais leur fonctionnement
interne est diffĂ©rent. En cas de difficultĂ©s d’import, on pourra tester l’autre. Il est impĂ©ratif de spĂ©cifier
la position de la feuille de calculs que l’on souhaite importer.

R> library(xlsx)
donnees <- [Link]("data/[Link]", 1)

dBase
L’Insee et d’autres producteur de donnĂ©es diffusent leurs fichiers au format dBase (extension .dbf ).
Ceux-ci sont directement lisibles dans R avec la fonction [Link] de l’extension foreign.

R> library(foreign)
donnees <- [Link]("data/[Link]")

La principale limitation des fichiers dBase est de ne pas gérer plus de 256 colonnes. Les tables des
enquĂȘtes de l’Insee sont donc parfois dĂ©coupĂ©es en plusieurs fichiers .dbf qu’il convient de fusionner
avec la fonction merge . L’utilisation de cette fonction est dĂ©taillĂ©e dans le chapitre sur la fusion de tables,
page 277.

Feuille de calcul Google Sheets


Pour importer des données stockées sous formes de feuilles de calcul Google, on pourra se référer à
l’extension googlesheets.

– 159 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Données spatiales

Shapefile
Les fichiers Shapefile sont couramment utilisés pour échanger des données géoréférencées. La majorité
des logiciels de SIG (systĂšmes d’informations gĂ©ographiques) sont en capacitĂ© d’importer et d’exporter
des données dans ce format.

Un shapefile contient toute l’information liĂ©e Ă  la gĂ©omĂ©trie des objets dĂ©crits, qui peuvent ĂȘtre :

‱ des points
‱ des lignes
‱ des polygones

Son extension est classiquement .shp et il est toujours accompagnĂ© de deux autres fichiers de mĂȘme
nom et d’extensions :

‱ un fichier .dbf , qui contient les donnĂ©es attributaires relatives aux objets contenus dans le
shapefile
‱ un fichier .shx , qui stocke l’index de la gĂ©omĂ©trie

D’autres fichiers peuvent ĂȘtre Ă©galement fournis :

‱ .sbn et .sbx - index spatial des formes.


‱ .fbn et .fbx - index spatial des formes pour les shapefile en lecture seule
‱ .ain et .aih - index des attributs des champs actifs dans une table ou dans une table
d’attributs du thùme
‱ .prj - information sur le systĂšme de coordonnĂ©es
‱ .[Link] - mĂ©tadonnĂ©es du shapefile.
‱ .atx - fichier d’index des attributs pour le fichier .dbf
‱ .qix

En premier lieu, il importe que tous les fichiers qui compose un mĂȘme shapefile soit situĂ©s dans le mĂȘme
rĂ©pertoire et aient le mĂȘme nom (seule l’extension Ă©tant diffĂ©rente).

L’extension maptools fournit les fonctions permettant d’importer un shapefile dans R. Le rĂ©sultat obtenu
utilisera l’une des diffĂ©rentes classes spatiales fournies par l’extension sp.

La fonction gĂ©nĂ©rique d’import est readShapeSpatial :

– 160 –
Import de données

R> library(maptools)
donnees_spatiales <- readShapeSpatial("data/[Link]")

Si l’on connait dĂ©jĂ  le type de donnĂ©es du shapefile (points, lignes ou polygones), on pourra utiliser
directement readShapePoints , readShapeLines ou readShapePoly .

Rasters
Il existe de multiples formats pour stocker des donnĂ©es matricielles spatiales. L’un des plus communs est
le format ASCII grid aussi connu sous le nom de Arc/Info ASCII grid ou ESRI grid. L’extension de ce format
n’est pas toujours uniforme. On trouve parfois .asc ou encore .ag voir mĂȘme .txt .

Pour importer ce type de fichier, on pourra avoir recours à la fonction readAsciiGrid de l’extension
maptools. Le rĂ©sultat sera, par dĂ©faut, au format SpatialGridDataFrame de l’extension sp.

R> library(maptools)
donnees_spatiales <- readAsciiGrid("data/[Link]")

L’extension raster permet d’effectuer de multiples manipulations sur les donnĂ©es du type raster. Elle
est en capacitĂ© d’importer des donnĂ©es depuis diffĂ©rents formats (plus prĂ©cisĂ©ment les formats pris en
charge par la librairie GDAL, [Link]

De plus, les fichiers raster pouvant ĂȘtre particuliĂšrement volumineux (jusqu’à plusieurs Go de donnĂ©es),
l’extension raster est capable de travailler sur un fichier raster sans avoir Ă  le charger intĂ©gralement en
mémoire.

Pour plus d’informations, voir les fonctions raster et getValues .

Connexion à des bases de données

Interfaçage via l’extension DBI


R est capable de s’interfacer avec diffĂ©rents systĂšmes de bases de donnĂ©es relationnelles, dont SQLite,
MS SQL Server, PostgreSQL, MariaDB, etc.

Pour illustrer rapidement l’utilisation de bases de donnĂ©es, on va crĂ©er une base SQLite d’exemple Ă  l’aide
du code R suivant, qui copie la table du jeu de données mtcars dans une base de données [Link] :

[1] TRUE

– 161 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> library(DBI)
library(RSQLite)
con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "[Link]")
data(mtcars)
mtcars$name <- rownames(mtcars)
dbWriteTable(con, "mtcars", mtcars)
dbDisconnect(con)

Si on souhaite se connecter Ă  cette base de donnĂ©es par la suite, on peut utiliser l’extension DBI, qui
propose une interface générique entre **R// et différents systÚmes de bases de données. On doit aussi
avoir installĂ© et chargĂ© l’extension spĂ©cifique Ă  notre base, ici RSQLite. On commence par ouvrir une
connexion à l’aide de la fonction dbConnect de DBI :

R> library(DBI)
library(RSQLite)
con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "[Link]")

La connexion est stockĂ©e dans un objet con , qu’on va utiliser Ă  chaque fois qu’on voudra interroger la
base.

On peut vérifier la liste des tables présentes et les champs de ces tables avec dbListTables et
dbListFields :

R> dbListTables(con)

[1] "mtcars"

R> dbListFields(con, "mtcars")

[1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs"


[9] "am" "gear" "carb" "name"

On peut Ă©galement lire le contenu d’une table dans un objet de notre environnement avec
dbReadTable :

R> cars <- dbReadTable(con, "mtcars")

On peut Ă©galement envoyer une requĂȘte SQL directement Ă  la base et rĂ©cupĂ©rer le rĂ©sultat avec
dbGetQuery :

R> dbGetQuery(con, "SELECT * FROM mtcars WHERE cyl = 4")

– 162 –
Import de données

Enfin, quand on a terminĂ©, on peut se dĂ©connecter Ă  l’aide de dbDisconnect :

R> dbDisconnect(con)

Ceci n’est Ă©videmment qu’un tout petit aperçu des fonctionnalitĂ©s de DBI.

Utilisation de dplyr et dbplyr


L’extension dplyr est dĂ©diĂ©e Ă  la manipulation de donnĂ©es, elle est prĂ©sentĂ©e dans un chapitre dĂ©diĂ©,
page 241. En installant l’extension complĂ©mentaire dbplyr, on peut utiliser dplyr directement sur une
connection à une base de données générée par DBI :

R> library(DBI)
library(RSQLite)
library(dplyr)
con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "[Link]")

La fonction tbl notamment permet de créer un nouvel objet qui représente une table de la base de
données :

R> cars_tbl <- tbl(con, "mtcars")

I M P O R TA N T

Ici l’objet cars_tbl n’est pas un tableau de donnĂ©es, c’est juste un objet permettant d’interroger la
table de notre base de données.

On peut utiliser cet objet avec les verbes, page 241 de dplyr :

R> cars_tbl %>%


filter(cyl == 4) %>%
select(name, mpg, cyl)

dbplyr s’occupe, de maniĂšre transparente, de transformer les instructions dplyr en requĂȘte SQL,
d’interroger la base de donnĂ©es et de renvoyer le rĂ©sultat. De plus, tout est fait pour qu’un minimum
d’opĂ©rations sur la base, parfois coĂ»teuses en temps de calcul, ne soient effectuĂ©es.

– 163 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

I M P O R TA N T

Il est possible de modifier des objets de type tbl , par exemple avec mutate :

cars_tbl <- cars_tbl %>% mutate(type = "voiture")

Dans ce cas la nouvelle colonne type est bien créée et on peut y accéder par la suite. Mais cette
crĂ©ation se fait dans une table temporaire : elle n’existe que le temps de la connexion Ă  la base de
donnĂ©es. À la prochaine connexion, cette nouvelle colonne n’apparaĂźtra pas dans la table.

Bien souvent on utilisera une base de donnĂ©es quand les donnĂ©es sont trop volumineuses pour ĂȘtre
gérées par un ordinateur de bureau. Mais si les données ne sont pas trop importantes, il sera toujours plus
rapide de rĂ©cupĂ©rer l’intĂ©gralitĂ© de la table dans notre session R pour pouvoir la manipuler comme les
tableaux de données habituels. Ceci se fait grùce à la fonction collect de dplyr :

R> cars <- cars_tbl %>% collect()

Ici, cars est bien un tableau de données classique, copie de la table de la base au moment du collect .

Et dans tous les cas, on n’oubliera pas de se dĂ©connecter avec :

R> dbDisconnect(con)

Ressources
Pour plus d’informations, voir la documentation trĂšs complĂšte (en anglais) proposĂ©e par RStudio.

Par ailleurs, depuis la version 1.1, RStudio facilite la connexion à certaines bases de données grùce à
l’onglet Connections. Pour plus d’informations on pourra se rĂ©fĂ©rer Ă  l’article (en anglais) Using RStudio
Connections.

Autres sources
R offre de trĂšs nombreuses autres possibilitĂ©s pour accĂ©der aux donnĂ©es. Il est ainsi possible d’importer
des donnĂ©es depuis d’autres applications qui n’ont pas Ă©tĂ© Ă©voquĂ©es (Epi Info, S-Plus, etc.), de lire des
données via ODBC ou des connexions réseau, etc.

Pour plus d’informations on consultera le manuel R Data Import/Export :


[Link]

– 164 –
Import de données

La section Database Management du site Awesome R fournit Ă©galement une liste d’extensions permettant
de s’interfacer avec diffĂ©rents gestionnaires de bases de donnĂ©es.

Sauver ses données


R dispose également de son propre format pour sauvegarder et échanger des données. On peut sauver
n’importe quel objet créé avec R et il est possible de sauver plusieurs objets dans un mĂȘme fichier. L’usage
est d’utiliser l’extension .RData pour les fichiers de donnĂ©es R. La fonction Ă  utiliser s’appelle tout
simplement save .

Par exemple, si l’on souhaite sauvegarder son tableau de donnĂ©es d ainsi que les objets tailles et
poids dans un fichier [Link] :

R> save(d, tailles, poids, file = "[Link]")

À tout moment, il sera toujours possible de recharger ces donnĂ©es en mĂ©moire Ă  l’aide de la fonction
load :

R> load("[Link]")

I M P O R TA N T

Si entre temps vous aviez modifié votre tableau d , vos modifications seront perdues. En effet, si lors
du chargement de donnĂ©es, un objet du mĂȘme nom existe en mĂ©moire, ce dernier sera remplacĂ© par
l’objet importĂ©.

La fonction [Link] est un raccourci pour sauvergarder tous les objets de la session de travail dans
le fichier .RData (un fichier un peu Ă©trange car il n’a pas de nom mais juste une extension). Lors de la
fermeture de RStudio, il vous sera demandé si vous souhaitez enregistrer votre session. Si vous répondez
Oui, c’est cette fonction [Link] qui sera appliquĂ©e.

R> [Link]()

[1] FALSE

– 165 –
OĂč trouver de l’aide ?
Aide en ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Aide sur une fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Naviguer dans l’aide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Ressources sur le Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Moteur de recherche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Aide en ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
AntisĂšches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170
Ressources officielles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Ouvrages, blogs, MOOCs
 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171
Revue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
Ressources francophones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
OĂč poser des questions ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Les forums d’analyse-R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Discussion instantanée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Liste R-soc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Liste Quanti . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
StackOverflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Forum Web en français . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Canaux IRC (chat) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Listes de discussion officielles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
OĂč trouver des extensions intĂ©ressantes ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178

NOTE

La version originale de ce chapitre a été écrite par Julien Barnier dans le cadre du support de cours
Introduction Ă  R.

– 167 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Aide en ligne
R dispose d’une aide en ligne trĂšs complĂšte, mais dont l’usage n’est pas forcĂ©ment trĂšs simple. D’une
part car elle est intĂ©gralement en anglais, d’autre part car son organisation prend un certain temps Ă  ĂȘtre
maßtrisée.

Aide sur une fonction


La fonction la plus utile est sans doute help (ou son Ă©quivalent ? ) qui permet d’afficher la page d’aide
liĂ©e Ă  une ou plusieurs fonctions. Celle-ci permet de lister les arguments de la fonction, d’avoir des
informations dĂ©taillĂ©es sur son fonctionnement, les rĂ©sultats qu’elle retourne, etc.

Pour accĂ©der Ă  l’aide de la fonction mean , par exemple, il vous suffit de saisir directement :

R> ?mean

ou bien

R> help("mean")

Sous RStudio, la page d’aide correspondante s’affichera sous l’onglet Help dans le quadrant infĂ©rieur droit.

Chaque page d’aide comprend plusieurs sections, en particulier :

– 168 –
OĂč trouver de l’aide ?

Section Contenu

Description donne un résumé en une phrase de ce que fait la fonction

Usage indique la ou les maniùres de l’utiliser

Arguments détaille tous les arguments possibles et leur signification

Value indique la forme du résultat renvoyé par la fonction

Details apporte des précisions sur le fonctionnement de la fonction

Note pour des remarques éventuelles

References pour des références bibliographiques ou des URL associées

See Also trĂšs utile, renvoie vers d’autres fonctions semblables ou liĂ©es, ce qui peut ĂȘtre trĂšs
utile pour découvrir ou retrouver une fonction dont on a oublié le nom

Examples sĂ©rie d’exemples d’utilisation

Les exemples peuvent ĂȘtre directement exĂ©cutĂ©s en utilisant la fonction example :

R> example(mean)

mean> x <- c(0:10, 50)

mean> xm <- mean(x)

mean> c(xm, mean(x, trim = 0.10))


[1] 8.75 5.50

Naviguer dans l’aide


La fonction [Link] permet d’afficher le sommaire de l’aide en ligne. Saisissez simplement :

R> [Link]()

Si vous souhaitez rechercher quelque chose dans le contenu de l’aide, vous pouvez utiliser la fonction
[Link] (ou ?? qui est Ă©quivalente) qui renvoie une liste des pages d’aide contenant les termes
recherchés.

Par exemple :

– 169 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> [Link]("logistic")

ou

R> ??logistic

pour rechercher les pages de l’aide qui contiennent le terme logistic.

Ressources sur le Web


De nombreuses ressources existent en ligne, mais la plupart sont en anglais.

Citons tout d’abord Rzine, un site collaboratif et interdisciplinaire de rĂ©fĂ©rencement et de partage de


documentation sur la pratique de R en sciences humaines et sociales : [Link]

Moteur de recherche
Le fait que le logiciel s’appelle R ne facilite malheureusement pas les recherches sur le Web
 La solution
Ă  ce problĂšme a Ă©tĂ© trouvĂ©e grĂące Ă  la constitution d’un moteur de recherche ad hoc Ă  partir de Google,
nommé Rseek :
[Link]

Les requĂȘtes saisies dans Rseek sont exĂ©cutĂ©es dans des corpus prĂ©dĂ©finis liĂ©s Ă  R, notamment les
documents et manuels, les listes de discussion ou le code source du programme.

Les requĂȘtes devront cependant ĂȘtre formulĂ©es en anglais.

Aide en ligne
Les sites RDocumentation et [Link] proposent un accĂšs clair et rapide Ă  la documentation de R et des
extensions hébergées sur le CRAN (ainsi que certaines extensions hébergées sur GitHub). Il permettent
notamment de rechercher et naviguer facilement entre les pages des différentes fonctions :

‱ [Link]
‱ [Link]

AntisĂšches
RStudio propose plusieurs cheat sheets (antisĂšches) en anglais qui proposent sur deux pages une synthĂšse

– 170 –
OĂč trouver de l’aide ?

compacte de fonctions et de leur usage selon différentes thématiques, notamment :

‱ Manipulation des donnĂ©es avec dplyr


‱ Visualisation avec ggplot2
‱ Export avec RMarkdown
‱ etc.

La liste complĂšte est disponible en ligne :

[Link]

ou directement depuis RStudio, via le menu Help, puis Cheatsheets.

À noter que certaines antisĂšches sont Ă©galement disponibles en français.

Ressources officielles
La documentation officielle de R est accessible en ligne depuis le site du projet :
[Link]

Les liens de l’entrĂ©e Documentation du menu de gauche vous permettent d’accĂ©der Ă  diffĂ©rentes
ressources.

Manuels

Les manuels sont des documents complets de présentation de certains aspects de R. Ils sont accessibles en
ligne, ou téléchargeables au format PDF :
[Link]

On notera plus particuliÚrement An introduction to R, normalement destiné aux débutants, mais qui
nĂ©cessite quand mĂȘme un minimum d’aisance en informatique et en statistiques :
[Link]

R Data Import/Export explique notamment comment importer des donnĂ©es depuis d’autres logiciels :
[Link]

Ouvrages, blogs, MOOCs


Francophones

Parmi les ressources en français, on peut citer notamment R et espace, manuel d’initiation à la
programmation avec R appliquĂ© Ă  l’analyse de l’information gĂ©ographique, librement tĂ©lĂ©chargeable en
ligne.

– 171 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

La trĂšs bonne Introduction Ă  R et au tidyverse de Julien Barnier disponible sur [Link]


tidyverse/.

La section Contributed documentation du site officiel de R contient également des liens vers différents
documents en français, plus ou moins accessibles et plus ou moins récemment mis à jour.

Le pĂŽle bioinformatique lyonnais (PBIL) propose depuis longtemps une somme trĂšs importante de
documents, qui comprend des cours complets de statistiques utilisant R :

‱ [Link]

Plusieurs blogs francophones autour de R sont également actifs, parmi lesquels :

‱ ElementR, le blog du groupe du mĂȘme nom, qui propose de nombreuses ressources sur R en
gĂ©nĂ©ral et en particulier sur la cartographie ou l’analyse de rĂ©seaux.
‱ R-atique, blog animĂ© par Lise Vaudor, propose rĂ©guliĂšrement des articles intĂ©ressants et
accessibles sur des mĂ©thodes d’analyse ou sur des extensions R.

Enfin, le site France Université Numérique propose réguliÚrement des sessions de cours en ligne, parmi
lesquels une Introduction Ă  la statistique avec R et un cours sur l’Analyse des donnĂ©es
multidimensionnelles.

On peut aussi citer :

‱ Logiciel R et programmation par @3wen


‱ Programmer en R, wikibook collaboratif (licence CC-BY-SA)
‱ R et espace : manuel d’initiation Ă  la programmation avec R appliquĂ© Ă  l’analyse de l’information
géographique, librement téléchargeable en ligne.
‱ Introduction à la programmation en R
‱ C’est l’enfeR donne des exemples de code simple avec R qui donnent des rĂ©sultats surprenants.

Et enfin, une liste de ressources francophones : [Link]

Anglophones

Les ressources anglophones sont évidemment trÚs nombreuses.

On citera essentiellement l’ouvrage en ligne R for data science, trùs complet, et qui fournit une
introduction trÚs complÚte et progressive à R, et aux packages du tidyverse. Il existe également en version
papier.

Pour aborder des aspects beaucoup plus avancĂ©s, l’ouvrage Ă©galement en ligne Advanced R, d’Hadley
Wickham, est extrĂȘmement bien et fait et trĂšs complet.

L’ouvrage en ligne The Epidemiologist R Handbook: R for applied epidemiology and public health est trùs
complet et pourra Ă©galement ĂȘtre utile Ă  des chercheur·e·s d’autres disciplines.

On notera Ă©galement l’existence du R journal, revue en ligne consacrĂ©e Ă  R, et qui propose rĂ©guliĂšrement

– 172 –
OĂč trouver de l’aide ?

des articles sur des mĂ©thodes d’analyse, des extensions, et l’actualitĂ© du langage.

La plateforme R-bloggers agrĂšge les contenus de plusieurs centaines de blogs parlant de R, trĂšs pratique
pour suivre l’actualitĂ© de la communautĂ©.

Enfin, sur Twitter, les échanges autour de R sont regroupés autour du hashtag #rstats.

On peut aussi citer le site Awesome R ([Link] qui fournit une liste
d’extensions choisies et triĂ©es par thĂ©matique et le site R Data Science Tutorials qui recense des tutoriels
en anglais.

FAQ

Les FAQ (frequently asked questions) regroupent des questions frĂ©quemment posĂ©es et leurs rĂ©ponses. À
lire donc ou, au moins, Ă  parcourir avant toute chose :
[Link]

La FAQ la plus utile est la FAQ généraliste sur R :


[Link]

Mais il existe également une FAQ dédiée aux questions liées à Windows et une autre à la plateforme Mac
OS X.

NOTE

Les manuels et les FAQ sont accessibles mĂȘme si vous n’avez pas d’accĂšs Ă  Internet en utilisant la
fonction [Link] décrite précédemment.

R-announce

R-announce est la liste de diffusion Ă©lectronique officielle du projet. Elle ne comporte qu’un nombre
réduit de messages (quelques-uns par mois tout au plus) et diffuse les annonces concernant de nouvelles
versions de R ou d’autres informations particuliùrement importantes. On peut s’y abonner à l’adresse
suivante :
[Link]

R Journal

R Journal est la « revue » officielle du projet R, qui a succédé début 2009 à la lettre de nouvelles R News.
Elle paraĂźt entre deux et cinq fois par an et contient des informations sur les nouvelles versions du logiciel,
des articles prĂ©sentant des extensions, des exemples d’analyse
 Les parutions sont annoncĂ©es sur la liste
de diffusion R-announce et les numĂ©ros sont tĂ©lĂ©chargeables Ă  l’adresse suivante :

– 173 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

[Link]

Autres documents

On trouvera de nombreux documents dans différentes langues, en général au format PDF, dans le
répertoire suivant :
[Link]

Parmi ceux-ci, les cartes de rĂ©fĂ©rence peuvent ĂȘtre trĂšs utiles, ce sont des aides-mĂ©moire recensant les
fonctions les plus courantes :
[Link]

On notera Ă©galement un document d’introduction en anglais progressif et s’appuyant sur des mĂ©thodes
statistiques relativement simples :
[Link]

Pour les utilisateurs déjà habitués à SAS ou SPSS, le livre R for SAS and SPSS Users et le document gratuit
qui en est tirĂ© peuvent ĂȘtre de bonnes ressources, tout comme le site web Quick-R :
[Link] et [Link]

Revue
La revue Journal of Statistical Software est une revue électronique anglophone, dont les articles sont en
accĂšs libre, et qui traite de l’utilisation de logiciels d’analyse de donnĂ©es dans un grand nombre de
domaines. De nombreux articles (la majoritĂ©) sont consacrĂ©s Ă  R et Ă  la prĂ©sentation d’extensions plus ou
moins spécialisées.

Les articles qui y sont publiés prennent souvent la forme de tutoriels plus ou moins accessibles mais qui
fournissent souvent une bonne introduction et une ressource riche en informations et en liens.

Adresse de la revue :
[Link]

Ressources francophones
Il existe des ressources en français sur l’utilisation de R, mais peu sont rĂ©ellement destinĂ©es aux
débutants, elles nécessitent en général des bases à la fois en informatique et en statistique.

Le document le plus abordable et le plus complet est sans doute R pour les dĂ©butants, d’Emmanuel Paradis,
accessible au format PDF :
[Link]

La somme de documentation en français la plus importante liée à R est sans nulle doute celle mise à

– 174 –
OĂč trouver de l’aide ?

disposition par le PĂŽle bioinformatique lyonnais. Leur site propose des cours complets de statistique
utilisant R :
[Link]

La plupart des documents sont assez pointus niveau mathématique et plutÎt orientés biostatistique, mais
on trouvera des documents plus introductifs ici :
[Link]

Dans tous les cas la somme de travail et de connaissances mise Ă  disposition librement est
impressionnante
 Enfin, le site de Vincent Zoonekynd ([Link]
[Link]) comprend de nombreuses notes prises au cours de sa découverte du logiciel. On notera
cependant que l’auteur est normalien et docteur en mathĂ©matiques


RStudio
La documentation officielle de RStudio est disponible sur [Link] (catégorie
Documentation disponible en milieu de page).

OĂč poser des questions ?


La communauté des utilisateurs de R est trÚs active et en général trÚs contente de pouvoir répondre
aux questions (nombreuses) des débutants et à celles (tout aussi nombreuses) des utilisateurs plus
expérimentés. Dans tous les cas, les rÚgles de base à respecter avant de poser une question sont toujours
les mĂȘmes : avoir cherchĂ© soi-mĂȘme la rĂ©ponse auparavant, notamment dans les FAQ et dans l’aide en
ligne, et poser sa question de la maniÚre la plus claire possible, de préférence avec un exemple de code
posant problĂšme.

Les forums d’analyse-R


En premier lieu (autopromotion oblige), chaque chapitre du site d’analyse-R ([Link]
analyse-R/) comporte en bas de page une fonctionnalité permettant de laisser des commentaires. On peut
donc y poser une question en lien avec le chapitre concerné.

Discussion instantanée
Grrr (“pour quand votre R fait Grrr”) est un groupe Slack (plateforme de discussion instantanĂ©e)
francophone dĂ©diĂ© aux Ă©changes et Ă  l’entraide autour de R. Il est ouvert Ă  tous et se veut accessible aux
dĂ©butants. Vous pouvez mĂȘme utiliser un pseudonyme si vous prĂ©fĂ©rez.

– 175 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Pour rejoindre la discussion, il suffit de suivre le lien d’invitation suivant :

[Link]

Liste R-soc
Une liste de discussion a Ă©tĂ© créée spĂ©cialement pour permettre aide et Ă©changes autour de l’utilisation
de R en sciences sociales. Elle est hĂ©bergĂ©e par RENATER et on peut s’y abonner Ă  l’adresse suivante :
[Link]

GrĂące aux services offerts par le site [Link], la liste est Ă©galement disponible sous d’autres formes
(forum Web, blog, NNTP, flux RSS) permettant de lire et de poster sans avoir à s’inscrire et à recevoir les
messages sous forme de courrier Ă©lectronique. Pour plus d’informations :
[Link]

Liste Quanti
La liste Quanti Ă©galement hĂ©bergĂ©e par Renater a pour vocation d’accueillir les contributions et les
Ă©changes de toutes celles et tous ceux qui s’intĂ©ressent aux questions d’enseignement des mĂ©thodes
quantitatives dans les sciences sociales. Cela inclue l’usage de R.

Pour s’abonner : [Link]

StackOverflow
Le site StackOverflow (qui fait partie de la famille des sites StackExchange) comprend une section
(anglophone) dĂ©diĂ©e Ă  R qui permet de poser des questions et en gĂ©nĂ©ral d’obtenir des rĂ©ponses assez
rapidement :
[Link]

La premiĂšre chose Ă  faire, Ă©videmment, est de vĂ©rifier que sa question n’a pas dĂ©jĂ  Ă©tĂ© posĂ©e.

Forum Web en français


Le Cirad a mis en ligne un forum dédié aux utilisateurs de R, trÚs actif :
[Link]

Les questions diverses et variĂ©es peuvent ĂȘtre posĂ©es dans la rubrique Questions en cours :
[Link]

Il est tout de mĂȘme conseillĂ© de faire une recherche rapide sur le forum avant de poser une question, pour

– 176 –
OĂč trouver de l’aide ?

voir si la rĂ©ponse ne s’y trouverait pas dĂ©jĂ .

Canaux IRC (chat)


L’IRC, ou Internet Relay Chat est le vĂ©nĂ©rable ancĂȘtre toujours trĂšs actif des messageries instantanĂ©es
actuelles. Un canal (en anglais) est notamment dédié aux échanges autour de R ( #R ).

Si vous avez dĂ©jĂ  l’habitude d’utiliser IRC, il vous suffit de pointer votre client prĂ©fĂ©rĂ© sur Freenode
( [Link] ) puis de rejoindre l’un des canaux en question.

Sinon, le plus simple est certainement d’utiliser l’interface web de Mibbit, accessible à l’adresse
[Link]

Dans le champ Connect to IRC, sélectionnez [Link], puis saisissez un pseudonyme dans le champ Nick
et #R dans le champ Channel. Vous pourrez alors discuter directement avec les personnes présentes.

Le canal #R est normalement peuplé de personnes qui seront trÚs heureuses de répondre à toutes les
questions, et en gĂ©nĂ©ral l’ambiance y est trĂšs bonne. Une fois votre question posĂ©e, n’hĂ©sitez pas Ă  ĂȘtre
patient et Ă  attendre quelques minutes, voire quelques heures, le temps qu’un des habituĂ©s vienne y faire
un tour.

Listes de discussion officielles


La liste de discussion d’entraide (par courrier Ă©lectronique) officielle du logiciel R s’appelle R-help. On peut
s’y abonner à l’adresse suivante, mais il s’agit d’une liste avec de nombreux messages :
[Link]

Pour une consultation ou un envoi ponctuels, le mieux est sans doute d’utiliser les interfaces Web fournies
par [Link] :
[Link]

R-help est une liste avec de nombreux messages, suivie par des spécialistes de R, dont certains des
développeurs principaux. Elle est cependant à réserver aux questions particuliÚrement techniques qui
n’ont pas trouvĂ© de rĂ©ponses par d’autres biais.

Dans tous les cas, il est nécessaire avant de poster sur cette liste de bien avoir pris connaissance du posting
guide correspondant :
[Link]

Plusieurs autres listes plus spĂ©cialisĂ©es existent Ă©galement, elles sont listĂ©es Ă  l’adresse suivante :
[Link]

– 177 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

OĂč trouver des extensions intĂ©ressantes ?


Il existe plusieurs milliers d’extensions pour R, et il n’est pas toujours facile de savoir laquelle choisir pour
une tùche donnée.

Si un des meilleurs moyens reste le bouche Ă  oreille, on peut aussi se reporter Ă  la page CRAN Task
view qui liste un certain nombre de domaines (classification, sciences sociales, séries temporelles
) et
indique, pour chacun d’entre eux, une liste d’extensions potentiellement intĂ©ressantes accompagnĂ©es
d’une courte description. On peut mĂȘme installer l’ensemble des extensions d’une catĂ©gorie avec la
fonction [Link]() .

Une autre possibilitĂ© est de consulter la page listant l’ensemble des packages existant. S’il n’est
Ă©videmment pas possible de passer en revue les milliers d’extensions une Ă  une, on peut toujours effectuer
une recherche dans la page avec des mots-clés correspondant aux fonctionnalités recherchées.

Un autre site intéressant est Awesome R, une liste élaborée collaborativement des extensions les plus
utiles ou les plus populaires classées par grandes catégories : manipulation des données, graphiques
interactifs, etc.

La page frrrenchies liste des packages pouvant ĂȘtre utiles pour des utilisateurs français (gĂ©olocalisation,
traitement du langage, accùs à des API
), ainsi que des ressources francophones.

Enfin, certaines extensions fournissent des “galeries” permettant de repĂ©rer ou dĂ©couvrir certains
packages. C’est notamment le cas de htmlwidgets , qui propose une galerie d’extensions proposant des
graphiques interactifs, ou de R Markdown.

– 178 –
Visualiser ses données
Inspection visuelle des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
str . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183
glimpse (dplyr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
look_for (labelled) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185
describe (questionr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
Addins de codebook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
skim (skimr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
create_report (DataExplorer) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
makeCodebook (dataMaid) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
scan_data (pointblank) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

Au fil des différents chapitres, nous avons abordé diverses fonctions utiles au quotidien et permettant de
visualiser ses données. Ce chapitre se propose de les regrouper.

Chargeons tout d’abord quelques fichiers de donnĂ©es Ă  titre d’exemple.

R> library(questionr)
data(hdv2003)
data(fecondite)

R> load(url("[Link]
a"))

Inspection visuelle des données


La particularitĂ© de R par rapport Ă  d’autres logiciels comme Modalisa ou SPSS est de ne pas proposer,
par dĂ©faut, de vue des donnĂ©es sous forme de tableau. Ceci peut parfois ĂȘtre un peu dĂ©stabilisant dans
les premiers temps d’utilisation, mĂȘme si l’on perd vite l’habitude et qu’on finit par se rendre compte que
« voir » les donnĂ©es n’est pas forcĂ©ment un gage de productivitĂ© ou de rigueur dans le traitement.

– 179 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

NĂ©anmoins, R propose une interface permettant de visualiser le contenu d’un tableau de donnĂ©es Ă  l’aide
de la fonction View :

R> View(hdv2003)

Sous RStudio, on peut aussi afficher la visionneusee (viewer) en cliquant sur la petite icĂŽne en forme
de tableau situĂ©e Ă  droite de la ligne d’un tableau de donnĂ©es dans l’onglet Environment du quadrant
supérieur droit (cf. figure ci-aprÚs).

Icîne pour afficher une vue du contenu d’un tableau

Figure 1. Icîne pour afficher une vue du contenu d’un tableau

Dans tous les cas, RStudio lancera le viewer dans un onglet dédié dans le quadrant supérieur gauche. Le
visualiseur de RStudio est plus avancé que celui-de base fournit par R. Il est possible de trier les données
selon une variable en cliquant sur le nom de cette derniÚre. Il y a également un champs de recherche et un
bouton Filter donnant accÚs à des options de filtrage avancées.

– 180 –
Visualiser ses données

La visionneuse de données de RStudio

Figure 2. La visionneuse de données de RStudio

summary
La fonction summary permet d’avoir une vue rĂ©sumĂ©e d’une variable. Elle s’applique Ă  tout type d’objets
(y compris un tableau de donnĂ©es entier) et s’adapte Ă  celui-ci.

R> summary(hdv2003$age)

Min. 1st Qu. Median Mean 3rd Qu. Max.


18.00 35.00 48.00 48.16 60.00 97.00

R> summary(hdv2003$qualif)

Ouvrier specialise Ouvrier qualifie


203 292
Technicien Profession intermediaire
86 160
Cadre Employe
260 594
Autre NA's
58 347

– 181 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> summary(hdv2003)

id age sexe
Min. : 1.0 Min. :18.00 Homme: 899
1st Qu.: 500.8 1st Qu.:35.00 Femme:1101
Median :1000.5 Median :48.00
Mean :1000.5 Mean :48.16
3rd Qu.:1500.2 3rd Qu.:60.00
Max. :2000.0 Max. :97.00

nivetud
Enseignement technique ou professionnel court :463
Enseignement superieur y compris technique superieur:441
Derniere annee d'etudes primaires :341
1er cycle :204
2eme cycle :183
(Other) :256
NA's :112
poids occup
Min. : 78.08 Exerce une profession:1049
1st Qu.: 2221.82 Chomeur : 134
Median : 4631.19 Etudiant, eleve : 94
Mean : 5535.61 Retraite : 392
3rd Qu.: 7626.53 Retire des affaires : 77
Max. :31092.14 Au foyer : 171
Autre inactif : 83
qualif [Link]
Employe :594 Min. : 0.000
Ouvrier qualifie :292 1st Qu.: 1.000
Cadre :260 Median : 2.000
Ouvrier specialise :203 Mean : 3.283
Profession intermediaire:160 3rd Qu.: 5.000
(Other) :144 Max. :22.000
NA's :347
clso relig
Oui : 936 Pratiquant regulier :266
Non :1037 Pratiquant occasionnel :442
Ne sait pas: 27 Appartenance sans pratique :760
Ni croyance ni appartenance:399
Rejet : 93
NSP ou NVPR : 40

[Link] [Link]
Le plus important : 29 Satisfaction :480
Aussi important que le reste:259 Insatisfaction:117
Moins important que le reste:708 Equilibre :451

– 182 –
Visualiser ses données

Peu important : 52 NA's :952


NA's :952

[Link] [Link] [Link] cuisine bricol


Non:1986 Non:1953 Non:1776 Non:1119 Non:1147
Oui: 14 Oui: 47 Oui: 224 Oui: 881 Oui: 853

cinema sport [Link]


Non:1174 Non:1277 Min. : 0.000
Oui: 826 Oui: 723 1st Qu.: 1.000
Median : 2.000
Mean : 2.247
3rd Qu.: 3.000
Max. :12.000
NA's :5

str
La fonction str est plus complÚte que names . Elle liste les différentes variables, indique leur type et
donne le cas Ă©chĂ©ant des informations supplĂ©mentaires ainsi qu’un Ă©chantillon des premiĂšres valeurs
prises par cette variable :

R> str(hdv2003)

'[Link]': 2000 obs. of 20 variables:


$ id : int 1 2 3 4 5 6 7 8 9 10 ...
$ age : int 28 23 59 34 71 35 60 47 20 28 ...
$ sexe : Factor w/ 2 levels "Homme","Femme": 2 2 1 1 2 2 2 1 2 1 ...
$ nivetud : Factor w/ 8 levels "N'a jamais fait d'etudes",..: 8 NA 3 8 3 6
3 6 NA 7 ...
$ poids : num 2634 9738 3994 5732 4329 ...
$ occup : Factor w/ 7 levels "Exerce une profession",..: 1 3 1 1 4 1 6 1
3 1 ...
$ qualif : Factor w/ 7 levels "Ouvrier specialise",..: 6 NA 3 3 6 6 2 2 N
A 7 ...
$ [Link]: int 8 2 2 1 0 5 1 5 4 2 ...
$ clso : Factor w/ 3 levels "Oui","Non","Ne sait pas": 1 1 2 2 1 2 1 2
1 2 ...

– 183 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

$ relig : Factor w/ 6 levels "Pratiquant regulier",..: 4 4 4 3 1 4 3 4 3


2 ...
$ [Link] : Factor w/ 4 levels "Le plus important",..: 4 NA 2 3 NA 1 NA 4
NA 3 ...
$ [Link] : Factor w/ 3 levels "Satisfaction",..: 2 NA 3 1 NA 3 NA 2 NA 1
...
$ [Link] : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
$ [Link] : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
$ [Link] : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 2 2 1 1 ...
$ cuisine : Factor w/ 2 levels "Non","Oui": 2 1 1 2 1 1 2 2 1 1 ...
$ bricol : Factor w/ 2 levels "Non","Oui": 1 1 1 2 1 1 1 2 1 1 ...
$ cinema : Factor w/ 2 levels "Non","Oui": 1 2 1 2 1 2 1 1 2 2 ...
$ sport : Factor w/ 2 levels "Non","Oui": 1 2 2 2 1 2 1 1 1 2 ...
$ [Link] : num 0 1 0 2 3 2 2.9 1 2 2 ...

I M P O R TA N T

La fonction str est essentielle à connaütre et peut s’appliquer à n’importe quel type d’objet. C’est un
excellent moyen de connaĂźtre en dĂ©tail la structure d’un objet. Cependant, les rĂ©sultats peuvent ĂȘtre
parfois trop détaillés et on lui priviligiera dans certains cas les fonctions suivantes.

glimpse (dplyr)
L’extension dplyr (voir le chapitre dĂ©diĂ©, page 241), propose une fonction glimpse (ce qui signifie
«aperçu» en anglais) qui permet de visualiser rapidement et de maniĂšre condensĂ©e le contenu d’un
tableau de données.

R> library(dplyr)
glimpse(hdv2003)

Rows: 2,000
Columns: 20
$ id <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 1

$ age <int> 28, 23, 59, 34, 71, 35, 60, 47, 20, 

$ sexe <fct> Femme, Femme, Homme, Homme, Femme, F

$ nivetud <fct> "Enseignement superieur y compris te

$ poids <dbl> 2634.3982, 9738.3958, 3994.1025, 573

$ occup <fct> "Exerce une profession", "Etudiant, 

$ qualif <fct> Employe, NA, Technicien, Technicien,

$ [Link] <int> 8, 2, 2, 1, 0, 5, 1, 5, 4, 2, 3, 4, 


– 184 –
Visualiser ses données

$ clso <fct> Oui, Oui, Non, Non, Oui, Non, Oui, N



$ relig <fct> Ni croyance ni appartenance, Ni croy

$ [Link] <fct> Peu important, NA, Aussi important q

$ [Link] <fct> Insatisfaction, NA, Equilibre, Satis

$ [Link] <fct> Non, Non, Non, Non, Non, Non, Non, N

$ [Link] <fct> Non, Non, Non, Non, Non, Non, Non, N

$ [Link] <fct> Non, Non, Non, Non, Non, Non, Oui, O

$ cuisine <fct> Oui, Non, Non, Oui, Non, Non, Oui, O

$ bricol <fct> Non, Non, Non, Oui, Non, Non, Non, O

$ cinema <fct> Non, Oui, Non, Oui, Non, Oui, Non, N

$ sport <fct> Non, Oui, Oui, Oui, Non, Oui, Non, N

$ [Link] <dbl> 0.0, 1.0, 0.0, 2.0, 3.0, 2.0, 2.9, 1


look_for (labelled)
L’extension labelled propose une fonction look_for , inspirĂ©e de Stata, qui permet de lister les
diffĂ©rentes variables d’un fichier de donnĂ©es, ainsi que leurs principales caractĂ©ristiques :

R> library(labelled)
look_for(hdv2003)

pos variable label col_type values

<chr> <chr> <chr> <chr> <chr>

1 id — int range: 1 - 2000

2 age — int range: 18 - 97

3 sexe — fct Homme

Femme

4 nivetud — fct N'a jamais fait d'etudes

A arrete ses etudes, avant la derniere annee


d'etudes primaires
Derniere annee d'etudes primaires

1er cycle

2eme cycle

– 185 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Enseignement technique ou professionnel court

Enseignement technique ou professionnel long

Enseignement superieur y compris technique su


perieur
5 poids — dbl range: 78.0783403 - 31092.14132

6 occup — fct Exerce une profession

Chomeur

Etudiant, eleve

Retraite

Retire des affaires

Au foyer

Autre inactif

7 qualif — fct Ouvrier specialise

Ouvrier qualifie

Technicien

Profession intermediaire

Cadre

Employe

Autre

8 [Link] — int range: 0 - 22

9 clso — fct Oui

Non

Ne sait pas

10 relig — fct Pratiquant regulier

Pratiquant occasionnel

– 186 –
Visualiser ses données

Appartenance sans pratique

Ni croyance ni appartenance

Rejet

NSP ou NVPR

11 [Link] — fct Le plus important

Aussi important que le reste

Moins important que le reste

Peu important

12 [Link] — fct Satisfaction

Insatisfaction

Equilibre

13 [Link] — fct Non

Oui

14 [Link] — fct Non

Oui

15 [Link] — fct Non

Oui

16 cuisine — fct Non

Oui

17 bricol — fct Non

Oui

18 cinema — fct Non

Oui

– 187 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

19 sport — fct Non

Oui

20 [Link] — dbl range: 0 - 12

Lorsque l’on a un gros tableau de donnĂ©es avec de nombreuses variables, il peut ĂȘtre difficile de retrouver
la ou les variables d’intĂ©rĂȘt. Il est possible d’indiquer Ă  look_for un mot-clĂ© pour limiter la recherche.
Par exemple :

R> look_for(hdv2003, "trav")

pos variable label col_type values


<chr> <chr> <chr> <chr> <chr>
11 [Link] — fct Le plus important
Aussi important que le reste
Moins important que le reste
Peu important
12 [Link] — fct Satisfaction
Insatisfaction
Equilibre

Il est à noter que si la recherche n’est pas sensible à la casse (i.e. aux majuscules et aux minuscules), elle est
sensible aux accents. Il est aussi possible de fournir plusieurs expressions de recherche.

La fonction look_for est par ailleurs compatible avec les Ă©tiquettes de variable de l’extension labelled,
les Ă©tiquettes Ă©tant prise en compte dans la recherche d’une variable.

R> look_for(femmes, "rés")

pos variable label col_type values


<chr> <chr> <chr> <chr> <chr>
7 milieu Milieu de résidence dbl+lbl [1] urbain
[2] rural
8 region Région de résidence dbl+lbl [1] Nord
[2] Est
[3] Sud
[4] Ouest

R> look_for(femmes, "rés", "nb")

pos variable label col_type values

– 188 –
Visualiser ses données

<chr> <chr> <chr> <chr> <chr>


7 milieu Milieu de résidence dbl+lbl [1] urbain
[2] rural
8 region Région de résidence dbl+lbl [1] Nord
[2] Est
[3] Sud
[4] Ouest
16 nb_enf_ideal Nombre idéal d'enfants dbl+lbl [96] Ne sait pas
[99] manquant

À noter, le rĂ©sultat renvoyĂ© par look_for est un tableau de donnĂ©es qui peut ensuite ĂȘtre aisĂ©ment
manipulĂ© (voir l’aide de la fonction).

describe (questionr)
L’extension questionr fournit Ă©galement une fonction bien pratique pour dĂ©crire les diffĂ©rentes variables
d’un tableau de donnĂ©es. Il s’agit de describe . Faisons de suite un essai :

R> describe(hdv2003)

[2000 obs. x 20 variables] tbl_df tbl [Link]

$id:
integer: 1 2 3 4 5 6 7 8 9 10 ...
min: 1 - max: 2000 - NAs: 0 (0%) - 2000 unique values

$age:
integer: 28 23 59 34 71 35 60 47 20 28 ...
min: 18 - max: 97 - NAs: 0 (0%) - 78 unique values

$sexe:
nominal factor: "Femme" "Femme" "Homme" "Homme" "Femme" "Femme" "Femme" "Homme"
"Femme" "Homme" ...
2 levels: Homme | Femme
NAs: 0 (0%)

$nivetud:
nominal factor: "Enseignement superieur y compris technique superieur" NA "Derni
ere annee d'etudes primaires" "Enseignement superieur y compris technique superi
eur" "Derniere annee d'etudes primaires" "Enseignement technique ou professionne
l court" "Derniere annee d'etudes primaires" "Enseignement technique ou professi
onnel court" NA "Enseignement technique ou professionnel long" ...
8 levels: N'a jamais fait d'etudes | A arrete ses etudes, avant la derniere anne

– 189 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

e d'etudes primaires | Derniere annee d'etudes primaires | 1er cycle | 2eme cycl
e | Enseignement technique ou professionnel court | Enseignement technique ou pr
ofessionnel long | Enseignement superieur y compris technique superieur
NAs: 112 (5.6%)

$poids:
numeric: 2634.3982157 9738.3957759 3994.1024587 5731.6615081 4329.0940022 8674.6
993828 6165.8034861 12891.640759 7808.8720636 2277.160471 ...
min: 78.0783403 - max: 31092.14132 - NAs: 0 (0%) - 1877 unique values

$occup:
nominal factor: "Exerce une profession" "Etudiant, eleve" "Exerce une professio
n" "Exerce une profession" "Retraite" "Exerce une profession" "Au foyer" "Exerce
une profession" "Etudiant, eleve" "Exerce une profession" ...
7 levels: Exerce une profession | Chomeur | Etudiant, eleve | Retraite | Retire
des affaires | Au foyer | Autre inactif
NAs: 0 (0%)

$qualif:
nominal factor: "Employe" NA "Technicien" "Technicien" "Employe" "Employe" "Ouvr
ier qualifie" "Ouvrier qualifie" NA "Autre" ...
7 levels: Ouvrier specialise | Ouvrier qualifie | Technicien | Profession interm
ediaire | Cadre | Employe | Autre
NAs: 347 (17.3%)

$[Link]:
integer: 8 2 2 1 0 5 1 5 4 2 ...
min: 0 - max: 22 - NAs: 0 (0%) - 19 unique values

$clso:
nominal factor: "Oui" "Oui" "Non" "Non" "Oui" "Non" "Oui" "Non" "Oui" "Non" ...
3 levels: Oui | Non | Ne sait pas
NAs: 0 (0%)

$relig:
nominal factor: "Ni croyance ni appartenance" "Ni croyance ni appartenance" "Ni
croyance ni appartenance" "Appartenance sans pratique" "Pratiquant regulier" "Ni
croyance ni appartenance" "Appartenance sans pratique" "Ni croyance ni apparten
ance" "Appartenance sans pratique" "Pratiquant occasionnel" ...
6 levels: Pratiquant regulier | Pratiquant occasionnel | Appartenance sans prati
que | Ni croyance ni appartenance | Rejet | NSP ou NVPR
NAs: 0 (0%)

$[Link]:
nominal factor: "Peu important" NA "Aussi important que le reste" "Moins importa
nt que le reste" NA "Le plus important" NA "Peu important" NA "Moins important q
ue le reste" ...

– 190 –
Visualiser ses données

4 levels: Le plus important | Aussi important que le reste | Moins important que
le reste | Peu important
NAs: 952 (47.6%)

$[Link]:
nominal factor: "Insatisfaction" NA "Equilibre" "Satisfaction" NA "Equilibre" NA
"Insatisfaction" NA "Satisfaction" ...
3 levels: Satisfaction | Insatisfaction | Equilibre
NAs: 952 (47.6%)

$[Link]:
nominal factor: "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" ...
2 levels: Non | Oui
NAs: 0 (0%)

$[Link]:
nominal factor: "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" ...
2 levels: Non | Oui
NAs: 0 (0%)

$[Link]:
nominal factor: "Non" "Non" "Non" "Non" "Non" "Non" "Oui" "Oui" "Non" "Non" ...
2 levels: Non | Oui
NAs: 0 (0%)

$cuisine:
nominal factor: "Oui" "Non" "Non" "Oui" "Non" "Non" "Oui" "Oui" "Non" "Non" ...
2 levels: Non | Oui
NAs: 0 (0%)

$bricol:
nominal factor: "Non" "Non" "Non" "Oui" "Non" "Non" "Non" "Oui" "Non" "Non" ...
2 levels: Non | Oui
NAs: 0 (0%)

$cinema:
nominal factor: "Non" "Oui" "Non" "Oui" "Non" "Oui" "Non" "Non" "Oui" "Oui" ...
2 levels: Non | Oui
NAs: 0 (0%)

$sport:
nominal factor: "Non" "Oui" "Oui" "Oui" "Non" "Oui" "Non" "Non" "Non" "Oui" ...
2 levels: Non | Oui
NAs: 0 (0%)

$[Link]:
numeric: 0 1 0 2 3 2 2.9 1 2 2 ...

– 191 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

min: 0 - max: 12 - NAs: 5 (0.2%) - 30 unique values

Comme on le voit sur cet exemple, describe nous affiche le type des variables, les premiĂšres valeurs de
chacune, le nombre de valeurs manquantes, le nombre de valeurs différentes (uniques) ainsi que quelques
autres informations suivant le type de variables.

Il est possible de restreindre l’affichage à seulement quelques variables en indiquant le nom de ces
derniĂšres ou une expression de recherche (comme avec lookfor ).

R> describe(hdv2003, "age", "trav")

[2000 obs. x 20 variables] tbl_df tbl [Link]

$age:
integer: 28 23 59 34 71 35 60 47 20 28 ...
min: 18 - max: 97 - NAs: 0 (0%) - 78 unique values

$[Link]:
nominal factor: "Peu important" NA "Aussi important que le reste" "Moins importa
nt que le reste" NA "Le plus important" NA "Peu important" NA "Moins important q
ue le reste" ...
4 levels: Le plus important | Aussi important que le reste | Moins important que
le reste | Peu important
NAs: 952 (47.6%)

$[Link]:
nominal factor: "Insatisfaction" NA "Equilibre" "Satisfaction" NA "Equilibre" NA
"Insatisfaction" NA "Satisfaction" ...
3 levels: Satisfaction | Insatisfaction | Equilibre
NAs: 952 (47.6%)

On peut également transmettre juste une variable :

R> describe(hdv2003$sexe)

[2000 obs.]
nominal factor: "Femme" "Femme" "Homme" "Homme" "Femme" "Femme" "Femme" "Homme"
"Femme" "Homme" ...
2 levels: Homme | Femme
NAs: 0 (0%)

n %
Homme 899 45
Femme 1101 55

– 192 –
Visualiser ses données

Total 2000 100

Enfin, describe est également compatible avec les vecteurs labellisés, page 121.

R> describe(femmes, "milieu")

[2000 obs. x 17 variables] tbl_df tbl [Link]

$milieu: Milieu de résidence


labelled double: 2 2 2 2 2 2 2 2 2 2 ...
min: 1 - max: 2 - NAs: 0 (0%) - 2 unique values
2 value labels: [1] urbain [2] rural

À noter, l’argument [Link] permets d’indiquer le nombre de modalitĂ©s en-dessous duquel


describe renverra également un tri à plat de la variable.

R> describe(menages, [Link] = 6)

[1814 obs. x 5 variables] tbl_df tbl [Link]

$id_menage: Identifiant du ménage


numeric: 1 2 3 4 5 6 7 8 9 10 ...
min: 1 - max: 1814 - NAs: 0 (0%) - 1814 unique values

$taille: Taille du ménage (nombre de membres)


numeric: 7 3 6 5 7 6 15 6 5 19 ...
min: 1 - max: 31 - NAs: 0 (0%) - 30 unique values

$sexe_chef: Sexe du chef de ménage


labelled double: 2 1 1 1 1 2 2 2 1 1 ...
min: 1 - max: 2 - NAs: 0 (0%) - 2 unique values
2 value labels: [1] homme [2] femme

n %
[1] homme 1420 78.3
[2] femme 394 21.7
Total 1814 100.0

$structure: Structure démographique du ménage


labelled double: 4 2 5 4 4 4 5 2 5 5 ...
min: 1 - max: 5 - NAs: 0 (0%) - 5 unique values
6 value labels: [0] pas d'adulte [1] un adulte [2] deux adultes de sexe opposé
[3] deux adultes de mĂȘme sexe [4] trois adultes ou plus avec lien de parentĂ© [5]
adultes sans lien de parenté

– 193 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

n %
[0] pas d'adulte 0 0.0
[1] un adulte 78 4.3
[2] deux adultes de sexe opposé 439 24.2
[3] deux adultes de mĂȘme sexe 75 4.1
[4] trois adultes ou plus avec lien de parenté 920 50.7
[5] adultes sans lien de parenté 302 16.6
Total 1814 100.0

$richesse: Niveau de vie (quintiles)


labelled double: 1 2 2 1 1 3 2 5 4 3 ...
min: 1 - max: 5 - NAs: 0 (0%) - 5 unique values
5 value labels: [1] trĂšs pauvre [2] pauvre [3] moyen [4] riche [5] trĂšs riche

n %
[1] trĂšs pauvre 335 18.5
[2] pauvre 357 19.7
[3] moyen 402 22.2
[4] riche 350 19.3
[5] trĂšs riche 370 20.4
Total 1814 100.0

Addins de codebook
L’extension codebook fournit plusieurs addins permettant d’explorer les Ă©tiquettes des diffĂ©rentes
variables d’un tableau de donnĂ©es. Ils sont accessibles par le menu Addins de RStudio.

On peut aussi lancer les addins manuellement, par exemple avec la commande suivante :

R> codebook::label_browser_static(femmes)

skim (skimr)
L’extension skimr a pour objectif de fournir une fonction skim comme alternative à summary {base} pour
les vecteurs et les tableaux de données afin de fournir plus de statistiques dans un format plus compact.
Elle peut ĂȘtre appliquĂ©e Ă  un vecteur donnĂ© ou directement Ă  un tableau de donnĂ©es.

– 194 –
Visualiser ses données

R> library(skimr)
skim(hdv2003$cuisine)

Data summary

Name hdv2003$cuisine

Number of rows 2000

Number of columns 1

_______________________

Column type frequency:

factor 1

________________________

Group variables None


Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts

data 0 1 FALSE 2 Non: 1119, Oui: 881

– 195 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> skim(hdv2003)

Data summary

Name hdv2003

Number of rows 2000

Number of columns 20

_______________________

Column type frequency:

factor 15

numeric 5

________________________

Group variables None


Variable type: factor

– 196 –
Visualiser ses données

skim_variable n_missing complete_rate ordered n_unique top_counts

sexe 0 1.00 FALSE 2 Fem: 1101, Hom:


899

nivetud 112 0.94 FALSE 8 Ens: 463, Ens: 441,


Der: 341, 1er: 204

occup 0 1.00 FALSE 7 Exe: 1049, Ret: 392,


Au : 171, Cho: 134

qualif 347 0.83 FALSE 7 Emp: 594, Ouv: 292,


Cad: 260, Ouv: 203

clso 0 1.00 FALSE 3 Non: 1037, Oui: 936,


Ne : 27

relig 0 1.00 FALSE 6 App: 760, Pra: 442,


Ni : 399, Pra: 266

[Link] 952 0.52 FALSE 4 Moi: 708, Aus: 259,


Peu: 52, Le : 29

[Link] 952 0.52 FALSE 3 Sat: 480, Equ: 451,


Ins: 117

[Link] 0 1.00 FALSE 2 Non: 1986, Oui: 14

[Link] 0 1.00 FALSE 2 Non: 1953, Oui: 47

[Link] 0 1.00 FALSE 2 Non: 1776, Oui: 224

cuisine 0 1.00 FALSE 2 Non: 1119, Oui: 881

bricol 0 1.00 FALSE 2 Non: 1147, Oui: 853

cinema 0 1.00 FALSE 2 Non: 1174, Oui: 826

sport 0 1.00 FALSE 2 Non: 1277, Oui: 723

Variable type: numeric

– 197 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75

id 0 1 1000.50 577.49 1.00 500.75 1000.50 150

age 0 1 48.16 16.94 18.00 35.00 48.00 6

poids 0 1 5535.61 4375.03 78.08 2221.82 4631.19 762

[Link] 0 1 3.28 2.77 0.00 1.00 2.00

[Link] 5 1 2.25 1.78 0.00 1.00 2.00

On peut noter que les variables sont regroupées par type.

Il est possible de sĂ©lectionner des variables Ă  la maniĂšre de dplyr. Voir l’aide de contains .

R> skim(hdv2003, contains("re"))

Data summary

Name hdv2003

Number of rows 2000

Number of columns 20

_______________________

Column type frequency:

factor 2

numeric 2

________________________

Group variables None


Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts

relig 0 1 FALSE 6 App: 760, Pra: 442,


Ni : 399, Pra: 266

[Link] 0 1 FALSE 2 Non: 1953, Oui: 47

– 198 –
Visualiser ses données

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist

[Link] 0 1 3.28 2.77 0 1 2 5 22 ▇▂▁▁▁

[Link] 5 1 2.25 1.78 0 1 2 3 12 ▇▃▁▁▁

Le support des vecteurs labellisĂ©s est encore en cours d’intĂ©gration.

R> skim(menages)

Data summary

Name menages

Number of rows 1814

Number of columns 5

_______________________

Column type frequency:

numeric 5

________________________

Group variables None


Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p

id_menage 0 1 907.50 523.80 1 454.25 907.5 1360.75 1

taille 0 1 7.50 4.42 1 4.00 6.0 9.00

sexe_chef 0 1 1.22 0.41 1 1.00 1.0 1.00

structure 0 1 3.51 1.15 1 2.00 4.0 4.00

richesse 0 1 3.03 1.39 1 2.00 3.0 4.00

– 199 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

create_report (DataExplorer)
L’extension DataExplorer fournit des outils d’exploration graphique d’un fichier de donnĂ©es. En premier
lieu, sa fonction create_report gĂ©nĂšre un rapport automatique Ă  partir d’un tableau de donnĂ©es.

R> library(DataExplorer)
create_report(hdv2003)

Le résultat de ce rapport est visible sur [Link]


hdv2003_DataExplorer_report.html.

L’extension fournit Ă©galement diffĂ©rentes fonctions graphiques, prĂ©sentĂ©es en dĂ©tail dans la vignette
inclue dans l’extension et visible sur [Link]
[Link].

makeCodebook (dataMaid)
L’extension dataMaid propose une fonction makeCodebook permettant de gĂ©nĂ©rer une prĂ©sentation de
l’ensemble des variables d’un tableau de donnĂ©es, au format PDF, Word ou HTML.

R> library(dataMaid)
makeCodebook(hdv2003)

Vous pouvez cliquer sur ce lien pour voir le PDF produit par dataMaid.

scan_data (pointblank)
L’extension pointblank propose une fonction scan_data permettant de gĂ©nĂ©rer un rapport automatisĂ©
sur un jeu de données. Le rapport est surtout détaillé pour les variables continues mais ne fournit que
peu d’informations que les variables catĂ©gorielles. La fonction ne tient pas compte non plus des variables
labellisĂ©es. La fonction export_report permet d’exporter le rapport obtenu au format HTML.

R> library(pointblank)
rapport <- scan_data(hdv2003)
export_report(rapport, filename = "data/scan_data_hdv2003.html")

Vous pouvez cliquer sur ce lien pour voir le fichier HTML produit par pointblank.

– 200 –
Recodage de variables
Renommer des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Convertir une variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Variable numérique ou textuelle en facteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Conversion d’un facteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Conversion d’un vecteur labellisĂ© . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Quand convertir les vecteurs labellisés ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Convertir un vecteur labellisé en facteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
Convertir un vecteur labellisé en numérique ou en texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Conversion conditionnelle en facteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Nettoyage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Découper une variable numérique en classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Regrouper les modalitĂ©s d’une variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Variables calculées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 228
Combiner plusieurs variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Variables scores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Vérification des recodages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Facteurs et forcats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Modifier les modalitĂ©s d’une variable qualitative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Ordonner les modalitĂ©s d’une variable qualitative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Combiner plusieurs variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
if_else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
case_when . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Recodage et [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

GUIDE-R

Une version actualisée de ce chapitre est disponible sur guide-R : Facteurs et forcats & Combiner
plusieurs variables

– 201 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

NOTE

La version originale de ce chapitre a été écrite par Julien Barnier dans le cadre du support de cours
Introduction Ă  R.

WEBIN-R

Ce chapitre est évoqué dans le webin-R #05 (recoder des variables) sur YouTube.

Ce chapitre est évoqué dans le webin-R #06 (régression logistique partie 1) sur YouTube.

Le recodage de variables est une opĂ©ration extrĂȘmement frĂ©quente lors du traitement d’enquĂȘte. Celui-ci
utilise soit l’une des formes d’indexation dĂ©crites prĂ©cĂ©demment, soit des fonctions ad hoc de R.

On passe ici en revue diffĂ©rents types de recodage parmi les plus courants. Les exemples s’appuient,
comme prĂ©cĂ©demment, sur l’extrait de l’enquĂȘte Histoire de vie :

R> library(questionr)
data(hdv2003)
d <- hdv2003

Renommer des variables


Une opĂ©ration courante lorsqu’on a importĂ© des variables depuis une source de donnĂ©es externe consiste
Ă  renommer les variables importĂ©es. Sous R les noms de variables doivent ĂȘtre Ă  la fois courts et explicites.

I M P O R TA N T

Les noms de variables peuvent contenir des lettres, des chiffres (mais ils ne peuvent pas commencer
par un chiffre), les symboles . et _ et doivent commencer par une lettre. R fait la différence entre
les majuscules et les minuscules, ce qui signifie que x et X sont deux noms de variable différents. On
Ă©vitera Ă©galement d’utiliser des caractĂšres accentuĂ©s dans les noms de variable. Comme les espaces
ne sont pas autorisés, on pourra les remplacer par un point ou un tiret bas.

On peut lister les noms des variables d’un tableau de donnĂ©es ([Link]) Ă  l’aide de la fonction names :

– 202 –
Recodage de variables

R> names(d)

[1] "id" "age" "sexe"


[4] "nivetud" "poids" "occup"
[7] "qualif" "[Link]" "clso"
[10] "relig" "[Link]" "[Link]"
[13] "[Link]" "[Link]" "[Link]"
[16] "cuisine" "bricol" "cinema"
[19] "sport" "[Link]"

Si l’on utilise dplyr (voir chapitre dĂ©diĂ©, page 241), on peut facilement renommer une variable avec
rename :

– 203 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> library(dplyr, quietly = TRUE)


d2 <- d %>% dplyr::rename(bricolage = bricol, religion = relig)

– 204 –
Recodage de variables

NOTE

La fonction names peut Ă©galement ĂȘtre utilisĂ©e pour renommer l’ensemble des variables. Si par
exemple on souhaitait passer les noms de toutes les variables en majuscules, on pourrait faire :

R> [Link] <- d


names([Link]) <- c(
"ID", "AGE", "SEXE", "NIVETUD", "POIDS", "OCCUP", "QUALIF",
"[Link]", "CLSO", "RELIG", "[Link]", "[Link]", "[Link]",
"[Link]", "[Link]", "CUISINE", "BRICOL", "CINEMA", "SPORT", "HE
[Link]"
)
summary([Link]$SEXE)

Homme Femme
899 1101

Ce type de renommage peut ĂȘtre utile lorsqu’on souhaite passer en revue tous les noms de variables
d’un fichier importĂ© pour les corriger le cas Ă©chĂ©ant. Pour faciliter un peu ce travail pas forcĂ©ment
passionnant, on peut utiliser la fonction dput :

R> dput(names(d))

c("id", "age", "sexe", "nivetud", "poids", "occup", "qualif",


"[Link]", "clso", "relig", "[Link]", "[Link]",
"[Link]", "[Link]", "[Link]", "cuisine", "bricol",
"cinema", "sport", "[Link]")

On obtient en rĂ©sultat la liste des variables sous forme de vecteur dĂ©clarĂ©. On n’a plus alors qu’à
copier/coller cette chaĂźne, rajouter names(d) <- devant et modifier un Ă  un les noms des variables.

Si on souhaite seulement modifier le nom d’une variable, on peut utiliser la fonction


[Link] de l’extension questionr. Celle-ci prend en argument le tableau de donnĂ©es, le
nom actuel de la variable et le nouveau nom. Par exemple, si on veut renommer la variable bricol du
tableau de données d en bricolage :

– 205 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> d <- [Link](d, "bricol", "bricolage")


table(d$bricolage)

Non Oui
1147 853

Convertir une variable


Il peut arriver qu’on veuille transformer une variable d’un type dans un autre.

Variable numérique ou textuelle en facteur


Par exemple, on peut considérer que la variable numérique [Link] est une « fausse » variable
numĂ©rique et qu’une reprĂ©sentation sous forme de facteur serait plus adĂ©quate. Dans ce cas il suffit de
faire appel Ă  la fonction factor :

R> d$[Link] <- factor(d$[Link])


levels(d$[Link])

[1] "0" "1" "2" "3" "4" "5" "6" "7" "8" "9" "10"
[12] "11" "12" "13" "14" "15" "16" "18" "22"

La conversion d’une variable caractĂšres en facteur se fait de la mĂȘme maniĂšre.

La conversion d’un facteur ou d’une variable numĂ©rique en variable caractĂšres peut se faire Ă  l’aide de la
fonction [Link] :

R> d$[Link] <- [Link](d$[Link])


d$[Link] <- [Link](d$qualif)

Conversion d’un facteur


La conversion d’un facteur en caractĂšres est frĂ©quemment utilisĂ© lors des recodages du fait qu’il est
impossible d’ajouter de nouvelles modalitĂ©s Ă  un facteur de cette maniĂšre. Par exemple, la premiĂšre des

– 206 –
Recodage de variables

commandes suivantes gĂ©nĂšre un message d’avertissement, tandis que les deux autres fonctionnent :

R> [Link] <- d


[Link]$qualif[[Link]$qualif == "Ouvrier specialise"] <- "Ouvrier"

Warning in `[<-.factor`(`*tmp*`, [Link]$qualif == "Ouvrier


specialise", : niveau de facteur incorrect, NAs générés

R> d$[Link] <- [Link](d$qualif)


d$[Link][d$[Link] == "Ouvrier specialise"] <- "Ouvrier"

Dans le premier cas, le message d’avertissement indique que toutes les modalitĂ©s « Ouvrier specialise » de
notre variable qualif ont été remplacées par des valeurs manquantes NA .

Enfin, une variable de type caractĂšres dont les valeurs seraient des nombres peut ĂȘtre convertie en
variable numérique avec la fonction [Link] .

R> v <- c("1", "3.1415", "4", "5.6", "1", "4")


v

[1] "1" "3.1415" "4" "5.6" "1" "4"

R> [Link](v)

[1] 1.000 3.142 4.000 5.600 1.000 4.000

– 207 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

I M P O R TA N T

Lorsque l’on convertit un facteur avec [Link] , on obtient le numĂ©ro de chaque facteur
(premiÚre modalité, seconde modalité, etc.). Si la valeur numérique qui nous intéresse est en fait
contenu dans le nom des modalités, il faut convertir au préalable notre facteur en variable textuelle.

R> vf <- factor(v)


vf

[1] 1 3.1415 4 5.6 1 4


Levels: 1 3.1415 4 5.6

R> [Link](vf)

[1] 1 2 3 4 1 3

R> [Link]([Link](vf))

[1] 1.000 3.142 4.000 5.600 1.000 4.000

ATTENTION : la valeur numĂ©rique associĂ©e Ă  chaque Ă©tiquette d’un facteur change lorsque l’on
modifie l’ordre des Ă©tiquettes d’un facteur. DĂšs lors, il est fortement dĂ©conseillĂ© de convertir un
facteur en variable numérique.

Conversion d’un vecteur labellisĂ©


Nous avons abordĂ© dans un chapitre prĂ©cĂ©dent, page 127 la gestion de donnĂ©es labellisĂ©es Ă  l’aide de
l’extension labelled. Les vecteurs labellisĂ©s sont beaucoup plus souples que les facteurs lors de la
prĂ©paration des donnĂ©es, puisque la liste des modalitĂ©s autorisĂ©es n’est pas fixĂ©e Ă  l’avance. De plus, cela
permet Ă©galement de documenter au-fur-et-Ă -mesure les nouvelles variables que l’on créé.

Nous verrons dans les chapitres d’analyse, notamment quand il s’agit de calculer des modùles, qu’il
est nécessaire de coder les variables catégorielles sous forme de facteurs. Et il est préférable pour les
variables continues de leur retirer la classe haven_labelled .

– 208 –
Recodage de variables

Quand convertir les vecteurs labellisés ?


La classe haven_labelled permets d’ajouter des mĂ©tadonnĂ©es aux variables sous la forme d’étiquettes
de valeurs. Lorsque les données sont importées depuis SAS, SPSS ou Stata, cela permet notamment de
conserver le codage original du fichier importé.

Mais il faut noter que ces Ă©tiquettes de valeur n’indique pas pour autant de maniĂšre systĂ©matique le type
de variable (catĂ©gorielle ou continue). Les vecteurs labellisĂ©s n’ont donc pas vocation Ă  ĂȘtre utilisĂ©s pour
l’analyse, notamment le calcul de modĂšles statistiques. Ils doivent ĂȘtre convertis en facteurs (pour les
variables catégorielles) ou en vecteurs numériques (pour les variables continues).

La question qui peut se poser est donc de choisirĂ  quel moment cette conversion doit avoir lieu dans un
processus d’analyse. On peut considĂ©rer deux approches principales.

Deux approches possibles

Dans l’approche A, les vecteurs labellisĂ©s sont convertis juste aprĂšs l’import des donnĂ©es, en utilisant les
fonctions unlabelled , to_factor ou unclass qui sont présentées ci-aprÚs. DÚs lors, toute la partie
de nettoyage et de recodage des données se fera en utilisant les fonctions classiques de R.

Dans l’approche B, les vecteurs labellisĂ©s sont conservĂ©s pour l’étape de nettoyage et de recodage des
donnĂ©es. Dans ce cas lĂ , on pourra avoir recours aux fonctions de l’extension labelled qui facilitent la
gestion des données labellisées. Cette approche est particuliÚrement intéressante quand (i) on veut
pouvoir se référer au dictionnaire de codification fourni avec les données sources et donc on veut
conserver le codage original et/ou (ii) quand les donnĂ©es devront faire l’objet d’un rĂ©export aprĂšs
transformation. Par contre, comme dans l’approche A, il faudra prĂ©voir une conversion des variables
labellisĂ©es au moment de l’analyse.

Convertir un vecteur labellisé en facteur


Il est trĂšs facile de convertir un vecteur labellisĂ© en facteur Ă  l’aide la fonction to_factor de l’extension

– 209 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

labelled1.

R> library(labelled)
v <- labelled(c(1, 2, 9, 3, 3, 2, NA), c(oui = 1, "peut-ĂȘtre" = 2, non = 3, "n
e sait pas" = 9))
v

<labelled<double>[7]>
[1] 1 2 9 3 3 2 NA

Labels:
value label
1 oui
2 peut-ĂȘtre
3 non
9 ne sait pas

R> to_factor(v)

[1] oui peut-ĂȘtre ne sait pas non


[5] non peut-ĂȘtre <NA>
Levels: oui peut-ĂȘtre non ne sait pas

Il possible d’indiquer si l’on souhaite, comme Ă©tiquettes du facteur, utiliser les Ă©tiquettes de valeur (par
dĂ©faut), les valeurs elles-mĂȘmes, ou bien les Ă©tiquettes de valeurs prĂ©fixĂ©es par la valeur d’origine
indiquée entre crochets.

R> to_factor(v, "l")

[1] oui peut-ĂȘtre ne sait pas non


[5] non peut-ĂȘtre <NA>
Levels: oui peut-ĂȘtre non ne sait pas

R> to_factor(v, "v")

[1] 1 2 9 3 3 2 <NA>
Levels: 1 2 3 9

1. On priviligiera la fonction to_factor à la fonction as_factor de l’extension haven, la premiùre ayant plus de
possibilités et un comportement plus consistent.

– 210 –
Recodage de variables

R> to_factor(v, "p")

[1] [1] oui [2] peut-ĂȘtre [9] ne sait pas


[4] [3] non [3] non [2] peut-ĂȘtre
[7] <NA>
4 Levels: [1] oui [2] peut-ĂȘtre ... [9] ne sait pas

Par dĂ©faut, les Ă©tiquettes du facteur seront triĂ©s selon l’ordre des Ă©tiquettes de valeur. Mais cela peut ĂȘtre
modifiĂ© avec l’argument sort_levels si l’on prĂ©fĂšre trier selon les valeurs ou selon l’ordre alphabĂ©tique
des étiquettes.

R> to_factor(v, sort_levels = "v")

[1] oui peut-ĂȘtre ne sait pas non


[5] non peut-ĂȘtre <NA>
Levels: oui peut-ĂȘtre non ne sait pas

R> to_factor(v, sort_levels = "l")

[1] oui peut-ĂȘtre ne sait pas non


[5] non peut-ĂȘtre <NA>
Levels: ne sait pas non oui peut-ĂȘtre

D’autres options sont disponibles. On se rĂ©ferra Ă  la documentation complĂšte de la fonction.

Convertir un vecteur labellisé en numérique ou en texte


Pour rappel, il existe deux types de vecteurs labellisés : des vecteurs numériques labellisés ( x dans
l’exemple ci-dessous) et des vecteurs textuels labellisĂ©s ( x dans l’exemple ci-dessous).

R> x <- labelled(c(1, 2, 9, 3, 3, 2, NA), c(oui = 1, "peut-ĂȘtre" = 2, non = 3, "n


e sait pas" = 9))
y <- labelled(c("f", "f", "h", "f"), c(femme = "f", homme = "h"))
x

<labelled<double>[7]>
[1] 1 2 9 3 3 2 NA

Labels:

– 211 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

value label
1 oui
2 peut-ĂȘtre
3 non
9 ne sait pas

R> y

<labelled<character>[4]>
[1] f f h f

Labels:
value label
f femme
h homme

Pour leur retirer leur caractĂšre labellisĂ© et revenir Ă  leur classe d’origine, on peut utiliser la fonction
unclass .

R> unclass(x)

[1] 1 2 9 3 3 2 NA
attr(,"labels")
oui peut-ĂȘtre non ne sait pas
1 2 3 9

R> unclass(y)

[1] "f" "f" "h" "f"


attr(,"labels")
femme homme
"f" "h"

À noter que dans ce cas-lĂ , les Ă©tiquettes sont conservĂ©es comme attributs du vecteur.

Une alternative est d’utiliser remove_labels qui supprimera toutes les Ă©tiquettes, y compris les
étiquettes de variable. Pour conserver les étiquettes de variables et ne supprimer que les étiquettes de
valeurs, on indiquera keep_var_label = TRUE .

– 212 –
Recodage de variables

R> var_label(x) <- "Etiquette de variable"


remove_labels(x)

[1] 1 2 9 3 3 2 NA

R> remove_labels(x, keep_var_label = TRUE)

[1] 1 2 9 3 3 2 NA
attr(,"label")
[1] "Etiquette de variable"

R> remove_labels(y)

[1] "f" "f" "h" "f"

Dans le cas d’un vecteur numĂ©rique labellisĂ© que l’on souhaiterait convertir en variable textuelle, on
pourra utiliser to_character à la place de to_factor qui comme sa soeur utilisera les étiquettes de
valeurs.

R> to_character(x)

[1] "oui" "peut-ĂȘtre" "ne sait pas" "non"


[5] "non" "peut-ĂȘtre" NA
attr(,"label")
[1] "Etiquette de variable"

Conversion conditionnelle en facteurs


Il n’est pas toujours possible de dĂ©terminer la nature d’une variable (continue ou catĂ©gorielle) juste Ă 
partir de la prĂ©sence ou l’absence d’étiquettes de valeur. En effet, on peut utiliser des Ă©tiquettes de valeur
dans le cadre d’une variable continue pour indiquer certaines valeurs spĂ©cifiques.

Une bonne pratique est de vérifier chaque variable inclue dans une analyse, une à une.

Cependant, une rÚgle qui fonctionne dans 90% des cas est de convertir un vecteur labellisé en facteur
seulement si toutes les valeurs observĂ©es dans le vecteur disposent d’une Ă©tiquette de valeur
correspondante. C’est ce que propose la fonction unlabelled qui peut mĂȘme ĂȘtre appliquĂ© Ă  tout un
tableau de données. Par défaut, elle fonctionne ainsi :

– 213 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

1. les variables non labellisĂ©es restent inchangĂ©es (variables f et g dans l’exemple ci-dessous);
2. si toutes les valeurs observĂ©es d’une variable labellisĂ©es, elles sont converties en facteurs
(variables b et c);
3. sinon, on leur applique unclass (variables a, d et e).

R> df <- [Link](


a = labelled(c(1, 1, 2, 3), labels = c(No = 1, Yes = 2)),
b = labelled(c(1, 1, 2, 3), labels = c(No = 1, Yes = 2, DK = 3)),
c = labelled(c(1, 1, 2, 2), labels = c(No = 1, Yes = 2, DK = 3)),
d = labelled(c("a", "a", "b", "c"), labels = c(No = "a", Yes = "b")),
e = labelled_spss(
c(1, 9, 1, 2),
labels = c(No = 1, Yes = 2),
na_values = 9
),
f = 1:4,
g = [Link](c("2020-01-01", "2020-02-01", "2020-03-01", "2020-04-01"))
)
dplyr::glimpse(df)

Rows: 4
Columns: 7
$ a <dbl+lbl> 1, 1, 2, 3
$ b <dbl+lbl> 1, 1, 2, 3
$ c <dbl+lbl> 1, 1, 2, 2
$ d <chr+lbl> "a", "a", "b", "c"
$ e <hvn_lbl_> 1, 9, 1, 2
$ f <int> 1, 2, 3, 4
$ g <date> 2020-01-01, 2020-02-01, 2020-03-01, 2020-04-01

R> dplyr::glimpse(unlabelled(df))

Rows: 4
Columns: 7
$ a <dbl> 1, 1, 2, 3
$ b <fct> No, No, Yes, DK
$ c <fct> No, No, Yes, Yes
$ d <chr> "a", "a", "b", "c"
$ e <fct> No, NA, No, Yes
$ f <int> 1, 2, 3, 4
$ g <date> 2020-01-01, 2020-02-01, 2020-03-01, 2020-04-01

On peut indiquer certaines options, par exemple drop_unused_labels = TRUE pour supprimer des
facteurs créés les niveaux non observées dans les données (voir la variable c) ou

– 214 –
Recodage de variables

user_na_to_na = TRUE pour convertir les valeurs manquantes de type SPSS en NA (voir la variable
e, notez qu’ici, du fait de cette conversion, toutes les valeurs ont une Ă©tiquette et la variable est alors
convertie en facteur.)

R> dplyr::glimpse(unlabelled(df, levels = "prefixed"))

Rows: 4
Columns: 7
$ a <dbl> 1, 1, 2, 3
$ b <fct> [1] No, [1] No, [2] Yes, [3] DK
$ c <fct> [1] No, [1] No, [2] Yes, [2] Yes
$ d <chr> "a", "a", "b", "c"
$ e <fct> [1] No, NA, [1] No, [2] Yes
$ f <int> 1, 2, 3, 4
$ g <date> 2020-01-01, 2020-02-01, 2020-03-01, 2020-04-01

R> dplyr::glimpse(unlabelled(df, user_na_to_na = TRUE))

Rows: 4
Columns: 7
$ a <dbl> 1, 1, 2, 3
$ b <fct> No, No, Yes, DK
$ c <fct> No, No, Yes, Yes
$ d <chr> "a", "a", "b", "c"
$ e <fct> No, NA, No, Yes
$ f <int> 1, 2, 3, 4
$ g <date> 2020-01-01, 2020-02-01, 2020-03-01, 2020-04-01

R> dplyr::glimpse(unlabelled(df, drop_unused_labels = TRUE))

Rows: 4
Columns: 7
$ a <dbl> 1, 1, 2, 3
$ b <fct> No, No, Yes, DK
$ c <fct> No, No, Yes, Yes
$ d <chr> "a", "a", "b", "c"
$ e <fct> No, NA, No, Yes
$ f <int> 1, 2, 3, 4
$ g <date> 2020-01-01, 2020-02-01, 2020-03-01, 2020-04-01

– 215 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Nettoyage
L’extension cleaner propose plusieurs fonctions utiles lorsque l’on doit nettoyer une variable mal
encodées.

R> library(cleaner)

Attachement du package : 'cleaner'

L'objet suivant est masqué depuis 'package:questionr':

freq

R> # Recoder en valeurs logiques


clean_logical(c("Yes", "No", "Invalid", "Unknown"))

[1] TRUE FALSE NA NA

R> clean_logical(c("Oui, c'est ca", "Non, pas encore"))

[1] TRUE FALSE

R> clean_logical(c("ya :)", "tidak :("))

[1] TRUE FALSE

R> clean_logical(
x = c("Positive", "Negative", "Unknown", "Unknown"),
true = "pos",
false = "neg"
)

[1] TRUE FALSE NA NA

– 216 –
Recodage de variables

R> # Valeurs numériques


clean_numeric(c(
"$ 12,345.67",
"€ 12.345,67",
"12,345.67",
"12345,67"
))

[1] 12346 12346 12346 12346

R> clean_numeric("qwerty123456")

[1] 123456

R> clean_numeric("Positive (0.143)")

[1] 0.143

R> # Facteurs
gender_age <- c("male 0-50", "male 50+", "female 0-50", "female 50+")
gender_age

[1] "male 0-50" "male 50+" "female 0-50" "female 50+"

R> clean_factor(gender_age, levels = c("M", "F"))

[1] M M F F
Levels: M F

R> clean_factor(gender_age, levels = c("Male", "Female"))

[1] Male Male Female Female


Levels: Male Female

– 217 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> clean_factor(gender_age, levels = c("0-50", "50+"), ordered = TRUE)

[1] 0-50 50+ 0-50 50+


Levels: 0-50 < 50+

R> clean_factor(
gender_age,
levels = c(
"female" = "Group A",
"male 50+" = "Group B",
".*" = "Other"
)
)

[1] Other Group B Group A Group A


Levels: Group A Group B Other

R> # Dates
clean_Date("12-06-2012")

(assuming format 'dd-mm-yyyy')

[1] "2012-06-12"

R> clean_Date(38071)

(assuming Excel format)

[1] "2004-03-25"

– 218 –
Recodage de variables

I M P O R TA N T

L’extension cleaner propose Ă©galement une fonction freq qui peut rentrer en conflit avec la fonction
freq de questionr. Dans ce cas, on pourra soit appeler explicitement la version de questionr avec
l’écriture questionr::freq() . Une autre possibilitĂ© est de «dĂ©charger» (le contraire de charger en
mĂ©moire) l’extension cleaner une fois que l’on en n’a plus besoin.

R> detach("package:cleaner", unload = TRUE)

Découper une variable numérique en classes


Le premier type de recodage consiste à découper une variable de type numérique en un certain nombre
de classes. On utilise pour cela la fonction cut .

Celle-ci prend, outre la variable Ă  dĂ©couper, un certain nombre d’arguments :

‱ breaks indique soit le nombre de classes souhaitĂ©, soit, si on lui fournit un vecteur, les limites
des classes ;
‱ labels permet de modifier les noms de modalitĂ©s attribuĂ©s aux classes ;
‱ [Link] et right influent sur la maniĂšre dont les valeurs situĂ©es Ă  la frontiĂšre des
classes seront inclues ou exclues ;
‱ [Link] indique le nombre de chiffres aprĂšs la virgule Ă  conserver dans les noms de modalitĂ©s.

Prenons tout de suite un exemple et tentons de découper notre variable age en cinq classes et de placer
le résultat dans une nouvelle variable nommée age5cl :

R> d$age5cl <- cut(d$age, 5)


table(d$age5cl)

(17.9,33.8] (33.8,49.6] (49.6,65.4] (65.4,81.2] (81.2,97.1]


454 628 556 319 43

Par dĂ©faut R nous a bien créé cinq classes d’amplitudes Ă©gales. La premiĂšre classe va de 16,9 Ă  32,2 ans (en
fait de 17 Ă  32), etc.

Les frontiÚres de classe seraient plus présentables si elles utilisaient des nombres ronds. On va donc
spécifier manuellement le découpage souhaité, par tranches de 20 ans :

– 219 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> d$age20 <- cut(d$age, c(0, 20, 40, 60, 80, 100))
table(d$age20)

(0,20] (20,40] (40,60] (60,80] (80,100]


72 660 780 436 52

On aurait pu tenir compte des Ăąges extrĂȘmes pour la premiĂšre et la derniĂšre valeur :

R> range(d$age)

[1] 18 97

R> d$age20 <- cut(d$age, c(18, 20, 40, 60, 80, 97))
table(d$age20)

(18,20] (20,40] (40,60] (60,80] (80,97]


55 660 780 436 52

Les symboles dans les noms attribués aux classes ont leur importance : ( signifie que la frontiÚre de la
classe est exclue, tandis que [ signifie qu’elle est incluse. Ainsi, (20,40] signifie « strictement supĂ©rieur
à 20 et inférieur ou égal à 40 ».

On remarque que du coup, dans notre exemple précédent, la valeur minimale, 18, est exclue de notre
premiĂšre classe, et qu’une observation est donc absente de ce dĂ©coupage. Pour rĂ©soudre ce problĂšme on
peut soit faire commencer la premiùre classe à 17, soit utiliser l’option [Link]=TRUE :

R> d$age20 <- cut(d$age, c(17, 20, 40, 60, 80, 97))
table(d$age20)

(17,20] (20,40] (40,60] (60,80] (80,97]


72 660 780 436 52

R> d$age20 <- cut(d$age, c(18, 20, 40, 60, 80, 97), [Link] = TRUE)
table(d$age20)

– 220 –
Recodage de variables

[18,20] (20,40] (40,60] (60,80] (80,97]


72 660 780 436 52

On peut Ă©galement modifier le sens des intervalles avec l’option right=FALSE , et indiquer
manuellement les noms des modalités avec labels :

R> d$age20 <- cut(d$age, c(18, 20, 40, 60, 80, 97), right = FALSE, [Link]
= TRUE)
table(d$age20)

[18,20) [20,40) [40,60) [60,80) [80,97]


48 643 793 454 62

R> d$age20 <- cut(d$age, c(18, 20, 40, 60, 80, 97), [Link] = TRUE, labels
= c("<20ans", "21-40 ans", "41-60ans", "61-80ans", ">80ans"))
table(d$age20)

<20ans 21-40 ans 41-60ans 61-80ans >80ans


72 660 780 436 52

– 221 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

NOTE

L’extension questionr propose une interface interactive Ă  la fonction cut , nommĂ©e icut . Elle
s’utilise de la maniùre suivante :

R> icut(d, age)

RStudio devrait ouvrir une fenĂȘtre semblable Ă  l’image ci-dessous.

Capture d’écran d’icut

Vous pouvez alors indiquer les limites de vos classes ainsi que quelques options complémentaires. Ces
limites sont reprĂ©sentĂ©es graphiquement sur l’histogramme de la variable d’origine.

L’onglet VĂ©rification affiche un tri Ă  plat et un graphique en barres de la nouvelle variable. Une fois le
rĂ©sultat satisfaisant, vous pouvez rĂ©cupĂ©rer le code gĂ©nĂ©rĂ© pour l’inclure dans votre script.

L’extension questionr propose aussi une fonction [Link] permettant de dĂ©couper une variable

– 222 –
Recodage de variables

numérique en un nombre de classes donné ayant des efffectifs semblables. Il suffit de lui passer le
nombre de classes en argument :

R> d$age6cl <- [Link](d$age, 6)


table(d$age6cl)

[18,30) [30,39) [39,48) [48,55.667) [55.667,66)


302 337 350 344 305
[66,97]
362

[Link] admet les mĂȘmes autres options que cut ( [Link] , right , labels 
 ).

Regrouper les modalitĂ©s d’une variable


Pour regrouper les modalitĂ©s d’une variable qualitative (d’un facteur le plus souvent), on peut utiliser
directement l’indexation.

Ainsi, si on veut recoder la variable qualif dans une variable [Link] plus « compacte », on peut
utiliser :

R> table(d$qualif)

Ouvrier specialise Ouvrier qualifie


203 292
Technicien Profession intermediaire
86 160
Cadre Employe
260 594
Autre
58

– 223 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> d$[Link][d$qualif == "Ouvrier specialise"] <- "Ouvrier"


d$[Link][d$qualif == "Ouvrier qualifie"] <- "Ouvrier"
d$[Link][d$qualif == "Employe"] <- "Employe"
d$[Link][d$qualif == "Profession intermediaire"] <- "Intermediaire"
d$[Link][d$qualif == "Technicien"] <- "Intermediaire"
d$[Link][d$qualif == "Cadre"] <- "Cadre"
d$[Link][d$qualif == "Autre"] <- "Autre"
table(d$[Link])

Autre Cadre Employe Intermediaire


58 260 594 246
Ouvrier
495

On aurait pu représenter ce recodage de maniÚre plus compacte, notamment en commençant par copier
le contenu de qualif dans [Link], ce qui permet de ne pas s’occuper de ce qui ne change pas.

Il est cependant nécessaire de ne pas copier qualif sous forme de facteur, sinon on ne pourrait ajouter
de nouvelles modalités. On copie donc la version caractÚres de qualif grùce à la fonction
[Link] :

R> d$[Link] <- [Link](d$qualif)


d$[Link][d$qualif == "Ouvrier specialise"] <- "Ouvrier"
d$[Link][d$qualif == "Ouvrier qualifie"] <- "Ouvrier"
d$[Link][d$qualif == "Profession intermediaire"] <- "Intermediaire"
d$[Link][d$qualif == "Technicien"] <- "Intermediaire"
table(d$[Link])

Autre Cadre Employe Intermediaire


58 260 594 246
Ouvrier
495

On peut faire une version encore plus compacte en utilisant l’opĂ©rateur logique ou ( | ) :

– 224 –
Recodage de variables

R> d$[Link] <- [Link](d$qualif)


d$[Link][d$qualif == "Ouvrier specialise" | d$qualif == "Ouvrier qualifi
e"] <- "Ouvrier"
d$[Link][d$qualif == "Profession intermediaire" | d$qualif == "Technicie
n"] <- "Intermediaire"
table(d$[Link])

Autre Cadre Employe Intermediaire


58 260 594 246
Ouvrier
495

Enfin, pour terminer ce petit tour d’horizon, on peut Ă©galement remplacer l’opĂ©rateur | par %in% , qui
peut parfois ĂȘtre plus lisible :

R> d$[Link] <- [Link](d$qualif)


d$[Link][d$qualif %in% c("Ouvrier specialise", "Ouvrier qualifie")] <- "Ou
vrier"
d$[Link][d$qualif %in% c("Profession intermediaire", "Technicien")] <- "In
termediaire"
table(d$[Link])

Autre Cadre Employe Intermediaire


58 260 594 246
Ouvrier
495

Dans tous les cas le résultat obtenu est une variable de type caractÚre. On pourra la convertir en facteur
par un simple :

R> d$[Link] <- factor(d$[Link])

Si on souhaite recoder les valeurs manquantes, il suffit de faire appel Ă  la fonction [Link] :

R> table(d$[Link])

Satisfaction Insatisfaction Equilibre


480 117 451

– 225 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> d$[Link] <- [Link](d$[Link])


d$[Link][[Link](d$[Link])] <- "Manquant"
table(d$[Link])

Equilibre Insatisfaction Manquant Satisfaction


451 117 952 480

– 226 –
Recodage de variables

NOTE

questionr propose une interface interactive pour le recodage d’une variable qualitative (renommage
et regroupement de modalitĂ©s). Cette fonction, nommĂ©e irec , s’utilise de la maniĂšre suivante :

R> irec(d, qualif)

RStudio va alors ouvrir une fenĂȘtre semblable Ă  l’image ci-dessous :

Capture de irec

Vous pouvez alors sélectionner différentes options, et pour chaque ancienne modalité, indiquer la
nouvelle valeur correspondante. Pour regrouper des modalités, il suffit de leur assigner des nouvelles
valeurs identiques. Dans tous les cas n’hĂ©sitez pas Ă  expĂ©rimenter, l’interface se contente de gĂ©nĂ©rer
du code R Ă  copier/coller dans votre script mais ne l’exĂ©cute pas, et ne modifie donc jamais vos

– 227 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

données !

L’onglet VĂ©rification affiche un tri croisĂ© de l’ancienne et de la nouvelle variable pour vĂ©rifier que le
recodage est correct. Une fois le résultat satisfaisant, vous pouvez récupérer le code généré dans
l’onglet Code pour l’inclure dans votre script.

NOTE

Les exemples prĂ©cĂ©dents montrent bien qu’il est parfois malaisĂ© d’utiliser des facteurs lorsque l’on
recode des variables. Les vecteurs labellisés sont, quant à eux, plus souples. Attention : avec des
vecteurs labellisés, on utilisera les valeurs sous-jacentes et non les étiquettes pour écrire des
conditions.

R> data(fecondite)
library(labelled)
femmes %>% look_for("educ")

R> femmes$educ2 <- 0


femmes$educ2[femmes$educ >= 2] <- 1
var_label(femmes$educ2) <- "A atteint un niveau secondaire ou supérieur ?"
val_labels(femmes$educ2) <- c(non = 0, oui = 1)
femmes %>% look_for("educ")

Variables calculées
La crĂ©ation d’une variable numĂ©rique Ă  partir de calculs sur une ou plusieurs autres variables numĂ©riques
se fait trĂšs simplement.

Supposons que l’on souhaite calculer une variable indiquant l’écart entre le nombre d’heures passĂ©es Ă 
regarder la télévision et la moyenne globale de cette variable. On pourrait alors faire :

R> range(d$[Link], [Link] = TRUE)

[1] 0 12

– 228 –
Recodage de variables

R> mean(d$[Link], [Link] = TRUE)

[1] 2.247

R> d$[Link] <- d$[Link] - mean(d$[Link], [Link] = TRUE)


range(d$[Link], [Link] = TRUE)

[1] -2.247 9.753

R> mean(d$[Link], [Link] = TRUE)

[1] 4.715e-17

Autre exemple tirĂ© du jeu de donnĂ©es rp99 : si on souhaite calculer le pourcentage d’actifs dans chaque
commune, on peut diviser la population active [Link] par la population totale [Link].

R> load(url("[Link]
a"))

R> rp99$[Link] <- rp99$[Link] / rp99$[Link] * 100

Combiner plusieurs variables


La combinaison de plusieurs variables se fait Ă  l’aide des techniques d’indexation dĂ©jĂ  dĂ©crites
prĂ©cĂ©demment. Le plus compliquĂ© est d’arriver Ă  formuler des conditions parfois complexes de maniĂšre
rigoureuse.

On peut ainsi vouloir combiner plusieurs variables qualitatives en une seule :

– 229 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> d$[Link] <- NA


d$[Link][d$cuisine == "Oui" & d$bricol == "Oui"] <- "Cuisine et Bricola
ge"
d$[Link][d$cuisine == "Oui" & d$bricol == "Non"] <- "Cuisine seulement"
d$[Link][d$cuisine == "Non" & d$bricol == "Oui"] <- "Bricolage seulemen
t"
d$[Link][d$cuisine == "Non" & d$bricol == "Non"] <- "Ni cuisine ni bric
olage"
table(d$[Link])

Bricolage seulement Cuisine et Bricolage


437 416
Cuisine seulement Ni cuisine ni bricolage
465 682

On peut également combiner variables qualitatives et variables quantitatives :

R> d$[Link] <- NA


d$[Link][d$sexe == "Homme" & d$age < 40] <- "Homme moins de 40 ans"
d$[Link][d$sexe == "Homme" & d$age >= 40] <- "Homme plus de 40 ans"
d$[Link][d$sexe == "Femme" & d$age < 40] <- "Femme moins de 40 ans"
d$[Link][d$sexe == "Femme" & d$age >= 40] <- "Femme plus de 40 ans"
table(d$[Link])

Femme moins de 40 ans Femme plus de 40 ans


376 725
Homme moins de 40 ans Homme plus de 40 ans
315 584

Les combinaisons de variables un peu complexes nécessitent parfois un petit travail de réflexion. En
particulier, l’ordre des commandes de recodage a parfois une influence dans le rĂ©sultat final.

Pour combiner rapidement plusieurs variables entre elles, on peut aussi avoir recours Ă  la fonction
interaction qui créra un facteur avec un niveau pour chaque combinaison de modalités des variables
sources.

R> d$[Link] <- interaction(d$sexe, d$age20)


table(d$[Link])

Homme.<20ans Femme.<20ans Homme.21-40 ans

– 230 –
Recodage de variables

34 38 291
Femme.21-40 ans Homme.41-60ans Femme.41-60ans
369 352 428
Homme.61-80ans Femme.61-80ans Homme.>80ans
205 231 17
Femme.>80ans
35

Variables scores
Une variable score est une variable calculĂ©e en additionnant des poids accordĂ©s aux modalitĂ©s d’une sĂ©rie
de variables qualitatives.

Pour prendre un exemple tout Ă  fait arbitraire, imaginons que nous souhaitons calculer un score
d’activitĂ©s extĂ©rieures. Dans ce score on considĂšre que le fait d’aller au cinĂ©ma « pĂšse » 10, celui de pĂȘcher
ou chasser vaut 30 et celui de faire du sport vaut 20. On pourrait alors calculer notre score de la maniĂšre
suivante :

R> d$[Link] <- 0


d$[Link][d$cinema == "Oui"] <- d$[Link][d$cinema == "Oui"] + 10
d$[Link][d$[Link] == "Oui"] <- d$[Link][d$[Link] == "Oui"]
+ 30
d$[Link][d$sport == "Oui"] <- d$[Link][d$sport == "Oui"] + 20
table(d$[Link])

0 10 20 30 40 50 60
800 342 229 509 31 41 48

Cette notation Ă©tant un peu lourde, on peut l’allĂ©ger un peu en utilisant la fonction ifelse . Celle-ci
prend en argument une condition et deux valeurs. Si la condition est vraie elle retourne la premiĂšre valeur,
sinon elle retourne la seconde.

R> d$[Link] <- 0


d$[Link] <- ifelse(d$cinema == "Oui", 10, 0) + ifelse(d$[Link] == "Ou
i", 30, 0) + ifelse(d$sport == "Oui", 20, 0)
table(d$[Link])

0 10 20 30 40 50 60
800 342 229 509 31 41 48

– 231 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Vérification des recodages


Il est trĂšs important de vĂ©rifier, notamment aprĂšs les recodages les plus complexes, qu’on a bien obtenu le
résultat escompté. Les deux points les plus sensibles étant les valeurs manquantes et les erreurs dans les
conditions.

Pour vérifier tout cela, le plus simple est sans doute de faire des tableaux croisés entre la variable recodée
et celles ayant servi au recodage, Ă  l’aide des fonctions table ou xtabs , et de vĂ©rifier le nombre de
valeurs manquantes dans la variable recodée avec summary , freq ou table .

Par exemple :

R> d$[Link] <- NA


d$[Link][d$cuisine == "Oui" & d$bricol == "Oui"] <- "Cuisine et Bricola
ge"
d$[Link][d$cuisine == "Oui" & d$bricol == "Non"] <- "Cuisine seulement"
d$[Link][d$cuisine == "Non" & d$bricol == "Oui"] <- "Bricolage seulemen
t"
d$[Link][d$cuisine == "Non" & d$bricol == "Non"] <- "Ni cuisine ni bric
olage"
table(d$[Link], d$cuisine)

Non Oui
Bricolage seulement 437 0
Cuisine et Bricolage 0 416
Cuisine seulement 0 465
Ni cuisine ni bricolage 682 0

R> table(d$[Link], d$bricol)

Non Oui
Bricolage seulement 0 437
Cuisine et Bricolage 0 416
Cuisine seulement 465 0
Ni cuisine ni bricolage 682 0

– 232 –
Recodage de variables

Facteurs et forcats
forcats est une extension facilitant la manipulation des variables qualitatives, qu’elles soient sous forme
de vecteurs character ou de facteurs. Elle fait partie du tidyverse, et est donc automatiquement
chargée par :

R> library(tidyverse)

Modifier les modalitĂ©s d’une variable qualitative


Une opĂ©ration courante consiste Ă  modifier les valeurs d’une variable qualitative, que ce soit pour avoir
des intitulés plus courts ou plus clairs ou pour regrouper des modalités entre elles.

Il existe plusieurs possibilités pour effectuer ce type de recodage, mais ici on va utiliser la fonction
fct_recode de l’extension forcats. Celle-ci prend en argument une liste de recodages sous la forme
"Nouvelle valeur" = "Ancienne valeur" .

Un exemple :

R> f <- c("Pomme", "Poire", "Pomme", "Cerise")


f <- fct_recode(f,
"Fraise" = "Pomme",
"Ananas" = "Poire"
)
f

[1] Fraise Ananas Fraise Cerise


Levels: Cerise Ananas Fraise

Autre exemple sur une “vraie” variable :

R> freq(hdv2003$qualif)

– 233 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> hdv2003$qualif5 <- fct_recode(hdv2003$qualif,


"Ouvrier" = "Ouvrier specialise",
"Ouvrier" = "Ouvrier qualifie",
"Interm" = "Technicien",
"Interm" = "Profession intermediaire"
)

freq(hdv2003$qualif5)

Attention, les anciennes valeurs saisies doivent ĂȘtre exactement Ă©gales aux valeurs des modalitĂ©s de la
variable recodĂ©e : toute diffĂ©rence d’accent ou d’espace fera que ce recodage ne sera pas pris en compte.
Dans ce cas, forcats affiche un avertissement nous indiquant qu’une valeur saisie n’a pas Ă©tĂ© trouvĂ©e
dans les modalités de la variable :

R> hdv2003$qualif_test <- fct_recode(hdv2003$qualif,


"Ouvrier" = "Ouvrier spécialisé",
"Ouvrier" = "Ouvrier qualifié"
)

Warning: Unknown levels in `f`: Ouvrier spécialisé, Ouvrier


qualifié

Si on souhaite recoder une modalité de la variable en NA , il faut (contre intuitivement) lui assigner la
valeur NULL :

R> hdv2003$qualif_rec <- fct_recode(hdv2003$qualif, NULL = "Autre")

freq(hdv2003$qualif_rec)

À l’inverse, si on souhaite recoder les NA d’une variable, on utilisera la fonction fct_explicit_na , qui
convertit toutes les valeurs manquantes ( NA ) d’un facteur en une modalitĂ© spĂ©cifique :

R> hdv2003$qualif_rec <- fct_explicit_na(hdv2003$qualif, na_level = "(Manquant)")

freq(hdv2003$qualif_rec)

D’autres fonctions sont proposĂ©es par forcats pour faciliter certains recodage, comme fct_collapse ,
qui propose une autre syntaxe pratique quand on doit regrouper ensemble des modalités :

– 234 –
Recodage de variables

R> hdv2003$qualif_rec <- fct_collapse(hdv2003$qualif,


"Ouvrier" = c("Ouvrier specialise", "Ouvrier qualifie"),
"Interm" = c("Technicien", "Profession intermediaire")
)

freq(hdv2003$qualif_rec)

fct_other , qui regroupe une liste de modalitĂ©s en une seule modalitĂ© “Other” :

R> hdv2003$qualif_rec <- fct_other(hdv2003$qualif,


drop = c(
"Ouvrier specialise", "Ouvrier qualifie",
"Cadre", "Autre"
)
)

freq(hdv2003$qualif_rec)

fct_lump , qui regroupe automatiquement les modalités les moins fréquentes en une seule modalité
“Other” (avec possibilitĂ© d’indiquer des seuils de regroupement) :

R> hdv2003$qualif_rec <- fct_lump(hdv2003$qualif)

freq(hdv2003$qualif_rec)

Ordonner les modalitĂ©s d’une variable qualitative


L’avantage des facteurs (par rapport aux vecteurs de type character ) est que leurs modalitĂ©s peuvent
ĂȘtre ordonnĂ©es, ce qui peut faciliter la lecture de tableaux ou graphiques.

On peut ordonner les modalitĂ©s d’un facteur manuellement, par exemple avec la fonction
fct_relevel() de l’extension forcats :

R> hdv2003$qualif_rec <- fct_relevel(


hdv2003$qualif,
"Cadre", "Profession intermediaire", "Technicien",
"Employe", "Ouvrier qualifie", "Ouvrier specialise",
"Autre"
)
freq(hdv2003$qualif_rec)

Une autre possibilitĂ© est d’ordonner les modalitĂ©s d’un facteur selon les valeurs d’une autre variable. Par
exemple, si on reprĂ©sente le boxplot de la rĂ©partition de l’ñge selon le statut d’occupation :

– 235 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> library(ggplot2)
ggplot(hdv2003) +
geom_boxplot(aes(x = occup, y = age))

Le graphique pourrait ĂȘtre plus lisible si les modalitĂ©s Ă©taient triĂ©es par Ăąge median croissant. Ceci est
possible en utilisant fct_reorder . Celle-ci prend 3 arguments : le facteur à réordonner, la variable dont
les valeurs doivent ĂȘtre utilisĂ©es pour ce rĂ©ordonnancement, et enfin une fonction Ă  appliquer Ă  cette
deuxiĂšme variable.

– 236 –
Recodage de variables

R> hdv2003$occup_age <- fct_reorder(hdv2003$occup, hdv2003$age, median)

ggplot(hdv2003) +
geom_boxplot(aes(x = occup_age, y = age))

Combiner plusieurs variables


Parfois, on veut crĂ©er une nouvelle variable en partant des valeurs d’une ou plusieurs autres variables.
Dans ce cas on peut utiliser les fonctions if_else pour les cas les plus simples, ou case_when pour les
cas plus complexes. Ces deux fonctions sont incluses dans l’extension dplyr, qu’il faut donc avoir chargĂ©
précédemment (voir le chapitre consacré à dplyr, page 241).

if_else
if_else prend trois arguments : un test, une valeur Ă  renvoyer si le test est vrai, et une valeur Ă  renvoyer
si le test est faux.

– 237 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Voici un exemple simple :

R> v <- c(12, 14, 8, 16)


if_else(v > 10, "Supérieur à 10", "Inférieur à 10")

[1] "Supérieur à 10" "Supérieur à 10" "Inférieur à 10"


[4] "Supérieur à 10"

La fonction devient plus intéressante avec des tests combinant plusieurs variables. Par exemple,
imaginons qu’on souhaite crĂ©er une nouvelle variable indiquant les hommes de plus de 60 ans :

R> hdv2003$statut <- if_else(hdv2003$sexe == "Homme" & hdv2003$age > 60,


"Homme de plus de 60 ans",
"Autre"
)

freq(hdv2003$statut)

case_when
case_when est une gĂ©nĂ©ration du if_else qui permet d’indiquer plusieurs tests et leurs valeurs
associées.

Imaginons qu’on souhaite crĂ©er une nouvelle variable permettant d’identifier les hommes de plus de 60
ans, les femmes de plus de 60 ans, et les autres. On peut utiliser la syntaxe suivante :

R> hdv2003$statut <- case_when(


hdv2003$age > 60 & hdv2003$sexe == "Homme" ~ "Homme de plus de 60 ans",
hdv2003$age > 60 & hdv2003$sexe == "Femme" ~ "Femme de plus de 60 ans",
TRUE ~ "Autre"
)

freq(hdv2003$statut)

case_when prend en arguments une sĂ©rie d’instructions sous la forme condition ~ valeur . Il les
exĂ©cute une par une, et dĂšs qu’une condition est vraie, il renvoit la valeur associĂ©e.

La clause TRUE ~ "Autre" permet d’assigner une valeur à toutes les lignes pour lesquelles aucune des
conditions prĂ©cĂ©dentes n’est vraie.

– 238 –
Recodage de variables

I M P O R TA N T

Attention : comme les conditions sont testĂ©es l’une aprĂšs l’autre et que la valeur renvoyĂ©e est celle
correspondant à la premiùre condition vraie, l’ordre de ces conditions est trùs important. Il faut
absolument aller du plus spécifique au plus général.

Par exemple le recodage suivant ne fonctionne pas :

R> hdv2003$statut <- case_when(


hdv2003$sexe == "Homme" ~ "Homme",
hdv2003$sexe == "Homme" & hdv2003$age > 60 ~ "Homme de plus de 60 ans",
TRUE ~ "Autre"
)

freq(hdv2003$statut)

Comme la condition sexe == "Homme" est plus générale que sexe == "Homme" & age > 60 ,
cette deuxiĂšme condition n’est jamais testĂ©e ! On n’obtiendra jamais la valeur correspondante.

Pour que ce recodage fonctionne il faut donc changer l’ordre des conditions pour aller du plus
spécifique au plus général :

R> hdv2003$statut <- case_when(


hdv2003$sexe == "Homme" & hdv2003$age > 60 ~ "Homme de plus de 60 ans",
hdv2003$sexe == "Homme" ~ "Homme",
TRUE ~ "Autre"
)

freq(hdv2003$statut)

Vous pouvez trouver des exercices avec leur solution dans l’Introduction à R et au tidyverse de Julien
Barnier.

Pour aller plus loin, R for Data Science de Garrett Grolemund et Hadley Wickham.

Recodage et [Link]
Nous aborderons dans un prochain chapitre, page 259 l’extension [Link] qui Ă©tend les tableaux de
données et modifie complÚtement la syntaxe utilisée entre les crochets. Elle nécessite un petit temps
d’adaptation mais, une fois maĂźtrisĂ©e, elle facile le quotidien lorsqu’il s’agit de manipuler et recoder les
données. Ci-dessous, un petit avant-goût, reprenons quelques exemples précédents.

– 239 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> library([Link])
dt <- [Link](hdv2003)

dt[, [Link] := 0]
dt[cinema == "Oui", [Link] := [Link] + 10]
dt[[Link] == "Oui", [Link] := [Link] + 30]
dt[sport == "Oui", [Link] := [Link] + 20]
table(dt$[Link])

dt[cuisine == "Oui" & bricol == "Oui", [Link] := "Cuisine et Bricolag


e"]
dt[cuisine == "Oui" & bricol == "Non", [Link] := "Cuisine seulement"]
dt[cuisine == "Non" & bricol == "Oui", [Link] := "Bricolage seulement"]
dt[cuisine == "Non" & bricol == "Non", [Link] := "Ni cuisine ni bricola
ge"]

R> table(dt$[Link])

Bricolage seulement Cuisine et Bricolage


437 416
Cuisine seulement Ni cuisine ni bricolage
465 682

R> dt[cuisine == "Oui" & bricol == "Oui", [Link] := "Cuisine et Bricolag


e"]
dt[cuisine == "Oui" & bricol == "Non", [Link] := "Cuisine seulement"]
dt[cuisine == "Non" & bricol == "Oui", [Link] := "Bricolage seulement"]
dt[cuisine == "Non" & bricol == "Non", [Link] := "Ni cuisine ni bricola
ge"]

R> table(dt$[Link])

Bricolage seulement Cuisine et Bricolage


437 416
Cuisine seulement Ni cuisine ni bricolage
465 682

– 240 –
Manipuler les données avec
dplyr
Préparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Les verbes de dplyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
slice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
select, rename et relocate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
arrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
mutate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Enchaßner les opérations avec le «pipe» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
Opérations groupées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
group_by . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
summarise et count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
Grouper selon plusieurs variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Autres fonctions utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
sample_n et sample_frac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
lead et lag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
tally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
distinct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
Fonctions avancées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
dplyr et [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258
dplyr et survey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 258

GUIDE-R

Une version actualisée de ce chapitre est disponible sur guide-R : dplyr & Le pipe

– 241 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

NOTE

La version originale de ce chapitre a été écrite par Julien Barnier dans le cadre de son Introduction à R
et au tidyverse.

WEBIN-R

Ce chapitre est évoqué dans le webin-R #04 (manipuler les données avec dplyr) sur YouTube.

dplyr est une extension facilitant le traitement et la manipulation de données contenues dans une ou
plusieurs tables (qu’il s’agisse de data frame ou de tibble). Elle propose une syntaxe claire et cohĂ©rente, sous
formes de verbes, pour la plupart des opérations de ce type.

Par ailleurs, les fonctions de dplyr sont en général plus rapides que leur équivalent sous R de base, elles
permettent donc de traiter des données de grande dimension1.

dplyr part du principe que les données sont tidy (voir la section consacrée aux tidy data, page 64). Les
fonctions de l’extension peuvent s’appliquer à des tableaux de type [Link] ou tibble , et elles
retournent systématiquement un tibble (voir la section dédiée, page 65).

Préparation
dplyr fait partie du coeur du tidyverse, elle est donc chargée automatiquement avec :

R> library(tidyverse)

On peut également la charger individuellement avec :

R> library(dplyr)

Dans ce qui suit on va utiliser les donnĂ©es du jeu de donnĂ©es nycflights13, contenu dans l’extension du
mĂȘme nom (qu’il faut donc avoir installĂ©). Celui-ci correspond aux donnĂ©es de tous les vols au dĂ©part d’un
des trois aĂ©roports de New-York en 2013. Il a la particularitĂ© d’ĂȘtre rĂ©parti en trois tables :

‱ flights contient des informations sur les vols : date, dĂ©part, destination, horaires, retard

‱ airports contient des informations sur les aĂ©roports
‱ airlines contient des donnĂ©es sur les compagnies aĂ©riennes

1. Elles sont cependant moins rapides que les fonctions de [Link], voir le chapitre dédié, page 259

– 242 –
Manipuler les données avec dplyr

On va charger les trois tables du jeu de données :

R> library(nycflights13)
## Chargement des trois tables du jeu de données
data(flights)
data(airports)
data(airlines)

Normalement trois objets correspondant aux trois tables ont dĂ» apparaĂźtre dans votre environnement.

Ces trois tableaux sont au format tibble. Il s’agit d’une extension des tableaux de donnĂ©es utilisĂ© par
le tidyverse. Les tibble {data-pkg=“tibble} s’utilisent comme des [Link] , avec justes quelques
différentes :

‱ leur classe est c("tbl_df", "tbf", "[Link]") ;


‱ leur prĂ©sentation dans la console est amĂ©lioriĂ©e ;
‱ df[, j] renvoie toujours un tibble avec une seule colonne (et non le contenu de cette
colonne que l’on obtient avec df[[j]] ) ;
‱ les colonnes d’un tibble peuvent ĂȘtre des listes ;
‱ Ă  la diffĂ©rence d’un tableau de donnĂ©es classique oĂč il est possible d’utiliser un nom partiel (par
exemple Ă©crire df$ab pour obtenir df$abc ), il est obligatoire d’utiliser les noms complets avec
un tibble .

Pour convertir un tableau de données en tibble , on utilisera la fonction as_tibble .

Les verbes de dplyr


La manipulation de données avec dplyr se fait en utilisant un nombre réduit de verbes, qui correspondent
chacun à une action différente appliquée à un tableau de données.

slice
Le verbe slice sélectionne des lignes du tableau selon leur position. On lui passe un chiffre ou un
vecteur de chiffres.

Si on souhaite sélectionner la 345e ligne du tableau airports :

R> slice(airports, 345)

Si on veut sélectionner les 5 premiÚres lignes :

R> slice(airports, 1:5)

– 243 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

filter
filter sĂ©lectionne des lignes d’un tableau de donnĂ©es selon une condition. On lui passe en paramĂštre
un test, et seules les lignes pour lesquelles ce test renvoit TRUE (vrai) sont conservées.

Par exemple, si on veut sélectionner les vols du mois de janvier, on peut filtrer sur la variable month de la
maniĂšre suivante :

R> filter(flights, month == 1)

Si on veut uniquement les vols avec un retard au départ (variable dep_delay) compris entre 10 et 15
minutes :

R> filter(flights, dep_delay >= 10 & dep_delay <= 15)

Si on passe plusieurs arguments Ă  filter , celui-ci rajoute automatiquement une condition et entre
les conditions. La ligne ci-dessus peut donc Ă©galement ĂȘtre Ă©crite de la maniĂšre suivante, avec le mĂȘme
résultat :

R> filter(flights, dep_delay >= 10, dep_delay <= 15)

Enfin, on peut également placer des fonctions dans les tests, qui nous permettent par exemple de
sélectionner les vols avec la plus grande distance :

R> filter(flights, distance == max(distance))

select, rename et relocate


select permet de sĂ©lectionner des colonnes d’un tableau de donnĂ©es. Ainsi, si on veut extraire les
colonnes lat et lon du tableau airports :

R> select(airports, lat, lon)

Si on fait prĂ©cĂ©der le nom d’un - , la colonne est Ă©liminĂ©e plutĂŽt que sĂ©lectionnĂ©e :

R> select(airports, -lat, -lon)

select comprend toute une série de fonctions facilitant la sélection de multiples colonnes. Par exemple,
starts_with , ends_width , contains ou matches permettent d’exprimer des conditions sur les

– 244 –
Manipuler les données avec dplyr

noms de variables :

R> select(flights, starts_with("dep_"))

La syntaxe colonne1:colonne2 permet de sélectionner toutes les colonnes situées entre colonne1 et
colonne2 incluses2 :

R> select(flights, year:day)

all_of et any_of permettent de fournir une liste de variables Ă  extraire sous forme de vecteur textuel.
Alors que all_of renverra une erreur si une variable n’est pas trouvĂ©e dans le tableau de dĂ©part,
any_of sera moins stricte.

R> select(flights, all_of(c("year", "month", "day")))

R> select(flights, all_of(c("century", "year", "month", "day")))

Erreur : Can't subset columns that don't exist.


x Column `century` doesn't exist.

R> select(flights, any_of(c("century", "year", "month", "day")))

where permets de sĂ©lectionner des variables Ă  partir d’une fonction qui renvoie une valeur logique. Par
exemple, pour sélectionner seulement les variables textuelles.

R> select(flights, where([Link]))

select peut ĂȘtre utilisĂ©e pour rĂ©ordonner les colonnes d’une table en utilisant la fonction
everything() , qui sĂ©lectionne l’ensemble des colonnes non encore sĂ©lectionnĂ©es. Ainsi, si on souhaite
faire passer la colonne name en premiĂšre position de la table airports , on peut faire :

R> select(airports, name, everything())

Pour réordonner des colonnes, on pourra aussi avoir recours à relocate en indiquant les premiÚres
variables. IL n’est pas nĂ©cessaire d’ajouter everything() car avec relocate toutes les variables sont
conservées.

2. À noter que cette opĂ©ration est un peu plus “fragile” que les autres, car si l’ordre des colonnes change elle peut
renvoyer un résultat différent.

– 245 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> relocate(airports, lon, lat, name)

Une variante de select est rename 3, qui permet de renommer facilement des colonnes. On l’utilise
en lui passant des paramĂštres de la forme nouveau_nom = ancien_nom . Ainsi, si on veut renommer les
colonnes lon et lat de airports en longitude et latitude :

R> dplyr::rename(airports, longitude = lon, latitude = lat)

Si les noms de colonnes comportent des espaces ou des caractÚres spéciaux, on peut les entourer de
guillemets ( " ) ou de quotes inverses ( ` ) :

R> tmp <- dplyr::rename(flights,


"retard départ" = dep_delay,
"retard arrivée" = arr_delay)
select(tmp, `retard départ`, `retard arrivée`)

arrange
arrange rĂ©ordonne les lignes d’un tableau selon une ou plusieurs colonnes.

Ainsi, si on veut trier le tableau flights selon le retard au départ croissant :

R> dplyr::arrange(flights, dep_delay)

On peut trier selon plusieurs colonnes. Par exemple selon le mois, puis selon le retard au départ :

R> dplyr::arrange(flights, month, dep_delay)

Si on veut trier selon une colonne par ordre décroissant, on lui applique la fonction desc() :

R> dplyr::arrange(flights, desc(dep_delay))

Combiné avec slice , arrange permet par exemple de sélectionner les trois vols ayant eu le plus de
retard :

R> tmp <- dplyr::arrange(flights, desc(dep_delay))


slice(tmp, 1:3)

3. Il est Ă©galement possible de renommer des colonnes directement avec select , avec la mĂȘme syntaxe que pour
rename .

– 246 –
Manipuler les données avec dplyr

mutate
mutate permet de créer de nouvelles colonnes dans le tableau de données, en général à partir de
variables existantes.

Par exemple, la table airports contient l’altitude de l’aĂ©roport en pieds. Si on veut crĂ©er une nouvelle
variable alt_m avec l’altitude en mùtres, on peut faire :

R> airports <- mutate(airports, alt_m = alt / 3.2808)


select(airports, name, alt, alt_m)

On peut créer plusieurs nouvelles colonnes en une seule fois, et les expressions successives peuvent
prendre en compte les rĂ©sultats des calculs prĂ©cĂ©dents. L’exemple suivant convertit d’abord la distance en
kilomĂštres dans une variable distance_km, puis utilise cette nouvelle colonne pour calculer la vitesse
en km/h.

R> flights <- mutate(flights,


distance_km = distance / 0.62137,
vitesse = distance_km / air_time * 60)
select(flights, distance, distance_km, vitesse)

À noter que mutate est Ă©videmment parfaitement compatible avec les fonctions vues dans le chapitre
sur les recodages, page 201 : fonctions de forcats, if_else , case_when 


L’avantage d’utiliser mutate est double. D’abord il permet d’éviter d’avoir Ă  saisir le nom du tableau de
donnĂ©es dans les conditions d’un if_else ou d’un case_when :

R> flights <- mutate(flights,


type_retard = case_when(
dep_delay > 0 & arr_delay > 0 ~ "Retard départ et arrivé
e",
dep_delay > 0 & arr_delay <= 0 ~ "Retard départ",
dep_delay <= 0 & arr_delay > 0 ~ "Retard arrivée",
TRUE ~ "Aucun retard"))

Utiliser mutate pour les recodages permet aussi de les intégrer dans un pipeline de traitement de
données, concept présenté dans la section suivante.

Citons également les fonctions recode et recode_factor .

– 247 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> flights$month_name <- recode_factor(flights$month,


"1" = "Jan",
"2" = "Feb",
"3" = "Mar",
"4" = "Apr",
"5" = "May",
"6" = "Jun",
"7" = "Jul",
"8" = "Aug",
"9" = "Sep",
"10" = "Oct",
"11" = "Nov",
"12" = "Dec"
)

Enchaßner les opérations avec le «pipe»


GUIDE-R

Une version actualisée de cette section est disponible sur guide-R : Le pipe

Quand on manipule un tableau de donnĂ©es, il est trĂšs frĂ©quent d’enchaĂźner plusieurs opĂ©rations. On va par
exemple filtrer pour extraire une sous-population, sélectionner des colonnes puis trier selon une variable.

Dans ce cas on peut le faire de deux maniĂšres diffĂ©rentes. La premiĂšre est d’effectuer toutes les
opérations en une fois en les «emboßtant» :

R> arrange(select(filter(flights, dest == "LAX"), dep_delay, arr_delay), dep_dela


y)

Cette notation a plusieurs inconvénients :

‱ elle est peu lisible


‱ les opĂ©rations apparaissent dans l’ordre inverse de leur rĂ©alisation. Ici on effectue d’abord le
filter , puis le select , puis le arrange , alors qu’à la lecture du code c’est le arrange qui
apparaĂźt en premier.
‱ Il est difficile de voir quel paramùtre se rapporte à quelle fonction

Une autre maniĂšre de faire est d’effectuer les opĂ©rations les unes aprĂšs les autres, en stockant les
résultats intermédiaires dans un objet temporaire :

– 248 –
Manipuler les données avec dplyr

R> tmp <- filter(flights, dest == "LAX")


tmp <- select(tmp, dep_delay, arr_delay)
arrange(tmp, dep_delay)

C’est nettement plus lisible, l’ordre des opĂ©rations est le bon, et les paramĂštres sont bien rattachĂ©s Ă 
leur fonction. Par contre, ça reste un peu “verbeux”, et on crĂ©e un objet temporaire tmp dont on n’a pas
réellement besoin.

Pour simplifier et améliorer encore la lisibilité du code, on va utiliser un nouvel opérateur, baptisé pipe4.
Le pipe se note %>% , et son fonctionnement est le suivant : si j’exĂ©cute expr %>% f , alors le rĂ©sultat de
l’expression expr , Ă  gauche du pipe, sera passĂ© comme premier argument Ă  la fonction f , Ă  droite du
pipe, ce qui revient à exécuter f(expr) .

Ainsi les deux expressions suivantes sont rigoureusement équivalentes :

R> filter(flights, dest == "LAX")

R> flights %>% filter(dest == "LAX")

Ce qui est intĂ©ressant dans cette histoire, c’est qu’on va pouvoir enchaĂźner les pipes. PlutĂŽt que d’écrire :

R> select(filter(flights, dest == "LAX"), dep_delay, arr_delay)

On va pouvoir faire :

R> flights %>% filter(dest == "LAX") %>% select(dep_delay, arr_delay)

À chaque fois, le rĂ©sultat de ce qui se trouve Ă  gauche du pipe est passĂ© comme premier argument Ă  ce
qui se trouve à droite : on part de l’objet flights , qu’on passe comme premier argument à la fonction
filter , puis on passe le résultat de ce filter comme premier argument du select .

Le rĂ©sultat final est le mĂȘme avec les deux syntaxes, mais avec le pipe l’ordre des opĂ©rations correspond Ă 
l’ordre naturel de leur exĂ©cution, et on n’a pas eu besoin de crĂ©er d’objet intermĂ©diaire.

Si la liste des fonctions enchaßnées est longue, on peut les répartir sur plusieurs lignes à condition que
l’opĂ©rateur %>% soit en fin de ligne :

4. Le pipe a Ă©tĂ© introduit Ă  l’origine par l’extension magrittr, et repris par dplyr

– 249 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> flights %>%


filter(dest == "LAX") %>%
select(dep_delay, arr_delay) %>%
arrange(dep_delay)

NOTE

On appelle une suite d’instructions de ce type un pipeline.

Évidemment, il est naturel de vouloir rĂ©cupĂ©rer le rĂ©sultat final d’un pipeline pour le stocker dans un objet.
Par exemple, on peut stocker le résultat du pipeline ci-dessus dans un nouveau tableau delay_la de la
maniĂšre suivante :

R> delay_la <- flights %>%


filter(dest == "LAX") %>%
select(dep_delay, arr_delay) %>%
arrange(dep_delay)

Dans ce cas, delay_la contiendra le tableau final, obtenu aprĂšs application des trois instructions
filter , select et arrange .

Cette notation n’est pas forcĂ©ment trĂšs intuitive au dĂ©part. Il faut bien comprendre que c’est le rĂ©sultat
final, une fois application de toutes les opĂ©rations du pipeline, qui est renvoyĂ© et stockĂ© dans l’objet en
début de ligne.

Une maniĂšre de le comprendre peut ĂȘtre de voir que la notation suivante :

R> delay_la <- flights %>%


filter(dest == "LAX") %>%
select(dep_delay, arr_delay)

est équivalente à :

R> delay_la <- (flights %>% filter(dest == "LAX") %>% select(dep_delay, arr_dela
y))

NOTE

L’utilisation du pipe n’est pas obligatoire, mais elle rend les scripts plus lisibles et plus rapides à saisir.
On l’utilisera donc dans ce qui suit.

– 250 –
Manipuler les données avec dplyr

Opérations groupées

group_by
Un élément trÚs important de dplyr est la fonction group_by . Elle permet de définir des groupes de
lignes à partir des valeurs d’une ou plusieurs colonnes. Par exemple, on peut grouper les vols selon leur
mois :

R> flights %>% group_by(month)

Par dĂ©faut ceci ne fait rien de visible, Ă  part l’apparition d’une mention Groups dans l’affichage du rĂ©sultat.
Mais Ă  partir du moment oĂč des groupes ont Ă©tĂ© dĂ©finis, les verbes comme slice , mutate ou
summarise vont en tenir compte lors de leurs opérations.

Par exemple, si on applique slice à un tableau préalablement groupé, il va sélectionner les lignes aux
positions indiquées pour chaque groupe. Ainsi la commande suivante affiche le premier vol de chaque mois,
selon leur ordre d’apparition dans le tableau :

R> flights %>% group_by(month) %>% slice(1)

Idem pour mutate : les opérations appliquées lors du calcul des valeurs des nouvelles colonnes sont
aplliquĂ©e groupe de lignes par groupe de lignes. Dans l’exemple suivant, on ajoute une nouvelle colonne
qui contient le retard moyen du mois correspondant :

R> flights %>%


group_by(month) %>%
mutate(mean_delay_month = mean(dep_delay, [Link] = TRUE)) %>%
select(dep_delay, month, mean_delay_month)

Ceci peut permettre, par exemple, de déterminer si un retard donné est supérieur ou inférieur au retard
moyen du mois en cours.

group_by peut aussi ĂȘtre utile avec filter , par exemple pour sĂ©lectionner les vols avec le retard au
départ le plus important pour chaque mois :

R> flights %>%


group_by(month) %>%
filter(dep_delay == max(dep_delay, [Link] = TRUE))

– 251 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

I M P O R TA N T

Attention : la clause group_by marche pour les verbes déjà vus précédemment, sauf pour arrange ,
qui par défaut trie la table sans tenir compte des groupes. Pour obtenir un tri par groupe, il faut lui
ajouter l’argument .by_group = TRUE .

On peut voir la différence en comparant les deux résultats suivants :

R> flights %>%


group_by(month) %>%
dplyr::arrange(desc(dep_delay))

R> flights %>%


group_by(month) %>%
dplyr::arrange(desc(dep_delay), .by_group = TRUE)

summarise et count
summarise permet d’agrĂ©ger les lignes du tableau en effectuant une opĂ©ration “rĂ©sumĂ©e” sur une ou
plusieurs colonnes. Par exemple, si on souhaite connaĂźtre les retards moyens au dĂ©part et Ă  l’arrivĂ©e pour
l’ensemble des vols du tableau flights :

R> flights %>%


dplyr::summarise(
retard_dep = mean(dep_delay, [Link]=TRUE),
retard_arr = mean(arr_delay, [Link]=TRUE)
)

Cette fonction est en gĂ©nĂ©ral utilisĂ©e avec group_by , puisqu’elle permet du coup d’agrĂ©ger et rĂ©sumer
les lignes du tableau groupe par groupe. Si on souhaite calculer le délai maximum, le délai minimum et le
délai moyen au départ pour chaque mois, on pourra faire :

R> flights %>%


group_by(month) %>%
dplyr::summarise(
max_delay = max(dep_delay, [Link]=TRUE),
min_delay = min(dep_delay, [Link]=TRUE),
mean_delay = mean(dep_delay, [Link]=TRUE)
)

– 252 –
Manipuler les données avec dplyr

summarise dispose d’un opĂ©rateur spĂ©cial, n() , qui retourne le nombre de lignes du groupe. Ainsi si on
veut le nombre de vols par destination, on peut utiliser :

R> flights %>%


group_by(dest) %>%
dplyr::summarise(nb = n())

n() peut aussi ĂȘtre utilisĂ©e avec filter et mutate .

À noter que quand on veut compter le nombre de lignes par groupe, on peut utiliser directement la
fonction count . Ainsi le code suivant est identique au précédent :

R> flights %>%


dplyr::count(dest)

Grouper selon plusieurs variables


On peut grouper selon plusieurs variables Ă  la fois, il suffit de les indiquer dans la clause du group_by :

R> flights %>%


group_by(month, dest) %>%
dplyr::summarise(nb = n()) %>%
dplyr::arrange(desc(nb))

`summarise()` has grouped output by 'month'. You can


override using the `.groups` argument.

On peut également compter selon plusieurs variables :

R> flights %>%


dplyr::count(origin, dest) %>%
dplyr::arrange(desc(n))

On peut utiliser plusieurs opĂ©rations de groupage dans le mĂȘme pipeline. Ainsi, si on souhaite dĂ©terminer
le couple origine/destination ayant le plus grand nombre de vols selon le mois de l’annĂ©e, on devra
procéder en deux étapes :

‱ d’abord grouper selon mois, origine et destination pour calculer le nombre de vols
‱ puis grouper uniquement selon le mois pour sĂ©lectionner la ligne avec la valeur maximale.

Au final, on obtient le code suivant :

– 253 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> flights %>%


group_by(month, origin, dest) %>%
dplyr::summarise(nb = n()) %>%
group_by(month) %>%
filter(nb == max(nb))

`summarise()` has grouped output by 'month', 'origin'. You


can override using the `.groups` argument.

Lorsqu’on effectue un group_by suivi d’un summarise , le tableau rĂ©sultat est automatiquement
dégroupé de la derniÚre variable de regroupement. Ainsi le tableau généré par le code suivant est groupé par
month et origin :

R> flights %>%


group_by(month, origin, dest) %>%
dplyr::summarise(nb = n())

`summarise()` has grouped output by 'month', 'origin'. You


can override using the `.groups` argument.

Cela peut permettre “d’enchaĂźner” les opĂ©rations groupĂ©es. Dans l’exemple suivant on calcule le
pourcentage des trajets pour chaque destination par rapport Ă  tous les trajets du mois :

R> flights %>%


group_by(month, dest) %>%
dplyr::summarise(nb = n()) %>%
mutate(pourcentage = nb / sum(nb) * 100)

`summarise()` has grouped output by 'month'. You can


override using the `.groups` argument.

On peut Ă  tout moment “dĂ©grouper” un tableau Ă  l’aide de ungroup . Ce serait par exemple nĂ©cessaire,
dans l’exemple prĂ©cĂ©dent, si on voulait calculer le pourcentage sur le nombre total de vols plutĂŽt que sur
le nombre de vols par mois :

– 254 –
Manipuler les données avec dplyr

R> flights %>%


group_by(month, dest) %>%
dplyr::summarise(nb = n()) %>%
ungroup() %>%
mutate(pourcentage = nb / sum(nb) * 100)

`summarise()` has grouped output by 'month'. You can


override using the `.groups` argument.

À noter que count , par contre, renvoit un tableau non groupĂ© :

R> flights %>%


dplyr::count(month, dest)

Autres fonctions utiles


dplyr contient beaucoup d’autres fonctions utiles pour la manipulation de donnĂ©es.

sample_n et sample_frac
sample_n et sample_frac permettent de sélectionner un nombre de lignes ou une fraction des lignes
d’un tableau alĂ©atoirement. Ainsi si on veut choisir 5 lignes au hasard dans le tableau airports :

R> airports %>% sample_n(5)

Si on veut tirer au hasard 10% des lignes de flights :

R> flights %>% sample_frac(0.1)

Ces fonctions sont utiles notamment pour faire de “l’échantillonnage” en tirant au hasard un certain
nombre d’observations du tableau.

lead et lag
lead et lag permettent de dĂ©caler les observations d’une variable d’un cran vers l’arriĂšre (pour lead )
ou vers l’avant (pour lag ).

– 255 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> lead(1:5)

[1] 2 3 4 5 NA

R> lag(1:5)

[1] NA 1 2 3 4

Ceci peut ĂȘtre utile pour des donnĂ©es de type “sĂ©ries temporelles”. Par exemple, on peut facilement
calculer l’écart entre le retard au dĂ©part de chaque vol et celui du vol prĂ©cĂ©dent :

R> flights %>%


mutate(dep_delay_prev = lead(dep_delay),
dep_delay_diff = dep_delay - dep_delay_prev) %>%
select(dep_delay_prev, dep_delay, dep_delay_diff)

tally
tally est une fonction qui permet de compter le nombre d’observations d’un groupe :

R> flights %>%


group_by(month, origin, dest) %>%
tally

Lors de son premier appel, elle sera Ă©quivalente Ă  un summarise(n = n()) ou Ă  un count() . LĂ  oĂč la
fonction est intelligente, c’est que si on l’appelle plusieurs fois successivement, elle prendra en compte
l’existence d’un n dĂ©jĂ  calculĂ© et effectuera automatiquement un summarise(n = sum(n)) :

R> flights %>%


group_by(month, origin, dest) %>%
tally %>%
tally

distinct
distinct filtre les lignes du tableau pour ne conserver que les lignes distinctes, en supprimant toutes
les lignes en double.

– 256 –
Manipuler les données avec dplyr

R> flights %>%


select(day, month) %>%
distinct

On peut lui spécifier une liste de variables : dans ce cas, pour toutes les observations ayant des valeurs
identiques pour les variables en question, distinct ne conservera que la premiùre d’entre elles.

R> flights %>%


distinct(month, day)

L’option .keep_all permet, dans l’opĂ©ration prĂ©cĂ©dente, de conserver l’ensemble des colonnes du
tableau :

R> flights %>%


distinct(month, day, .keep_all = TRUE)

Fonctions avancées
On pourra consulter le chapitre dplyr avancĂ© de l’excellente Introduction Ă  R et au tidyverse de Julien
Barnier ([Link]

Julien Barnier aborde notamment les fonctions across pour appliquer une transformation Ă  plusieurs
colonnes, rowwise et c_across pour appliquer une transformation ligne Ă  ligne, rename_with pour
renommer les colonnes Ă  l’aide d’une fonction, ou encore la syntaxe abrĂ©gĂ©e permettant de dĂ©finir des
fonctions anonymes.

Ressources
Toutes les ressources ci-dessous sont en anglais


Le livre R for data science, librement accessible en ligne, contient plusieurs chapitres trĂšs complets sur la
manipulation des données, notamment :

‱ Data transformation pour les manipulations


‱ Relational data pour les tables multiples

Le site de l’extension comprend une liste des fonctions et les pages d’aide associĂ©es, mais aussi une
introduction au package et plusieurs articles dont un spécifiquement sur les jointures.

Une “antisĂšche” trĂšs synthĂ©tique est Ă©galement accessible depuis RStudio, en allant dans le menu Help
puis Cheatsheets et Data Transformation with dplyr.

– 257 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Enfin, on trouvera des exercices dans l’Introduction à R et au tidyverse de Julien Barnier.

dplyr et [Link]
Pour ceux travaillant Ă©galement avec l’extension [Link], il est possible de concilier tibble et [Link]
avec l’extension dtplyr. Cette extension a connu une profonde Ă©volution en 2019. Pour plus
d’informations, voir [Link] Pour dĂ©crouvrir [Link], voir le chapitre dĂ©diĂ©,
page 259.

dplyr et survey
L’extension srvyr vise Ă  permettre d’utiliser les verbes de dplyr avec les plans d’échantillonnage complexe
définis avec survey. Le fonctionnement de cette extension est expliqué dans une vignette dédiée :
[Link]

– 258 –
Manipulations avancées
avec [Link]
Convertir un [Link] en [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
setDT et setDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
dplyr et [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
La syntaxe des crochets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Sélectionner des observations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Sélectionner des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Grouper les résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Ajouter / Modifier / Supprimer une variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Enchaßner les opérations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Réorganiser un tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Ressources en ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264

L’extension [Link] permets d’étendre les tableaux de donnĂ©es. Elle modifie radicalement la syntaxe
des crochets, permettant un code plus court et surtout plus puissant. Par ailleurs, elle est particuliĂšrement
rapide pour opĂ©rer des opĂ©rations sur les donnĂ©es et permets d’effectuer des opĂ©rations par assignation
directe sans avoir à copier les objets en mémoire. Autrement dit, elle est particuliÚrement utile lorsque
l’on travaille sur des gros fichiers de donnĂ©es.

Certes, l’apprentissage de cette nouvelle syntaxe peut faire peur au dĂ©but, mais c’est un gain tellement
notable une fois qu’on la maütrise, qu’il est difficile de revenir en arriùre.

Pour un tutoriel (en anglais et en ligne) écrit par les développeurs de [Link], voir
[Link] On pourra aussi se référer
au site officiel et ses différentes vignettes (en anglais) : [Link]

Convertir un [Link] en [Link]


Il suffit d’avoir recours à la fonction [Link] .

– 259 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> library([Link])
iris2 <- [Link](iris)
class(iris2)

[1] "[Link]" "[Link]"

Comme on le voit, cela ajoute plusieurs classes additionnelles au tableau de données, celui-ci restant
malgré tout toujours un [Link]. Cependant, la syntaxe des crochets simples [] change radicalement,
tandis que les crochets doubles [[]] restent inchangĂ©s. Par contre, comme il s’agit toujours d’un tableau
de donnĂ©es classique, on pourra l’utiliser avec les fonctions des autres extensions de R. Si jamais vous
rencontriez un problÚme, il est toujours possible de reconvertir en tableau de données classique avec
setDF (voir ci-dessous).

setDT et setDF
Lors de l’utilisation de [Link] , le tableau de donnĂ©es original a d’abord Ă©tĂ© copiĂ© en mĂ©moire,
converti puis il a fallu le sauvegarder dans un objet avec <- . Lorsqu’on l’on manipule de gros tableaux,
cela est gourmand en ressources systĂšme et prend du temps.

C’est pour cela que [Link] fournie plusieurs fonctions (commençant parle prĂ©fixe set ) qui modifient
directement l’objet sĂ©lectionnĂ© en mĂ©moire, ce qu’on appelle «modification par assignation». Ce type de
fonction est beaucoup plus rapide et efficace en termes de ressources systĂšme. On notera Ă©galement qu’il
est inutile de stocker le rĂ©sultats dans un objet puisque l’objet a Ă©tĂ© modifiĂ© directement en mĂ©moire.

setDT converti un tableaux de donnĂ©es en [Link] tandis que setDF fait l’opĂ©ration opposĂ©e.

R> setDT(iris)
class(iris)

[1] "[Link]" "[Link]"

R> setDF(iris)
class(iris)

[1] "[Link]"

– 260 –
Manipulations avancées avec [Link]

dplyr et [Link]
Pour ceux travaillant également avec les extension dplyr et tibble, il est possible de concilier tibble et
[Link] avec l’extension dtplyr. Cette extension a connu une profonde Ă©volution en 2019. Pour plus
d’informations, voir [Link]

La syntaxe des crochets


La syntaxe des crochets change radicalement avec [Link]. Elle est de la forme objet[i, j, by]
(dans sa forme la plus simple, pour une prĂ©sentation exhaustive, voir le fichier d’aide de
[Link]-package ).

Sélectionner des observations


Cela se fait en indiquant une indiquant une condition au premier argument, à savoir i . Si l’on ne procùde
Ă  une sĂ©lection en mĂȘme temps sur les variables, il n’est pas nĂ©cessaire d’indiquer de virgule , dans les
crochets.

R> iris2[[Link] < 5]

On notera que les noms indiquer entre les crochets sont Ă©valuĂ©s en fonction du contexte, en l’occurence la
liste des variables de l’objet considĂ©rĂ©. Ainsi, les noms des variables peuvent ĂȘtre indiquĂ©s tels quels, sans
utilisation du symbole $ ni des guillemets.

I M P O R TA N T

Une diffĂ©rence de taille : lorsqu’il y a des observations pour lesquelles la condition indiquĂ©e en i
renvoie NA , elles ne sont pas sélectionnées par [Link] tandis que, pour un [Link] classique
cela renvoie des lignes manquantes.

Sélectionner des variables


Pour sĂ©lectionner une variable, il suffit d’indiquer son nom dans la seconde partie, Ă  savoir j . Noter la
virgule qui permets d’indiquer que c’est une condition sur j et non sur i .

– 261 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> iris2[, [Link]]

[1] 5.1 4.9 4.7 4.6 5.0 5.4 4.6 5.0 4.4 4.9 5.4 4.8 4.8
[14] 4.3 5.8 5.7 5.4 5.1 5.7 5.1 5.4 5.1 4.6 5.1 4.8 5.0
[27] 5.0 5.2 5.2 4.7 4.8 5.4 5.2 5.5 4.9 5.0 5.5 4.9 4.4
[40] 5.1 5.0 4.5 4.4 5.0 5.1 4.8 5.1 4.6 5.3 5.0 7.0 6.4
[53] 6.9 5.5 6.5 5.7 6.3 4.9 6.6 5.2 5.0 5.9 6.0 6.1 5.6
[66] 6.7 5.6 5.8 6.2 5.6 5.9 6.1 6.3 6.1 6.4 6.6 6.8 6.7
[79] 6.0 5.7 5.5 5.5 5.8 6.0 5.4 6.0 6.7 6.3 5.6 5.5 5.5
[92] 6.1 5.8 5.0 5.6 5.7 5.7 6.2 5.1 5.7 6.3 5.8 7.1 6.3
[105] 6.5 7.6 4.9 7.3 6.7 7.2 6.5 6.4 6.8 5.7 5.8 6.4 6.5
[118] 7.7 7.7 6.0 6.9 5.6 7.7 6.3 6.7 7.2 6.2 6.1 6.4 7.2
[131] 7.4 7.9 6.4 6.3 6.1 7.7 6.3 6.4 6.0 6.9 6.7 6.9 5.8
[144] 6.8 6.7 6.7 6.3 6.5 6.2 5.9

Pour sélectionner plusieurs variables, on fournira une liste définie avec list (et non un vecteur défini
avec c ).

R> iris2[, list([Link], [Link])]

[Link] fourni un raccourci pour Ă©crire une liste : .() . A l’intĂ©rieur des crochets (mais pas en dehors),
.() sera compris comme list() .

R> iris2[, .([Link], [Link])]

Il est possible de renommer une variable Ă  la volĂ©e et mĂȘme d’en calculer d’autres.

R> iris2[, .(espece = Species, aire_petal = [Link] * [Link])]

Seul le retour est ici affectĂ©. Cela n’impacte pas le tableau d’origine. Nous verrons plus loin comment crĂ©er
/ modifier une variable.

Attention : on ne peut pas directement sélectionner une variable par sa position ou en indiquant une
chaßne de caractÚres. En effet, une valeur numérique ou textuelle est comprise comme une constante.

R> iris2[, .("Species", 3)]

Grouper les résultats


Si en j on utilise des fonctions qui à partir d’un vecteur renvoient une valeur unique (telles que mean ,
median , min , max , first , last , nth , etc.), on peut ainsi obtenir un résumé. On pourra également

– 262 –
Manipulations avancées avec [Link]

utiliser .N pour obtenir le nombre d’observations.

R> iris2[, .(min_sepal_width = min([Link]), max_sepal_width = max([Link]


h), n_observations = .N)]

Cela devient particuliĂšrement intĂ©ressant en calculant ces mĂȘmes valeurs par sous-groupe, grace au
troisiĂšme paramĂštre : by .

R> iris2[, .(min_sepal_width = min([Link]), max_sepal_width = max([Link]


h), n_observations = .N), by = Species]

Ajouter / Modifier / Supprimer une variable


[Link] introduit un nouvel opérateur := permettant de modifier une variable par assignation directe.
Cela signifie que la modification a lieu directement en mĂ©moire dans le tableau de donnĂ©es, sans qu’il soit
besoin réaffecter le résultat avec <- .

On peut également combiner := avec une sélection sur les observations en i pour ne modifier que
certaines observations. De mĂȘme, le recours Ă  by permets des calculs par groupe.

R> iris2[, group := "A"]


iris2[Species == "virginica", group := "B"]
iris2[, n_obs_per_species := .N, by = Species]

R> iris2

R> iris2[, .N, by = group]

Enchaßner les opérations


Il est possible d’enchaĂźner les opĂ©rations avec une succession de crochets.

R> iris2[, .(petal_area = [Link] * [Link], Species)][, .(min_petal_are


a = min(petal_area)), by = Species]

– 263 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Réorganiser un tableau
L’extension [Link] fournie Ă©galement deux fonctions, melt et dcast , dĂ©diĂ©e Ă  la rĂ©organisation d’un
tableau de données (respectivement wide-to-long reshaping et long-to-wide reshaping).

Pour plus de dĂ©tails, voir la vignette dĂ©diĂ©e sur le site de l’extension : [Link]
[Link]/articles/[Link]

Ressources en ligne
‱ Une introduction à [Link] par Lino Galiana : [Link]
datatable-intro/
‱ Un cours sur [Link] : [Link]

– 264 –
Tris
Fonctions R de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Extension dplyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Extension [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267

Dans ce qui suit on travaillera sur le jeu de donnĂ©es tirĂ© de l’enquĂȘte Histoire de vie, fourni avec l’extension
questionr.

R> library(questionr)
data(hdv2003)
d <- hdv2003

Fonctions R de base
La fonction sort permet de trier les Ă©lĂ©ments d’un vecteur.

R> sort(c(2, 5, 6, 1, 8))

[1] 1 2 5 6 8

On peut appliquer cette fonction à une variable, mais celle-ci ne permet que d’ordonner les valeurs de
cette variable, et pas l’ensemble du tableau de donnĂ©es dont elle fait partie. Pour cela nous avons besoin
d’une autre fonction, nommĂ©e order . Celle-ci ne renvoie pas les valeurs du vecteur triĂ©es, mais les
emplacements de ces valeurs.

Un exemple pour comprendre :

– 265 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> order(c(15, 20, 10))

[1] 3 1 2

Le résultat renvoyé signifie que la plus petite valeur est la valeur située en 3e position, suivie de celle en
1Ăšre position et de celle en 2e position. Tout cela ne paraĂźt pas passionnant Ă  premiĂšre vue, mais si on
mĂ©lange ce rĂ©sultat avec un peu d’indexation directe, ça devient intĂ©ressant


R> head(order(d$age))

[1] 162 215 346 377 511 646

Ce que cette fonction renvoie, c’est l’ordre dans lequel on doit placer les Ă©lĂ©ments de age, et donc par
extension les lignes de d , pour que la variable soit triée par ordre croissant. Par conséquent, si on fait :

R> [Link] <- d[order(d$age), ]

Alors on a triĂ© les lignes de d par ordre d’ñge croissant ! Et si on fait un petit :

R> head([Link], 3)

On a les caractĂ©ristiques des trois enquĂȘtĂ©s les plus jeunes.

On peut Ă©videmment trier par ordre dĂ©croissant en utilisant l’option decreasing=TRUE . On peut donc
afficher les caractéristiques des trois individus les plus ùgés avec :

R> head(d[order(d$age, decreasing = TRUE), ], 3)

On peut Ă©galement trier selon plusieurs variables. Ainsi, si l’on souhaite trier le tableau par sexe puis, au
sein de chaque sexe, par age :

R> [Link] <- d[order(d$sexe, d$age), ]

NOTE

Si l’on transmets une variable textuelle, le tri sera rĂ©alisĂ© de maniĂšre alphabĂ©tique alors que si l’on
transmets un facteur, le tri sera effectuĂ© selon l’ordre des facteurs (que l’on peut visualiser avec
levels ).

– 266 –
Tris

Extension dplyr
On aura simplement recours Ă  la fonction arrange . Un tri par ordre dĂ©croissant s’indique avec la
fonction desc .

R> library(dplyr)
tbl <- as_tibble(hdv2003)
tbl <- tbl %>% arrange(sexe, desc(age))

Extension [Link]
On pourra utiliser la fonction order dans la condition sur les observations (attention Ă  sauvegarder le
rĂ©sultats si nĂ©cessaire) ou bien la fonction setorder pour modifier l’ordre des observations directement
par assignation (modification directe en mĂ©moire de l’objet). Un tri dĂ©croissant s’indique avec le signe - .

R> library([Link])
dt <- [Link](hdv2003)

# Option 1
dt <- dt[order(sexe, -age)]

# Option 2
setorder(dt, sexe, -age)

– 267 –
Sous-ensembles
Par indexation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Fonction subset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
Fonction tapply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Extension dplyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Extension [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275

Dans ce qui suit on travaillera sur le jeu de donnĂ©es tirĂ© de l’enquĂȘte Histoire de vie, fourni avec l’extension
questionr.

R> library(questionr)
data(hdv2003)
d <- hdv2003

Par indexation
La premiùre maniùre de construire des sous-populations est d’utiliser l’indexation par conditions. On peut
ainsi facilement sélectionner une partie des observations suivant un ou plusieurs critÚres et placer le
résultat dans un nouveau tableau de données.

Par exemple si l’on souhaite isoler les hommes et les femmes :

R> dh <- d[d$sexe == "Homme", ]


df <- d[d$sexe == "Femme", ]
table(d$sexe)

Homme Femme

899 1101

– 269 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> dim(dh)

[1] 899 20

R> dim(df)

[1] 1101 20

On a à partir de là trois tableaux de données, d comportant la population totale, dh seulement les


hommes et df seulement les femmes.

On peut évidemment combiner plusieurs critÚres :

R> dh.25 <- d[d$sexe == "Homme" & d$age <= 25, ]


dim(dh.25)

[1] 86 20

Si on utilise directement l’indexation, il convient cependant d’ĂȘtre extrĂȘmement prudent avec les valeurs
manquantes. Comme indiquĂ© prĂ©cĂ©demment, la prĂ©sence d’une valeur manquante dans une condition fait
que celle-ci est Ă©valuĂ©e en NA et qu’au final la ligne correspondante est conservĂ©e par l’indexation :

R> summary(d$[Link])

Satisfaction Insatisfaction Equilibre NA's


480 117 451 952

R> [Link] <- d[d$[Link] == "Satisfaction", ]


dim([Link])

[1] 1432 20

Comme on le voit, ici [Link] contient les individus ayant la modalité Satisfaction mais aussi ceux
ayant une valeur manquante NA . C’est pourquoi il faut toujours soit vĂ©rifier au prĂ©alable qu’on n’a pas
de valeurs manquantes dans les variables de la condition, soit exclure explicitement les NA de la maniĂšre
suivante :

– 270 –
Sous-ensembles

R> [Link] <- d[d$[Link] == "Satisfaction" & ![Link](d$[Link]), ]


dim([Link])

[1] 480 20

C’est notamment pour cette raison qu’on prĂ©fĂšrera le plus souvent utiliser la fonction subset .

Fonction subset
La fonction subset permet d’extraire des sous-populations de maniùre plus simple et un peu plus
intuitive que l’indexation directe.

Celle-ci prend trois arguments principaux :

‱ le nom de l’objet de dĂ©part ;


‱ une condition sur les observations ( subset ) ;
‱ Ă©ventuellement une condition sur les colonnes ( select ).

Reprenons tout de suite un exemple déjà vu :

R> dh <- subset(d, sexe == "Homme")


df <- subset(d, sexe == "Femme")

L’utilisation de subset prĂ©sente plusieurs avantages. Le premier est d’économiser quelques touches. On
n’est en effet pas obligĂ© de saisir le nom du tableau de donnĂ©es dans la condition sur les lignes. Ainsi les
deux commandes suivantes sont équivalentes :

R> dh <- subset(d, d$sexe == "Homme")


dh <- subset(d, sexe == "Homme")

Le second avantage est que subset s’occupe du problĂšme des valeurs manquantes Ă©voquĂ©es
prĂ©cĂ©demment et les exclut de lui-mĂȘme, contrairement au comportement par dĂ©faut :

R> summary(d$[Link])

Satisfaction Insatisfaction Equilibre NA's


480 117 451 952

– 271 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> [Link] <- d[d$[Link] == "Satisfaction", ]


dim([Link])

[1] 1432 20

R> [Link] <- subset(d, [Link] == "Satisfaction")


dim([Link])

[1] 480 20

Dans le cas prĂ©sent, l’extraction obtenue avec subset est Ă©quivalente Ă  :

R> [Link] <- d[d$[Link] == "Satisfaction" & ![Link](d$[Link]), ]


dim([Link])

[1] 480 20

Enfin, l’utilisation de l’argument select est simplifiĂ© pour l’expression de condition sur les colonnes.
On peut ainsi spĂ©cifier les noms de variable sans guillemets et leur appliquer directement l’opĂ©rateur
d’exclusion - :

R> d2 <- subset(d, select = c(sexe, sport))


d2 <- subset(d, age > 25, select = -c(id, age, cinema))

Fonction tapply
NOTE

Cette section documente une fonction qui peut ĂȘtre trĂšs utile, mais pas forcĂ©ment indispensable au
départ.

La fonction tapply n’est qu’indirectement liĂ©e Ă  la notion de sous-population, mais peut permettre
d’éviter d’avoir Ă  crĂ©er ces sous-populations dans certains cas.

Son fonctionnement est assez simple, mais pas forcément intuitif. La fonction prend trois arguments :
un vecteur, un facteur et une fonction. Elle applique ensuite la fonction aux éléments du vecteur
correspondant Ă  un mĂȘme niveau du facteur. Vite, un exemple !

– 272 –
Sous-ensembles

R> tapply(d$age, d$sexe, mean)

Homme Femme
48.16 48.15

Qu’est-ce que ça signifie ? Ici tapply a sĂ©lectionnĂ© toutes les observations correspondant Ă  « Homme »,
puis appliquĂ© la fonction mean aux valeurs de age correspondantes. Puis elle a fait de mĂȘme pour les
observations correspondant Ă  « Femme ». On a donc ici la moyenne d’ñge chez les hommes et chez les
femmes.

On peut fournir à peu prùs n’importe quelle fonction à tapply :

R> tapply(d$bricol, d$sexe, freq)

$Homme
Frequency table

Class: factor (numeric)


Length: 899
Levels: 2: Non, Oui
Available: 899 (100%, NA: 0 = 0%)
Unique: 2

Item Count Percent Cum. Count Cum. Percent


--- ------ ------- --------- ------------ --------------
1 Oui 515 57.29% 515 57.29%
2 Non 384 42.71% 899 100.00%

$Femme
Frequency table

Class: factor (numeric)


Length: 1,101
Levels: 2: Non, Oui
Available: 1,101 (100%, NA: 0 = 0%)
Unique: 2

Item Count Percent Cum. Count Cum. Percent


--- ------ ------- --------- ------------ --------------
1 Non 763 69.3% 763 69.3%
2 Oui 338 30.7% 1101 100.0%

Les arguments supplémentaires fournis à tapply sont en fait fournis directement à la fonction appelée.

– 273 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> tapply(d$bricol, d$sexe, freq, total = TRUE)

$Homme
Frequency table

Class: factor (numeric)


Length: 899
Levels: 2: Non, Oui
Available: 899 (100%, NA: 0 = 0%)
Unique: 2

Item Count Percent Cum. Count Cum. Percent


--- ------ ------- --------- ------------ --------------
1 Oui 515 57.29% 515 57.29%
2 Non 384 42.71% 899 100.00%

$Femme
Frequency table

Class: factor (numeric)


Length: 1,101
Levels: 2: Non, Oui
Available: 1,101 (100%, NA: 0 = 0%)
Unique: 2

Item Count Percent Cum. Count Cum. Percent


--- ------ ------- --------- ------------ --------------
1 Non 763 69.3% 763 69.3%
2 Oui 338 30.7% 1101 100.0%

– 274 –
Sous-ensembles

NOTE

La fonction by est un équivalent (pour les tableaux de données) de tapply . La présentation des
résultats diffÚre légÚrement.

R> tapply(d$age, d$sexe, mean)

Homme Femme
48.16 48.15

R> by(d$age, d$sexe, mean)

d$sexe: Homme
[1] 48.16
---------------------------------------------
d$sexe: Femme
[1] 48.15

Extension dplyr
On utilisera tout simplement la fonction filter .

R> library(dplyr)
tbl <- as_tibble(hdv2003)
hommes_jeunes <- tbl %>% filter(sexe == "Homme", age < 30)

Voir le chapitre dédié à dplyr, page 241 pour plus de détails.

Extension [Link]
Il suffit d’indiquer la condition entre crochets.

– 275 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> library([Link])
dt <- [Link](hdv2003)
hommes_jeunes <- dt[sexe == "Hommes" & age < 30]

Il est Ă©galement possible d’utiliser la fonction subset sur un [Link].

R> hommes_jeunes <- subset(dt, sexe == "Hommes" & age < 30)

Voir le chapitre dédié à [Link], page 259 pour plus de détails.

– 276 –
Fusion de tables
La fonction merge et les jointures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 277
Jointures avec dplyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
Clés implicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
Clés explicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Types de jointures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Jointures avec [Link] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Ajouter des observations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290

WEBIN-R

Ce chapitre est évoqué dans le webin-R #04 (manipuler les données avec dplyr) sur YouTube.

Lorsqu’on traite de grosses enquĂȘtes, notamment les enquĂȘtes de l’INSEE, on a souvent Ă  gĂ©rer des
données réparties dans plusieurs tables, soit du fait de la construction du questionnaire, soit du fait de
contraintes techniques (fichiers dbf ou Excel limités à 256 colonnes, par exemple).

Cela arrive Ă©galement lorsque l’on traitre de donnĂ©es d’une enquĂȘtes rĂ©alisĂ©e Ă  diffĂ©rents niveaux (par
exemple, un questionnaire ménage et un questionnaire individu).

On peut distinguer deux situations :

‱ l’ajout de variables (jointure entre tables)


‱ l’ajout d’observations (concatĂ©nation de tables)

La fonction merge et les jointures


Une opération relativement courante consiste à fusionner plusieurs tables pour regrouper tout ou partie
des données dans un unique tableau.

Nous allons simuler artificiellement une telle situation en crĂ©ant deux tables Ă  partir de l’extrait de
l’enquĂȘte Histoire de vie :

– 277 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> library(questionr)
data(hdv2003)
d <- hdv2003
dim(d)

[1] 2000 20

R> d1 <- subset(d, select = c("id", "age", "sexe"))


dim(d1)

[1] 2000 3

R> d2 <- subset(d, select = c("id", "clso"))


dim(d2)

[1] 2000 2

On a donc deux tableaux de données, d1 et d2 , comportant chacun 2000 lignes et respectivement 3 et


2 colonnes. Comment les rassembler pour n’en former qu’un ?

Intuitivement, cela paraĂźt simple. Il suffit de « coller » d2 Ă  la droite de d1 , comme dans l’exemple suivant.

id v1 v2 id v3 id v1 v2 v3

1 H 12 1 rouge 1 H 12 rouge

+ =
2 H 17 2 bleu 2 H 17 bleu

3 F 41 3 bleu 3 F 41 bleu

4 F 9 4 rouge 4 F 9 rouge


 
 
 
 
 
 
 
 


Cela semble fonctionner. La fonction qui permet d’effectuer cette opĂ©ration sous R s’appelle cbind , elle
« colle » des tableaux cÎte à cÎte en regroupant leurs colonnes.

R> head(cbind(d1, d2))

À part le fait qu’on a une colonne id en double, le rĂ©sultat semble satisfaisant. À premiĂšre vue seulement.
Imaginons maintenant que nous avons travaillé sur d1 et d2 , et que nous avons ordonné les lignes de
d1 selon l’ñge des enquĂȘtĂ©s :

– 278 –
Fusion de tables

R> d1 <- d1[order(d1$age), ]

RĂ©pĂ©tons l’opĂ©ration de collage :

R> head(cbind(d1, d2))

Que constate-t-on ? La présence de la variable id en double nous permet de voir que les identifiants
ne coïncident plus ! En regroupant nos colonnes nous avons donc attribué à des individus les réponses
d’autres individus.

La commande cbind ne peut en effet fonctionner que si les deux tableaux ont exactement le mĂȘme
nombre de lignes, et dans le mĂȘme ordre, ce qui n’est pas le cas ici.

I M P O R TA N T

Pour éviter toute erreur, il est préférable de ne jamais utiliser cbind ou son équivalent bind_cols
fournis par dplyr.

On aura recours à la jointure entre tables présentée ci-dessous.

On va donc ĂȘtre obligĂ© de procĂ©der Ă  une fusion des deux tableaux, qui va permettre de rendre Ă  chaque
ligne ce qui lui appartient. Pour cela nous avons besoin d’un identifiant qui permet d’identifier chaque
ligne de maniĂšre unique et qui doit ĂȘtre prĂ©sent dans tous les tableaux. Dans notre cas, c’est plutĂŽt rapide,
il s’agit de la variable id.

Une fois l’identifiant identifiĂ©1, on peut utiliser la commande merge . Celle-ci va fusionner les deux
tableaux en supprimant les colonnes en double et en regroupant les lignes selon leurs identifiants :

R> [Link] <- merge(d1, d2, by = "id")


head([Link])

Ici l’utilisation de la fonction merge est plutĂŽt simple car nous sommes dans le cas de figure idĂ©al : les
lignes correspondent parfaitement et l’identifiant est clairement identifiĂ©. Parfois les choses peuvent ĂȘtre
un peu plus compliquées :

‱ parfois les identifiants n’ont pas le mĂȘme nom dans les deux tableaux. On peut alors les spĂ©cifier
par les options by.x et by.y ;
‱ parfois les deux tableaux comportent des colonnes (hors identifiants) ayant le mĂȘme nom.
merge conserve dans ce cas ces deux colonnes mais les renomme en les suffixant par .x pour
celles provenant du premier tableau et .y pour celles du second ;
‱ parfois on n’a pas d’identifiant unique préétabli, mais on en construit un Ă  partir de plusieurs

1. Si vous me passez l’expression


– 279 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

variables. On peut alors donner un vecteur en paramùtres de l’option by , par exemple


by=c("nom","prenom","[Link]") .

Une subtilitĂ© supplĂ©mentaire intervient lorsque les deux tableaux fusionnĂ©s n’ont pas exactement les
mĂȘmes lignes. Par dĂ©faut, merge ne conserve que les lignes prĂ©sentes dans les deux tableaux :

id v1 id v2
id v1 v2

+ =
1 H 1 10
1 H 10
2 H 2 15
2 H 15
3 F 5 31

On peut cependant modifier ce comportement avec les options all.x et all.y .

Ainsi, all.x = TRUE indique de conserver toutes les lignes du premier tableau. Dans ce cas merge
donne une valeur NA pour ces lignes aux colonnes provenant du second tableau. Ce qui donnerait :

id v1 id v2 id v1 v2

+ =
1 H 1 10 1 H 10

2 H 2 15 2 H 15

3 F 5 31 3 F NA

L’option all.y = TRUE fait la mĂȘme chose en conservant toutes les lignes du second tableau.

id v1 id v2 id v1 v2

+ =
1 H 1 10 1 H 10

2 H 2 15 2 H 15

3 F 5 31 5 NA 31

Enfin, on peut décider de conserver toutes les lignes des deux tableaux en utilisant à la fois
all.x = TRUE et all.y = TRUE , ce qui donne :

– 280 –
Fusion de tables

id v1 v2
id v1 id v2
1 H 10

+ =
1 H 1 10
2 H 15
2 H 2 15
3 F NA
3 F 5 31
5 NA 31

Parfois, l’un des identifiants est prĂ©sent Ă  plusieurs reprises dans l’un des tableaux (par exemple lorsque
l’une des tables est un ensemble de mĂ©nages et que l’autre dĂ©crit l’ensemble des individus de ces
mĂ©nages). Dans ce cas les lignes de l’autre table sont dupliquĂ©es autant de fois que nĂ©cessaires :

id v2 id v1 v2

id v1 1 10 1 H 10

+ =
1 H 1 18 1 H 18

2 H 1 21 1 H 21

3 F 2 15 2 H 15

3 42 3 F 42

Jointures avec dplyr


Le jeu de données nycflights13 est un exemple de données réparties en plusieurs tables. Ici on en a trois :
les informations sur les vols, celles sur les aéroports et celles sur les compagnies aériennes sont dans trois
tables distinctes.

dplyr propose différentes fonctions permettant de travailler avec des données structurées de cette
maniĂšre.

– 281 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> library(tidyverse)
library(nycflights13)
data(flights)
data(airports)
data(airlines)

Clés implicites
TrÚs souvent, les données relatives à une analyse sont réparties dans plusieurs tables différentes. Dans
notre exemple, on peut voir que la table flights contient seulement le code de la compagnie aérienne
du vol dans la variable carrier :

R> flights %>% select(carrier)

Et que par ailleurs la table airlines contient une information supplémentaire relative à ces
compagnies, Ă  savoir le nom complet.

R> airlines

Il est donc naturel de vouloir associer les deux, en l’occurrence pour ajouter les noms complets des
compagnies à la table flights . Dans ce cas on va faire une jointure : les lignes d’une table seront
associĂ©es Ă  une autre en se basant non pas sur leur position, mais sur les valeurs d’une ou plusieurs
colonnes. Ces colonnes sont appelées des clés.

Pour faire une jointure de ce type, on va utiliser la fonction left_join :

R> left_join(flights, airlines)

Pour faciliter la lecture, on va afficher seulement certaines colonnes du résultat :

R> left_join(flights, airlines) %>%


select(month, day, carrier, name)

Joining with `by = join_by(carrier)`

On voit que la table rĂ©sultat est bien la fusion des deux tables d’origine selon les valeurs des deux colonnes
clés carrier. On est parti de la table flights , et pour chaque ligne on a ajouté les colonnes de
airlines pour lesquelles la valeur de carrier est la mĂȘme. On a donc bien une nouvelle colonne name
dans notre table résultat, avec le nom complet de la compagnie aérienne.

– 282 –
Fusion de tables

NOTE

À noter qu’on peut tout à fait utiliser le pipe avec les fonctions de jointure :

flights %>% left_join(airlines) .

Nous sommes ici dans le cas le plus simple concernant les clés de jointure : les deux clés sont uniques et
portent le mĂȘme nom dans les deux tables. Par dĂ©faut, si on ne lui spĂ©cifie pas explicitement les clĂ©s, dplyr
fusionne en utilisant l’ensemble des colonnes communes aux deux tables. On peut d’ailleurs voir dans cet
exemple qu’un message a Ă©tĂ© affichĂ© prĂ©cisant que la jointure s’est faite sur la variable carrier.

Clés explicites
La table airports , elle, contient des informations supplémentaires sur les aéroports : nom complet,
altitude, position géographique, etc. Chaque aéroport est identifié par un code contenu dans la colonne
faa.

Si on regarde la table flights , on voit que le code d’identification des aĂ©roports apparaĂźt Ă  deux endroits
diffĂ©rents : pour l’aĂ©roport de dĂ©part dans la colonne origin, et pour celui d’arrivĂ©e dans la colonne
dest. On a donc deux clés de jointures possibles, et qui portent un nom différent de la clé de airports .

On va commencer par fusionner les donnĂ©es concernant l’aĂ©roport de dĂ©part. Pour simplifier l’affichage
des rĂ©sultats, on va se contenter d’un sous-ensemble des deux tables :

R> flights_ex <- flights %>% select(month, day, origin, dest)


airports_ex <- airports %>% select(faa, alt, name)

Si on se contente d’un left_join comme Ă  l’étape prĂ©cĂ©dente, on obtient un message d’erreur car
aucune colonne commune ne peut ĂȘtre identifiĂ©e comme clĂ© de jointure :

R> left_join(flights_ex, airports_ex)

Error in `left_join()`:
! `by` must be supplied when `x` and `y` have no
common variables.
â„č Use `cross_join()` to perform a cross-join.

On doit donc spĂ©cifier explicitement les clĂ©s avec l’argument by de left_join . Ici la clĂ© est nommĂ©e
origin dans la premiĂšre table, et faa dans la seconde. La syntaxe est donc la suivante :

– 283 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> left_join(flights_ex, airports_ex, by = c("origin" = "faa"))

On constate que les deux nouvelles colonnes name et alt contiennent bien les données correspondant à
l’aĂ©roport de dĂ©part.

On va stocker le résultat de cette jointure dans flights_ex :

R> flights_ex <- flights_ex %>%


left_join(airports_ex, by = c("origin" = "faa"))

Supposons qu’on souhaite maintenant fusionner à nouveau les informations de la table airports , mais
cette fois pour les aĂ©roports d’arrivĂ©e de notre nouvelle table flights_ex . Les deux clĂ©s sont donc
désormais dest dans la premiÚre table, et faa dans la deuxiÚme. La syntaxe est donc la suivante :

R> left_join(flights_ex, airports_ex, by = c("dest" = "faa"))

Cela fonctionne, les informations de l’aĂ©roport d’arrivĂ©e ont bien Ă©tĂ© ajoutĂ©es, mais on constate que les
colonnes ont été renommées. En effet, ici les deux tables fusionnées contenaient toutes les deux des
colonnes name et alt. Comme on ne peut pas avoir deux colonnes avec le mĂȘme nom dans un tableau,
dplyr a renommé les colonnes de la premiÚre table en name.x et alt.x , et celles de la deuxiÚme en
name.y et alt.y .

C’est pratique, mais pas forcĂ©ment trĂšs parlant. On pourrait renommer manuellement les colonnes pour
avoir des intitulĂ©s plus explicites avec rename , mais on peut aussi utiliser l’argument suffix de
left_join , qui permet d’indiquer les suffixes à ajouter aux colonnes. Ainsi, on peut faire :

R> left_join(flights_ex, airports_ex,


by = c("dest" = "faa"),
suffix = c("_depart", "_arrivee")
)

On obtient ainsi directement des noms de colonnes nettement plus clairs.

Types de jointures
Jusqu’à prĂ©sent nous avons utilisĂ© la fonction left_join , mais il existe plusieurs types de jointures.

Partons de deux tables d’exemple, personnes et voitures :

– 284 –
Fusion de tables

R> personnes <- tibble(


nom = c("Sylvie", "Sylvie", "Monique", "Gunter", "Rayan", "Rayan"),
voiture = c("Twingo", "Ferrari", "Scenic", "Lada", "Twingo", "Clio")
)

nom voiture

Sylvie Twingo

Sylvie Ferrari

Monique Scenic

Gunter Lada

Rayan Twingo

Rayan Clio

R> voitures <- tibble(


voiture = c("Twingo", "Ferrari", "Clio", "Lada", "208"),
vitesse = c("140", "280", "160", "85", "160")
)

voiture vitesse

Twingo 140

Ferrari 280

Clio 160

Lada 85

208 160

left_join

Si on fait un left_join de voitures sur personnes :

– 285 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> left_join(personnes, voitures)

Joining with `by = join_by(voiture)`

nom voiture vitesse

Sylvie Twingo 140

Sylvie Ferrari 280

Monique Scenic NA

Gunter Lada 85

Rayan Twingo 140

Rayan Clio 160

On voit que chaque ligne de personnes est bien prĂ©sente, et qu’on lui a ajoutĂ© une ligne de voitures
correspondante si elle existe. Dans le cas du Scenic , il n’y a avait pas de ligne dans voitures , donc
vitesse a été mise à NA . Dans le cas de 208 , présente dans voitures mais pas dans personnes , la
ligne n’apparaüt pas.

Si on fait un left_join cette fois de personnes sur voitures , c’est l’inverse :

R> left_join(voitures, personnes)

Joining with `by = join_by(voiture)`

Warning in left_join(voitures, personnes): Each row in `x` is expected to match


at most 1 row in `y`.
â„č Row 1 of `x` matches multiple rows.
â„č If multiple matches are expected, set `multiple = "all"`
to silence this warning.

– 286 –
Fusion de tables

voiture vitesse nom

Twingo 140 Sylvie

Twingo 140 Rayan

Ferrari 280 Sylvie

Clio 160 Rayan

Lada 85 Gunter

208 160 NA

La ligne 208 est lĂ , mais nom est Ă  NA . Par contre Monique est absente. Et on remarquera que la ligne
Twingo , prĂ©sente deux fois dans personnes , a Ă©tĂ© dupliquĂ©e pour ĂȘtre associĂ©e aux deux lignes de
données de Sylvie et Rayan .

En résumé, quand on fait un left_join(x, y) , toutes les lignes de x sont présentes, et dupliquées
si nécessaire quand elles apparaissent plusieurs fois dans y . Les lignes de y non présentes dans x
disparaissent. Les lignes de x non présentes dans y se voient attribuer des NA pour les nouvelles
colonnes.

Intuitivement, on pourrait considĂ©rer que left_join(x, y) signifie “ramener l’information de la table


y sur la table x ”.

En général, left_join sera le type de jointures le plus fréquemment utilisé.

right_join

La jointure right_join est l’exacte symĂ©trique de left_join , c’est-Ă  dire que right_join(x, y)
est équivalent à left_join(x,y) :

R> right_join(personnes, voitures)

Joining with `by = join_by(voiture)`

– 287 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

nom voiture vitesse

Sylvie Twingo 140

Sylvie Ferrari 280

Gunter Lada 85

Rayan Twingo 140

Rayan Clio 160

NA 208 160

inner_join

Dans le cas de inner_join , seules les lignes présentes à la fois dans x et y sont présentes (et si
nécessaire dupliquées) dans la table résultat :

R> inner_join(personnes, voitures)

Joining with `by = join_by(voiture)`

nom voiture vitesse

Sylvie Twingo 140

Sylvie Ferrari 280

Gunter Lada 85

Rayan Twingo 140

Rayan Clio 160

Ici la ligne 208 est absente, ainsi que la ligne Monique , qui dans le cas d’un left_join avait Ă©tĂ©
conservĂ©e et s’était vue attribuer une vitesse Ă  NA .

full_join

Dans le cas de full_join , toutes les lignes de x et toutes les lignes de y sont conservées (avec des
NA ajoutĂ©s si nĂ©cessaire) mĂȘme si elles sont absentes de l’autre table :

– 288 –
Fusion de tables

R> full_join(personnes, voitures)

Joining with `by = join_by(voiture)`

nom voiture vitesse

Sylvie Twingo 140

Sylvie Ferrari 280

Monique Scenic NA

Gunter Lada 85

Rayan Twingo 140

Rayan Clio 160

NA 208 160

semi_join et anti_join

semi_join et anti_join sont des jointures filtrantes, c’est-Ă -dire qu’elles sĂ©lectionnent les lignes de x
sans ajouter les colonnes de y .

Ainsi, semi_join ne conservera que les lignes de x pour lesquelles une ligne de y existe également, et
supprimera les autres. Dans notre exemple, la ligne Monique est donc supprimée :

R> semi_join(personnes, voitures)

Joining with `by = join_by(voiture)`

– 289 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

nom voiture

Sylvie Twingo

Sylvie Ferrari

Gunter Lada

Rayan Twingo

Rayan Clio

Un anti_join fait l’inverse, il ne conserve que les lignes de x absentes de y . Dans notre exemple, on
ne garde donc que la ligne Monique :

R> anti_join(personnes, voitures)

Joining with `by = join_by(voiture)`

nom voiture

Monique Scenic

Jointures avec [Link]


[Link] fournit une fonction merge beaucoup plus rapide que celle standard de R mais fonctionnant
de maniĂšre identique.

Ajouter des observations


I M P O R TA N T

La fonction rbind , fournie nativement avec R pour ajouter des observations Ă  un tableau, doit ĂȘtre
Ă©vitĂ©e car elle gĂ©nĂ©rera des rĂ©sultats non pertinents si les tableaux que l’on concatĂšnent n’ont pas
exactement les mĂȘmes colonnes dans le mĂȘme ordre.

La fonction bind_rows de dplyr permet d’ajouter des lignes à une table à partir d’une ou plusieurs autres
tables.

– 290 –
Fusion de tables

L’exemple suivant (certes trĂšs artificiel) montre l’utilisation de bind_rows . On commence par crĂ©er trois
tableaux t1 , t2 et t3 :

R> t1 <- airports %>%


select(faa, name, lat, lon) %>%
slice(1:2)
t1

R> t2 <- airports %>%


select(name, faa, lon, lat) %>%
slice(5:6)

t2

R> t3 <- airports %>%


select(faa, name) %>%
slice(100:101)
t3

On concaténe ensuite les trois tables avec bind_rows :

R> bind_rows(t1, t2, t3)

On remarquera que si des colonnes sont manquantes pour certaines tables, comme les colonnes lat et
lon de t3 , des NA sont automatiquement insérées.

De plus, peu importe l’ordre des variables entre les diffĂ©rentes tables, bind_rows les rĂ©associera en
considĂ©rant que deux colonnes ayant le mĂȘme nom dans deux tableaux correspondent Ă  la mĂȘme variable.

Il peut ĂȘtre utile, quand on concatĂšne des lignes, de garder une trace du tableau d’origine de chacune
des lignes dans le tableau final. C’est possible grñce à l’argument .id de bind_rows . On passe à cet
argument le nom d’une colonne qui contiendra l’indicateur d’origine des lignes :

R> bind_rows(t1, t2, t3, .id = "source")

Par dĂ©faut la colonne .id ne contient qu’un nombre, diffĂ©rent pour chaque tableau. On peut lui spĂ©cifier
des valeurs plus explicites en “nommant” les tables dans bind_rows de la maniùre suivante :

R> bind_rows(table1 = t1, table2 = t2, table3 = t3, .id = "source")

– 291 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

NOTE

Une alternative à bind_rows est la fonction [Link] de l’extension plyr qui fonctionne de
maniĂšre similaire.

– 292 –
Gestion des dates
Si R fournit quelques fonctions natives pour la gestion des dates, l’extension lubridate est recommandĂ©e
pour tout travail un peu plus fin sur des dates. On pourra se référer :

‱ au chapitre «Dates and Times» de l’ouvrage R for Data Science de Garrett Grolemund et Hadley
Wickham (en anglais)
‱ à la vignette officielle ([Link]
[Link], en anglais)
‱ à ce tutoriel ([Link]

– 293 –
Fonctions Ă  fenĂȘtre
I M P O R TA N T

Ce chapitre est en cours d’écriture.

WEBIN-R

Ce chapitre est évoqué dans le webin-R #04 (manipuler les données avec dplyr) sur YouTube.

Ces fonctions sont prĂ©sentĂ©es en dĂ©tail (en anglais) dans une vignette dĂ©diĂ©e de l’extension dplyr
([Link]

– 295 –
Manipuler du texte avec
stringr
Expressions réguliÚres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Concaténer des chaßnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 299
Convertir en majuscules / minuscules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Découper des chaßnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Extraire des sous-chaĂźnes par position . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Détecter des motifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Extraire des motifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Remplacer des motifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Modificateurs de motifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Insérer une variable dans une chaßne de caractÚres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306

NOTE

La version originale de ce chapitre a été écrite par Julien Barnier dans le cadre de son Introduction à R
et au tidyverse.

Les fonctions de forcats vues prĂ©cĂ©demment permettent de modifier des modalitĂ©s d’une variables
qualitative globalement. Mais parfois on a besoin de manipuler le contenu mĂȘme du texte d’une variable
de type chaüne de caractùres : combiner, rechercher, remplacer


On va utiliser ici les fonctions de l’extension stringr. Celle-ci fait partie du coeur du tidyverse, elle est donc
automatiquement chargée avec :

– 297 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> library(tidyverse)

NOTE

stringr est en fait une interface simplifiĂ©e aux fonctions d’une autre extension, stringi. Si les fonctions
de stringr ne sont pas suffisantes ou si on manipule beaucoup de chaßnes de caractÚres, ne pas hésiter
Ă  se reporter Ă  la documentation de stringi.

Dans ce qui suit on va utiliser le court tableau d’exemple d suivant :

R> d <- tibble(


nom = c("Mr Félicien Machin", "Mme Raymonde Bidule", "M. Martial Truc", "Mme
Huguette Chose"),
adresse = c("3 rue des Fleurs", "47 ave de la Libération", "12 rue du 17 oct
obre 1961", "221 avenue de la Libération"),
ville = c("Nouméa", "Marseille", "Vénissieux", "Marseille")
)

nom adresse ville

Mr Félicien Machin 3 rue des Fleurs Nouméa

Mme Raymonde Bidule 47 ave de la Libération Marseille

M. Martial Truc 12 rue du 17 octobre 1961 Vénissieux

Mme Huguette Chose 221 avenue de la Libération Marseille

Expressions réguliÚres
Les fonctions présentées ci-dessous sont pour la plupart prévues pour fonctionner avec des expressions
réguliÚres. Celles-ci constituent un mini-langage, qui peut paraßtre assez cryptique, mais qui est trÚs
puissant pour spécifier des motifs de chaßnes de caractÚres.

Elles permettent par exemple de sĂ©lectionner le dernier mot avant la fin d’une chaĂźne, l’ensemble des
suites alphanumériques commençant par une majuscule, des nombres de 3 ou 4 chiffres situés en début
de chaüne, et beaucoup beaucoup d’autres choses encore bien plus complexes.

Pour donner un exemple concret, l’expression rĂ©guliĂšre suivante permet de dĂ©tecter une adresse de
courrier électronique1 :

– 298 –
Manipuler du texte avec stringr

[\w\d+.-_]+@[\w\d.-]+\.[a-zA-Z]{2,}

Par souci de simplicité, dans ce qui suit les exemples seront donnés autant que possible avec de simples
chaĂźnes, sans expression rĂ©guliĂšre. Mais si vous pensez manipuler des donnĂ©es textuelles, il peut ĂȘtre trĂšs
utile de s’intĂ©resser Ă  cette syntaxe.

Concaténer des chaßnes


La premiÚre opération de base consiste à concaténer des chaßnes de caractÚres entre elles. On peut le
faire avec la fonction paste .

Par exemple, si on veut concatĂ©ner l’adresse et la ville :

R> paste(d$adresse, d$ville)

[1] "3 rue des Fleurs Nouméa"


[2] "47 ave de la Libération Marseille"
[3] "12 rue du 17 octobre 1961 Vénissieux"
[4] "221 avenue de la Libération Marseille"

Par défaut, paste concatÚne en ajoutant un espace entre les différentes chaßnes. On peut spécifier un
autre séparateur avec son argument sep :

R> paste(d$adresse, d$ville, sep = " - ")

[1] "3 rue des Fleurs - Nouméa"


[2] "47 ave de la Libération - Marseille"
[3] "12 rue du 17 octobre 1961 - Vénissieux"
[4] "221 avenue de la Libération - Marseille"

Il existe une variante, paste0 , qui concatÚne sans mettre de séparateur, et qui est légÚrement plus
rapide :

R> paste0(d$adresse, d$ville)

[1] "3 rue des FleursNouméa"


[2] "47 ave de la LibérationMarseille"
[3] "12 rue du 17 octobre 1961Vénissieux"

1. Il s’agit en fait d’une version trĂšs simplifiĂ©e, la «vĂ©ritable» expression permettant de tester si une adresse mail est
valide fait plus de 80 lignes


– 299 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

[4] "221 avenue de la LibérationMarseille"

NOTE

À noter que paste et paste0 sont des fonctions R de base. L’équivalent pour stringr se nomme
str_c .

Parfois on cherche Ă  concatĂ©ner les diffĂ©rents Ă©lĂ©ments d’un vecteur non pas avec ceux d’un autre
vecteur, comme on l’a fait prĂ©cĂ©demment, mais entre eux. Dans ce cas paste seule ne fera rien :

R> paste(d$ville)

[1] "Nouméa" "Marseille" "Vénissieux" "Marseille"

Il faut lui ajouter un argument collapse , avec comme valeur la chaßne à utiliser pour concaténer les
éléments :

R> paste(d$ville, collapse = ", ")

[1] "Nouméa, Marseille, Vénissieux, Marseille"

Convertir en majuscules / minuscules


Les fonctions str_to_lower , str_to_upper et str_to_title permettent respectivement de mettre
en minuscules, mettre en majuscules, ou de capitaliser les Ă©lĂ©ments d’un vecteur de chaĂźnes de
caractĂšres :

R> str_to_lower(d$nom)

[1] "mr félicien machin" "mme raymonde bidule"


[3] "m. martial truc" "mme huguette chose"

R> str_to_upper(d$nom)

[1] "MR FÉLICIEN MACHIN" "MME RAYMONDE BIDULE"

– 300 –
Manipuler du texte avec stringr

[3] "M. MARTIAL TRUC" "MME HUGUETTE CHOSE"

R> str_to_title(d$nom)

[1] "Mr Félicien Machin" "Mme Raymonde Bidule"


[3] "M. Martial Truc" "Mme Huguette Chose"

Découper des chaßnes


La fonction str_split permet de “dĂ©couper” une chaĂźne de caractĂšre en fonction d’un dĂ©limiteur. On
passe la chaßne en premier argument, et le délimiteur en second :

R> str_split("un-deux-trois", "-")

[[1]]
[1] "un" "deux" "trois"

On peut appliquer la fonction à un vecteur, dans ce cas le résultat sera une liste :

R> str_split(d$nom, " ")

[[1]]
[1] "Mr" "Félicien" "Machin"

[[2]]
[1] "Mme" "Raymonde" "Bidule"

[[3]]
[1] "M." "Martial" "Truc"

[[4]]
[1] "Mme" "Huguette" "Chose"

Ou un tableau (plus précisément une matrice) si on ajoute simplify = TRUE .

R> str_split(d$nom, " ", simplify = TRUE)

[,1] [,2] [,3]

– 301 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

[1,] "Mr" "Félicien" "Machin"


[2,] "Mme" "Raymonde" "Bidule"
[3,] "M." "Martial" "Truc"
[4,] "Mme" "Huguette" "Chose"

Si on souhaite créer de nouvelles colonnes dans un tableau de données en découpant une colonne de
type texte, on pourra utiliser la fonction separate de l’extension tidyr. Celle-ci est expliquĂ©e section
@ref(separate).

Voici juste un exemple de son utilisation :

R> library(tidyr)
d %>% separate(nom, c("genre", "prenom", "nom"))

Warning: Expected 3 pieces. Additional pieces discarded in 1 rows


[1].

Extraire des sous-chaĂźnes par position


La fonction str_sub permet d’extraire des sous-chaünes par position, en indiquant simplement les
positions des premier et dernier caractĂšres :

R> str_sub(d$ville, 1, 3)

[1] "Nou" "Mar" "Vén" "Mar"

Détecter des motifs


str_detect permet de dĂ©tecter la prĂ©sence d’un motif parmi les Ă©lements d’un vecteur. Par exemple, si
on souhaite identifier toutes les adresses contenant «Libération» :

R> str_detect(d$adresse, "Libération")

[1] FALSE TRUE FALSE TRUE

str_detect renvoit un vecteur de valeurs logiques et peut donc ĂȘtre utilisĂ©e, par exemple, avec le verbe
filter de dplyr pour extraire des sous-populations.

– 302 –
Manipuler du texte avec stringr

Une variante, str_count , compte le nombre d’occurrences d’une chaĂźne pour chaque Ă©lĂ©ment d’un
vecteur :

R> str_count(d$ville, "s")

[1] 0 1 2 1

I M P O R TA N T

Attention, les fonctions de stringr étant prévues pour fonctionner avec des expressions réguliÚres,
certains caractùres n’auront pas le sens habituel dans la chaüne indiquant le motif à rechercher. Par
exemple, le . ne sera pas un point mais le symbole reprĂ©sentant «n’importe quel caractĂšre».

La section sur les modificateurs de motifs explique comment utiliser des chaßne «classiques» au lieu
d’expressions rĂ©guliĂšres.

On peut aussi utiliser str_subset pour ne garder d’un vecteur que les Ă©lĂ©ments correspondant au
motif :

R> str_subset(d$adresse, "Libération")

[1] "47 ave de la Libération"


[2] "221 avenue de la Libération"

Extraire des motifs


str_extract permet d’extraire les valeurs correspondant à un motif. Si on lui passe comme motif une
chaĂźne de caractĂšre, cela aura peu d’intĂ©rĂȘt :

R> str_extract(d$adresse, "Libération")

[1] NA "Libération" NA "Libération"

C’est tout de suite plus intĂ©ressant si on utilise des expressions rĂ©guliĂšres. Par exemple la commande
suivante permet d’isoler les numĂ©ros de rue.

– 303 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> str_extract(d$adresse, "^\\d+")

[1] "3" "47" "12" "221"

str_extract ne récupÚre que la premiÚre occurrence du motif. Si on veut toutes les extraire on peut
utiliser str_extract_all . Ainsi, si on veut extraire l’ensemble des nombres prĂ©sents dans les adresses :

R> str_extract_all(d$adresse, "\\d+")

[[1]]
[1] "3"

[[2]]
[1] "47"

[[3]]
[1] "12" "17" "1961"

[[4]]
[1] "221"

NOTE

Si on veut faire de l’extraction de groupes dans des expressions rĂ©guliĂšres (identifiĂ©s avec des
parenthĂšses), on pourra utiliser str_match .

À noter que si on souhaite extraire des valeurs d’une colonne texte d’un tableau de donnĂ©es pour crĂ©er de
nouvelles variables, on pourra utiliser la fonction extract de l’extension tidyr, dĂ©crite plus haut.

Par exemple :

R> library(tidyr)
d %>% tidyr::extract(adresse, "type_rue", "^\\d+ (.*?) ", remove = FALSE)

Remplacer des motifs


La fonction str_replace permet de remplacer une chaĂźne ou un motif par une autre.

Par exemple, on peut remplace les occurrence de “Mr” par “M.” dans les noms de notre tableau :

– 304 –
Manipuler du texte avec stringr

R> str_replace(d$nom, "Mr", "M.")

[1] "M. Félicien Machin" "Mme Raymonde Bidule"


[3] "M. Martial Truc" "Mme Huguette Chose"

La variante str_replace_all permet de spĂ©cifier plusieurs remplacements d’un coup :

R> str_replace_all(d$adresse, c("avenue" = "Avenue", "ave" = "Avenue", "rue" = "R


ue"))

[1] "3 Rue des Fleurs"


[2] "47 Avenue de la Libération"
[3] "12 Rue du 17 octobre 1961"
[4] "221 Avenue de la Libération"

Modificateurs de motifs
Par défaut, les motifs passés aux fonctions comme str_detect , str_extract ou str_replace sont
des expressions réguliÚres classiques.

On peut spĂ©cifier qu’un motif n’est pas une expression rĂ©guliĂšre mais une chaĂźne de caractĂšres normale en
lui appliquant la fonction fixed . Par exemple, si on veut compter le nombre de points dans les noms de
notre tableau, le paramétrage par défaut ne fonctionnera pas car dans une expression réguliÚre le . est
un symbole signifiant “n’importe quel caractùre” :

R> str_count(d$nom, ".")

[1] 18 19 15 18

Il faut donc spécifier que notre point est bien un point avec fixed :

R> str_count(d$nom, fixed("."))

[1] 0 0 1 0

On peut aussi modifier le comportement des expressions rĂ©guliĂšres Ă  l’aide de la fonction regex . On peut
ainsi rendre les motifs insensibles Ă  la casse avec ignore_case :

– 305 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> str_detect(d$nom, "mme")

[1] FALSE FALSE FALSE FALSE

R> str_detect(d$nom, regex("mme", ignore_case = TRUE))

[1] FALSE TRUE FALSE TRUE

On peut Ă©galement permettre aux regex d’ĂȘtre multilignes avec l’option multiline = TRUE , etc.

Insérer une variable dans une chaßne de caractÚres


La fonction str_glue repose sur l’extension glue. Elle permet, Ă  l’aide d’une syntaxe un peu spĂ©cifique,
de pouvoir insĂ©rer facilement les valeurs d’une ou plusieurs variables dans une chaĂźne de caractĂšres.
Prenons un exemple :

R> prenom <- "Fred"


age <- 28
anniversaire <- [Link]("1991-10-12")
str_glue(
"Je m'appelle {prenom}. ",
"L'année prochaine j'aurai {age + 1} ans, ",
"car je suis né le {format(anniversaire, '%A %d %B %Y')}."
)

Je m'appelle Fred. L'année prochaine j'aurai 29 ans, car je suis né le samedi 12


octobre 1991.

Sa variante str_glue_data est adaptĂ©e lorsque l’on travaille sur un tableau de donnĂ©es avec dplyr.

R> d %>% mutate(phrase = str_glue_data(d, "{nom} habite Ă  {ville}."))

Ressources
L’ouvrage R for Data Science, accessible en ligne, contient un chapitre entier sur les chaünes de caractùres
et les expressions réguliÚres (en anglais).

Le site officiel de stringr contient une liste des fonctions et les pages d’aide associĂ©es, ainsi qu’un article

– 306 –
Manipuler du texte avec stringr

dédié aux expressions réguliÚres.

Pour des besoins plus pointus, on pourra aussi utiliser l’extension stringi sur laquelle est elle-mĂȘme basĂ©e
stringr.

– 307 –
Réorganiser ses données
avec tidyr
Tidy data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Trois rÚgles pour des données bien rangées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Les verbes de tidyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
pivot_longer : rassembler des colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
pivot_wider : disperser des lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
separate : séparer une colonne en plusieurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
unite : regrouper plusieurs colonnes en une seule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
extract : crĂ©er de nouvelles colonnes Ă  partir d’une colonne de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
complete : compléter des combinaisons de variables manquantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
Ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Fichiers volumineux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326

NOTE

La version originale de ce chapitre a été écrite par Julien Barnier dans le cadre de son Introduction à R
et au tidyverse.

WEBIN-R

Ce chapitre est évoqué dans le webin-R #13 (exemples de graphiques avancés) sur YouTube.

Ce chapitre est évoqué dans le webin-R #17 (trajectoires de soins : un exemple de données
longitudinales) sur YouTube.

– 309 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Tidy data
Comme indiquĂ© dans l’introduction au tidyverse, page 64, les extensions du tidyverse comme dplyr ou
ggplot2 partent du principe que les donnĂ©es sont “bien rangĂ©es” sous forme de tidy data.

Prenons un exemple avec les données suivantes, qui indique la population de trois pays pour quatre
années différentes :

country 1992 1997 2002 2007

Belgium 10045622 10199787 10311970 10392226

France 57374179 58623428 59925035 61083916

Germany 80597764 82011073 82350671 82400996

Imaginons qu’on souhaite reprĂ©senter avec ggplot2 l’évolution de la population pour chaque pays sous
forme de lignes : c’est impossible avec les donnĂ©es sous ce format. On a besoin d’arranger le tableau de la
maniĂšre suivante :

– 310 –
Réorganiser ses données avec tidyr

country annee population

Belgium 1992 10045622

France 1992 57374179

Germany 1992 80597764

Belgium 1997 10199787

France 1997 58623428

Germany 1997 82011073

Belgium 2002 10311970

France 2002 59925035

Germany 2002 82350671

Belgium 2007 10392226

France 2007 61083916

Germany 2007 82400996

C’est seulement avec les donnĂ©es dans ce format qu’on peut rĂ©aliser le graphique :

– 311 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> ggplot(d) +
geom_line(aes(x = annee, y = population, color = country)) +
scale_x_continuous(breaks = unique(d$annee))

C’est la mĂȘme chose pour dplyr, par exemple si on voulait calculer la population minimale pour chaque
pays avec summarise :

R> d %>%
group_by(country) %>%
summarise(pop_min = min(population))

# A tibble: 3 × 2
country pop_min
<fct> <int>
1 Belgium 10045622
2 France 57374179
3 Germany 80597764

– 312 –
Réorganiser ses données avec tidyr

Trois rÚgles pour des données bien rangées


Le concept de tidy data repose sur trois rÚgles interdépendantes. Des données sont considérées comme
tidy si :

1. chaque ligne correspond Ă  une observation


2. chaque colonne correspond Ă  une variable
3. chaque valeur est présente dans une unique case de la table ou, de maniÚre équivalente, si des
unitĂ©s d’observations diffĂ©rentes sont prĂ©sentes dans des tables diffĂ©rentes

Ces rÚgles ne sont pas forcément trÚs intuitives. De plus, il y a une infinité de maniÚres pour un tableau de
donnĂ©es de ne pas ĂȘtre tidy.

Prenons par exemple les rĂšgles 1 et 2 et le tableau de notre premier exemple :

country 1992 1997 2002 2007

Belgium 10045622 10199787 10311970 10392226

France 57374179 58623428 59925035 61083916

Germany 80597764 82011073 82350671 82400996

Pourquoi ce tableau n’est pas tidy ? Parce que si on essaie d’identifier les variables mesurĂ©es dans le
tableau, il y en a trois : le pays, l’annĂ©e et la population. Or elles ne correspondent pas aux colonnes de la
table. C’est le cas par contre pour la table transformĂ©e :

– 313 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

country annee population

Belgium 1992 10045622

France 1992 57374179

Germany 1992 80597764

Belgium 1997 10199787

France 1997 58623428

Germany 1997 82011073

Belgium 2002 10311970

France 2002 59925035

Germany 2002 82350671

Belgium 2007 10392226

France 2007 61083916

Germany 2007 82400996

On peut remarquer qu’en modifiant notre table pour satisfaire Ă  la deuxiĂšme rĂšgle, on a aussi rĂ©glĂ© la
premiĂšre : chaque ligne correspond dĂ©sormais Ă  une observation, en l’occurrence l’observation de trois
pays Ă  plusieurs moments dans le temps. Dans notre table d’origine, chaque ligne comportait en rĂ©alitĂ©
quatre observations différentes.

Ce point permet d’illustrer le fait que les rĂšgles sont interdĂ©pendantes.

Autre exemple, gĂ©nĂ©rĂ© depuis le jeu de donnĂ©es nycflights13, permettant cette fois d’illustrer la troisiĂšme
rĂšgle :

– 314 –
Réorganiser ses données avec tidyr

year month day dep_time carrier name flights_per_year

2013 1 1 517 UA United Air Lines Inc. 58665

2013 1 1 533 UA United Air Lines Inc. 58665

2013 1 1 542 AA American Airlines Inc. 32729

2013 1 1 554 UA United Air Lines Inc. 58665

2013 1 1 558 AA American Airlines Inc. 32729

2013 1 1 558 UA United Air Lines Inc. 58665

2013 1 1 558 UA United Air Lines Inc. 58665

2013 1 1 559 AA American Airlines Inc. 32729

Dans ce tableau on a bien une observation par ligne (un vol), et une variable par colonne. Mais on a
une “infraction” Ă  la troisiĂšme rĂšgle, qui est que chaque valeur doit ĂȘtre prĂ©sente dans une unique case :
si on regarde la colonne name , on a en effet une duplication de l’information concernant le nom des
compagnies aĂ©riennes. Notre tableau mĂȘle en fait deux types d’observations diffĂ©rents : des observations
sur les vols, et des observations sur les compagnies aériennes.

Pour “arranger” ce tableau, il faut sĂ©parer les deux types d’observations en deux tables diffĂ©rentes :

year month day dep_time carrier

2013 1 1 517 UA

2013 1 1 533 UA

2013 1 1 542 AA

2013 1 1 554 UA

2013 1 1 558 AA

2013 1 1 558 UA

2013 1 1 558 UA

2013 1 1 559 AA

– 315 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

carrier name flights_per_year

UA United Air Lines Inc. 58665

AA American Airlines Inc. 32729

On a dĂ©sormais deux tables distinctes, l’information n’est pas dupliquĂ©e, et on peut facilement faire une
jointure si on a besoin de rĂ©cupĂ©rer l’information d’une table dans une autre.

Les verbes de tidyr


L’objectif de tidyr est de fournir des fonctions pour arranger ses donnĂ©es et les convertir dans un format
tidy. Ces fonctions prennent la forme de verbes qui viennent complĂ©ter ceux de dplyr et s’intĂšgrent
parfaitement dans les sĂ©ries de pipes ( %>% ), les pipelines, permettant d’enchaĂźner les opĂ©rations.

pivot_longer : rassembler des colonnes


Prenons le tableau d suivant, qui liste la population de 6 pays en 2002 et 2007 :

country 2002 2007

Belgium 10311970 10392226

France 59925035 61083916

Germany 82350671 82400996

Italy 57926999 58147733

Spain 40152517 40448191

Switzerland 7361757 7554661

Dans ce tableau, une mĂȘme variable (la population) est rĂ©partie sur plusieurs colonnes, chacune
représentant une observation à un moment différent. On souhaite que la variable ne représente plus
qu’une seule colonne, et que les observations soient rĂ©parties sur plusieurs lignes.

Pour cela on va utiliser la fonction pivot_longer 1 :

1. pivot_longer est une version plus récente et plus robuste de la fonction gather .

– 316 –
Réorganiser ses données avec tidyr

R> d %>% pivot_longer(cols = c(`2002`, `2007`), names_to = "annee", values_to =


"population")

# A tibble: 12 × 3
country annee population
<fct> <chr> <int>
1 Belgium 2002 10311970
2 Belgium 2007 10392226
3 France 2002 59925035
4 France 2007 61083916
5 Germany 2002 82350671
6 Germany 2007 82400996
7 Italy 2002 57926999
8 Italy 2007 58147733
9 Spain 2002 40152517
10 Spain 2007 40448191
11 Switzerland 2002 7361757
12 Switzerland 2007 7554661

La fonction pivot_longer prend comme arguments la liste des colonnes Ă  rassembler (on peut
également y utiliser les différentes fonctions de sélection de variables utilisables avec select , voir
select_helpers ), ainsi que deux arguments names_to et values_to :

‱ names_to est le nom de la colonne qui va contenir les “noms” des colonnes originelles, c’est-à-
dire les identifiants des différentes observations
‱ values_to est le nom de la colonne qui va contenir la valeur des observations

Parfois il est plus rapide d’indiquer à pivot_longer les colonnes qu’on ne souhaite pas rassembler. On
peut le faire avec la syntaxe suivante :

R> d %>% pivot_longer(-country, names_to = "annee", values_to = "population")

# A tibble: 12 × 3
country annee population
<fct> <chr> <int>
1 Belgium 2002 10311970
2 Belgium 2007 10392226
3 France 2002 59925035
4 France 2007 61083916
5 Germany 2002 82350671
6 Germany 2007 82400996
7 Italy 2002 57926999
8 Italy 2007 58147733
9 Spain 2002 40152517

– 317 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

10 Spain 2007 40448191


11 Switzerland 2002 7361757
12 Switzerland 2007 7554661

pivot_wider : disperser des lignes


La fonction pivot_wider 2 est l’inverse de pivot_longer .

Soit le tableau d suivant :

country continent year variable value

Belgium Europe 2002 lifeExp 7.832e+01

Belgium Europe 2007 lifeExp 7.944e+01

France Europe 2002 lifeExp 7.959e+01

France Europe 2007 lifeExp 8.066e+01

Germany Europe 2002 lifeExp 7.867e+01

Germany Europe 2007 lifeExp 7.941e+01

Belgium Europe 2002 pop 1.031e+07

Belgium Europe 2007 pop 1.039e+07

France Europe 2002 pop 5.993e+07

France Europe 2007 pop 6.108e+07

Germany Europe 2002 pop 8.235e+07

Germany Europe 2007 pop 8.240e+07

Ce tableau a le problÚme inverse du précédent : on a deux variables, lifeExp et pop qui, plutÎt que
d’ĂȘtre rĂ©parties en deux colonnes, sont rĂ©parties entre plusieurs lignes.

On va donc utiliser pivot_wider pour «disperser» ces lignes dans deux colonnes différentes :

2. pivot_wider est une version plus récente et plus robuste de la fonction spread .

– 318 –
Réorganiser ses données avec tidyr

R> d %>% pivot_wider(names_from = variable, values_from = value)

# A tibble: 6 × 5
country continent year lifeExp pop
<fct> <fct> <int> <dbl> <dbl>
1 Belgium Europe 2002 78.3 10311970
2 Belgium Europe 2007 79.4 10392226
3 France Europe 2002 79.6 59925035
4 France Europe 2007 80.7 61083916
5 Germany Europe 2002 78.7 82350671
6 Germany Europe 2007 79.4 82400996

pivot_wider prend deux arguments principaux :

‱ names_from indique la colonne contenant les noms des nouvelles variables Ă  crĂ©er
‱ values_from indique la colonne contenant les valeurs de ces variables

Il peut arriver que certaines variables soient absentes pour certaines observations. Dans ce cas
l’argument values_fill permet de spĂ©cifier la valeur Ă  utiliser pour ces donnĂ©es manquantes (par
défaut, les valauers manquantes sont indiquées avec NA ).

Exemple avec le tableau d suivant :

– 319 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

country continent year variable value

Belgium Europe 2002 lifeExp 7.832e+01

Belgium Europe 2007 lifeExp 7.944e+01

France Europe 2002 lifeExp 7.959e+01

France Europe 2007 lifeExp 8.066e+01

Germany Europe 2002 lifeExp 7.867e+01

Germany Europe 2007 lifeExp 7.941e+01

Belgium Europe 2002 pop 1.031e+07

Belgium Europe 2007 pop 1.039e+07

France Europe 2002 pop 5.993e+07

France Europe 2007 pop 6.108e+07

Germany Europe 2002 pop 8.235e+07

Germany Europe 2007 pop 8.240e+07

France Europe 2002 density 9.400e+01

R> d %>%
pivot_wider(names_from = variable, values_from = value)

# A tibble: 6 × 6
country continent year lifeExp pop density
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 Belgium Europe 2002 78.3 10311970 NA
2 Belgium Europe 2007 79.4 10392226 NA
3 France Europe 2002 79.6 59925035 94
4 France Europe 2007 80.7 61083916 NA
5 Germany Europe 2002 78.7 82350671 NA
6 Germany Europe 2007 79.4 82400996 NA

– 320 –
Réorganiser ses données avec tidyr

R> d %>%
pivot_wider(names_from = variable, values_from = value, values_fill = list(v
alue = 0))

# A tibble: 6 × 6
country continent year lifeExp pop density
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 Belgium Europe 2002 78.3 10311970 0
2 Belgium Europe 2007 79.4 10392226 0
3 France Europe 2002 79.6 59925035 94
4 France Europe 2007 80.7 61083916 0
5 Germany Europe 2002 78.7 82350671 0
6 Germany Europe 2007 79.4 82400996 0

separate : séparer une colonne en plusieurs


Parfois on a plusieurs informations réunies en une seule colonne et on souhaite les séparer. Soit le tableau
d’exemple caricatural suivant, nommĂ© df :

eleve note

Félicien Machin 5/20

Raymonde Bidule 6/10

Martial Truc 87/100

separate permet de séparer la colonne note en deux nouvelles colonnes note et note_sur :

R> d %>% separate(note, c("note", "note_sur"))

# A tibble: 3 × 3
eleve note note_sur
<chr> <chr> <chr>
1 Félicien Machin 5 20
2 Raymonde Bidule 6 10
3 Martial Truc 87 100

separate prend deux arguments principaux, le nom de la colonne à séparer et un vecteur indiquant
les noms des nouvelles variables à créer. Par défaut separate «sépare» au niveau des caractÚres non-
alphanumérique (espace, symbole, etc.). On peut lui indiquer explicitement le caractÚre sur lequel séparer
avec l’argument sep :

– 321 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> d %>% tidyr::separate(eleve, c("prenom", "nom"), sep = " ")

# A tibble: 3 × 3
prenom nom note
<chr> <chr> <chr>
1 Félicien Machin 5/20
2 Raymonde Bidule 6/10
3 Martial Truc 87/100

unite : regrouper plusieurs colonnes en une seule


unite est l’opĂ©ration inverse de separate . Elle permet de regrouper plusieurs colonnes en une seule.
Imaginons qu’on obtient le tableau d suivant :

code_departement code_commune commune pop_tot

01 004 Ambérieu-en-Bugey 14233

01 007 Ambronay 2437

01 014 Arbent 3440

01 024 Attignat 3110

01 025 Bùgé-la-Ville 3130

01 027 Balan 2785

On souhaite reconstruire une colonne code_insee qui indique le code INSEE de la commune, et qui
s’obtient en concatĂ©nant le code du dĂ©partement et celui de la commune. On peut utiliser unite pour
cela :

R> d %>% unite(code_insee, code_departement, code_commune)

# A tibble: 6 × 3
code_insee commune pop_tot
<chr> <chr> <int>
1 01_004 Ambérieu-en-Bugey 14233
2 01_007 Ambronay 2437
3 01_014 Arbent 3440
4 01_024 Attignat 3110
5 01_025 Bùgé-la-Ville 3130

– 322 –
Réorganiser ses données avec tidyr

6 01_027 Balan 2785

Le rĂ©sultat n’est pas idĂ©al : par dĂ©faut unite ajoute un caractĂšre _ entre les deux valeurs concatĂ©nĂ©es,
alors qu’on ne veut aucun sĂ©parateur. De plus, on souhaite conserver nos deux colonnes d’origine, qui
peuvent nous ĂȘtre utiles. On peut rĂ©soudre ces deux problĂšmes Ă  l’aide des arguments sep et remove :

R> d %>%
unite(code_insee, code_departement, code_commune,
sep = "", remove = FALSE
)

# A tibble: 6 × 5
code_insee code_departement code_commune commune pop_tot
<chr> <chr> <chr> <chr> <int>
1 01004 01 004 Ambérieu
 14233
2 01007 01 007 Ambronay 2437
3 01014 01 014 Arbent 3440
4 01024 01 024 Attignat 3110
5 01025 01 025 Bùgé-la-
 3130
6 01027 01 027 Balan 2785

extract : crĂ©er de nouvelles colonnes Ă  partir d’une colonne de


texte
extract permet de crĂ©er de nouvelles colonnes Ă  partir de sous-chaĂźnes d’une colonne de texte
existante, identifiées par des groupes dans une expression réguliÚre.

Par exemple, Ă  partir du tableau suivant :

eleve note

Félicien Machin 5/20

Raymonde Bidule 6/10

Martial Truc 87/100

On peut extraire les noms et prénoms dans deux nouvelles colonnes avec :

R> df %>% tidyr::extract(eleve, c("prenom", "nom"), "^(.*) (.*)$")

On passe donc Ă  extract trois arguments : la colonne d’oĂč on doit extraire les valeurs, un vecteur

– 323 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

avec les noms des nouvelles colonnes à créer, et une expression réguliÚre comportant autant de groupes
(identifiés par des parenthÚses) que de nouvelles colonnes.

Par dĂ©faut la colonne d’origine n’est pas conservĂ©e dans la table rĂ©sultat. On peut modifier ce
comportement avec l’argument remove = FALSE . Ainsi, le code suivant extrait les initiales du prĂ©nom et
du nom mais conserve la colonne d’origine :

R> df %>% tidyr::extract(eleve,


c("initiale_prenom", "initiale_nom"),
"^(.).* (.).*$",
remove = FALSE
)

complete : compléter des combinaisons de variables


manquantes
Imaginons qu’on ait le tableau de rĂ©sultats suivants :

eleve matiere note

Alain Maths 16

Alain Français 9

Barnabé Maths 17

Chantal Français 11

Les Ă©lĂšves BarnabĂ© et Chantal n’ont pas de notes dans toutes les matiĂšres. Supposons que c’est parce
qu’ils Ă©taient absents et que leur note est en fait un 0. Si on veut calculer les moyennes des Ă©lĂšves, on doit
compléter ces notes manquantes.

La fonction complete est prévue pour ce cas de figure : elle permet de compléter des combinaisons
manquantes de valeurs de plusieurs colonnes.

On peut l’utiliser de cette maniùre :

R> df %>% complete(eleve, matiere)

On voit que les combinaisons manquante “BarnabĂ© - Français” et “Chantal - Maths” ont bien Ă©tĂ© ajoutĂ©es
par complete .

Par défaut les lignes insérées récupÚrent des valeurs manquantes NA pour les colonnes restantes. On
peut nĂ©anmoins choisir une autre valeur avec l’argument fill , qui prend la forme d’une liste nommĂ©e :

– 324 –
Réorganiser ses données avec tidyr

R> df %>% complete(eleve, matiere, fill = list(note = 0))

Parfois on ne souhaite pas inclure toutes les colonnes dans le calcul des combinaisons de valeurs. Par
exemple, supposons qu’on rajoute dans notre tableau une colonne avec les identifiants de chaque Ă©lĂšve :

id eleve matiere note

1001001 Alain Maths 16

1001001 Alain Français 9

1001002 Barnabé Maths 17

1001003 Chantal Français 11

Si on applique complete comme prĂ©cĂ©demment, le rĂ©sultat n’est pas bon car il contient toutes les
combinaisons de id , eleve et matiere .

R> df %>% complete(id, eleve, matiere)

Dans ce cas, pour signifier Ă  complete que id et eleve sont deux attributs d’un mĂȘme individu et ne
doivent pas ĂȘtre combinĂ©s entre eux, on doit les placer dans une fonction nesting :

R> df %>% complete(nesting(id, eleve), matiere)

Ressources
Chaque jeu de données est différent, et le travail de remise en forme est souvent long et plus ou moins
compliquĂ©. On n’a donnĂ© ici que les exemples les plus simples, et c’est souvent en combinant diffĂ©rentes
opĂ©rations qu’on finit par obtenir le rĂ©sultat souhaitĂ©.

Le livre R for data science, librement accessible en ligne, contient un chapitre complet sur la remise en
forme des données.

L’article Tidy data, publiĂ© en 2014 dans le Journal of Statistical Software, prĂ©sente de maniĂšre dĂ©taillĂ©e le
concept éponyme (mais il utilise des extensions désormais obsolÚtes qui ont depuis été remplacées par
dplyr ettidyr).

Le site de l’extension est accessible à l’adresse : [Link] et contient une liste des
fonctions et les pages d’aide associĂ©es.

En particulier, on pourra se référer à la vignette dédiée à pivot_wider et pivot_longer pour des


exemples avancés de réorganisation des données.

– 325 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Pour des usages avancĂ©s, il est possible avec tidyr de gĂ©rer des donnĂ©es nichĂ©es (nested data), c’est-Ă -dire
des tableaux de données dans des tableaux de données. Ces fonctionnalités, réservées aux utilisateurs
avancés, sont décrites dans une vignette spécifique.

Fichiers volumineux
Si l’on a des tableaux de donnĂ©es particuliĂšrement volumineux (plusieurs Go), les fonctions de tidyr ne
sont pas forcéments les plus performantes.

On aura alors intĂ©rĂȘt Ă  regarder du cĂŽtĂ© des fonctions melt et dcast de l’extension [Link]
développées pour optimiser la performance sur les grands tableaux de données.

Pour plus de détails, voir la vignette dédiée : [Link]


[Link]

– 326 –
Export de données
Export de tableaux de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Exporter des objets spatiaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Sauvegarder des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328

Export de tableaux de données


On peut avoir besoin d’exporter un tableau de donnĂ©es dans R vers un fichier dans diffĂ©rents formats.
La plupart des fonctions d’import disposent d’un Ă©quivalent permettant l’export de donnĂ©es. On citera
notamment :

‱ write_csv , write_delim , write_tsv (readr)permettent d’enregistrer un data frame ou un


tibble dans un fichier au format texte délimité
‱ write_sas (haven) permet d’exporter au format SAS
‱ write_sav (haven) permet d’exporter au format SPSS
‱ write_dta (haven) permet d’exporter au format Stata

L’extension readxl ne fournit pas de fonction pour exporter au format Excel. Par contre, on pourra
passer par la fonction [Link] de l’extension openxlsx ou la fonction [Link] de l’extension
xlsx. L’intĂ©rĂȘt de l’extension openxlsx est de ne pas dĂ©pendre de Java Ă  la diffĂ©rence de l’extension xlsx.

Pour le format dBase, on peut utiliser [Link] (foreign).

Ces fonctions sont utiles si on souhaite diffuser des donnĂ©es Ă  quelqu’un d’autre, ou entre deux logiciels.

Si vous travaillez sur des donnĂ©es de grandes dimensions, les formats texte peuvent ĂȘtre lents Ă  exporter
et importer. Dans ce cas, l’extension feather peut ĂȘtre utile : elle permet d’enregistrer un data frame au
format feather, qui n’est pas le plus compact mais qui est extrĂȘmement rapide Ă  lire et Ă©crire 1.

Les fonctions read_feather et write_feather permettent d’importer et exporter des tableaux de


données dans ce format.

1. feather est un format compatible avec Python, R et Julia. Pour plus d’informations voir [Link]
feather

– 327 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Exporter des objets spatiaux


On aura recours à l’extension maptools qui fournit les fonctions writePointsShape | maptools,
writeLinesShape et writePolyShape pour exporter des données respectivement de type points,
lignes et polygones au format Shapefile, et la fonction writeAsciiGrid pour exporter un objet raster au
format ASCII grid.

Sauvegarder des objets


Une autre maniÚre de sauvegarder des données est de les enregistrer au format RData . Ce format
propre à R est compact, rapide, et permet d’enregistrer plusieurs objets R, quel que soit leur type, dans un
mĂȘme fichier.

Pour enregistrer des objets, il suffit d’utiliser la fonction save et de lui fournir la liste des objets à
sauvegarder et le nom du fichier :

R> save(d, rp2012, tab, file = "[Link]")

Pour charger des objets préalablement enregistrés, utiliser load :

R> load("[Link]")

Les objets d , rp2012 et tab devraient alors apparaĂźtre dans votre environnement.

I M P O R TA N T

Attention, quand on utilise load , les objets chargĂ©s sont importĂ©s directement dans l’environnement
en cours avec leur nom d’origine. Si d’autres objets du mĂȘme nom existaient dĂ©jĂ , ils sont Ă©crasĂ©s sans
avertissement.

R propose diffĂ©rentes fonctions permettant d’exporter des donnĂ©es vers des formats variĂ©s.

– 328 –
Export de données

Type de fichier souhaité Fonction Extension

texte [Link] utils

CSV [Link] utils

CSV write_csv readr

Excel [Link] xlsx

dBase [Link] foreign

SPSS write_sav haven

SPSS [Link] foreign

Stata [Link] foreign

Stata write_dta haven

SAS [Link] foreign

SPSS [Link] foreign

À nouveau, pour plus de dĂ©tails on se rĂ©fĂ©rera aux pages d’aide de ces fonctions et au manuel R Data
Import/Export accessible à l’adresse suivante : [Link]

– 329 –
Export de graphiques
Via l’interface de RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Sauvegarder le fichier en tant qu’image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Sauvegarder le graphique en PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Copier le graphique dans le presse-papier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
Export avec les commandes de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Export avec ggplot2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337

Via l’interface de RStudio


L’export de graphiques est trĂšs facile avec RStudio. Lorsque l’on créé un graphique, ce dernier est affichĂ©
sous l’onglet Plots dans le quadrant infĂ©rieur droit. Il suffit de cliquer sur Export pour avoir accĂšs Ă  trois
options différentes :

‱ Save as image pour sauvegarder le graphique en tant que fichier image ;


‱ Save as PDF pour sauvegarder le graphique dans un fichier PDF ;
‱ Copy to Clipboard pour copier le graphique dans le presse-papier (et pouvoir ainsi le coller ensuite
dans un document Word par exemple).

– 331 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Sauvegarder le fichier en tant qu’image

Sauvegarder un graphique en tant qu’image avec RStudio

Figure 1. Sauvegarder un graphique en tant qu’image avec RStudio

– 332 –
Export de graphiques

La boĂźte de dialogue qui s’ouvre propose diffĂ©rentes options d’export :

‱ le type de fichier dĂ©sirĂ© ;


‱ le nom du fichier ;
‱ le rĂ©pertoire oĂč le fichier doit ĂȘtre créé (par dĂ©faut, il s’agit du rĂ©pertoire de travail) ;
‱ la taille de l’image.

R peut exporter un graphique dans une grande variĂ©tĂ© de formats. Nous n’aborderons ici que les
principaux. Les formats PNG, JPEG et TIFF sont des formats de type bitmap (on parle aussi d’images
matricielles1). L’image est stockĂ©e sous forme de points, sa qualitĂ© dĂ©pendant de sa rĂ©solution, c’est-Ă -
dire du nombre total de points qui la composent. L’intĂ©rĂȘt des images matricielles est d’ĂȘtre toujours
interprĂ©tĂ©es de maniĂšre identique quelque soit l’outil utilisĂ©. Par contre, elles ne sont pas adaptĂ©es
lorsque l’on souhaite effectuer des retouches avec un logiciel de dessin.

Pour une utilisation sur un site web, on privilĂ©giera une rĂ©solution d’image modĂ©rĂ©e (entre 400 et 800
pixels de largeur) et les formats PNG ou JPEG. Pour un document destinĂ© Ă  ĂȘtre imprimĂ©, on priviligiera
une résolution plus élevée, pour éviter un phénomÚne dit de pixellisation.

Les images vectorielles2 ont l’avantage de pouvoir ĂȘtre redimensionnĂ©es Ă  volontĂ© sans perte de qualitĂ©
et produisent des fichiers en général de plus petite taille3. Elles sont donc tout à fait adaptées pour
l’impression. Si l’on souhaite importer l’image dans Word, on choisira le format Metafile (le seul compris
par ce logiciel). Pour Libre Office ou Open Office, on choisira le format SVG.

SVG (scalable vector graphic4) est un format libre permettant de décrire une image vectorielle. Les fichiers
SVG peuvent ĂȘtre directement lus par la majoritĂ© des navigateurs rĂ©cents (Firefox, Chrome, 
). De plus,
le logiciel libre de dessins Inkscape5 permet d’éditer et de modifier des fichiers SVG. Ce format est donc
tout Ă  fait adaptĂ© pour les graphiques que l’on souhaite retoucher avant publication. Depuis Inkscape, il
sera possible de faire un export PNG en haute résolution pour intégration dans un fichier Word.

On pourra modifier la taille de l’image avec les paramùtres Height (hauteur) et Width (largeur). En cliquant
sur Update Preview la prévisulation du rendu final sera mise à jour.

1. Voir [Link]

2. Voir [Link]

3. Sauf dans le cas des graphiques complexes reposant sur des dégradés de couleurs, comme les cartes produites à partir
de rasters. Auquel cas, il sera parfois préférable de privilégier un export dans un format bitmap.

4. Voir [Link]

5. téléchargeable gratuitement sur [Link]

– 333 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Sauvegarder le graphique en PDF

Sauvegarder un graphique en PDF avec RStudio

Figure 2. Sauvegarder un graphique en PDF avec RStudio

Les options de la boĂźte de dialogue permettent de modifier la taille du fichier PDF et, bien entendu,
d’indiquer le nom et le rĂ©pertoire du fichier Ă  crĂ©er.

En cliquant sur Preview, RStudio générera un fichier temporaire afin de visualiser le rendu final.

– 334 –
Export de graphiques

Copier le graphique dans le presse-papier

Copier un graphique dans le presse-papier avec RStudio

Figure 3. Copier un graphique dans le presse-papier avec RStudio

Il est possible de redimensionner le graphique. De plus, on prĂ©cisera si l’on souhaite copier une version
matricielle (bitmap) ou vectorielle (metafile) du graphique.

– 335 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

Export avec les commandes de R


On peut également exporter les graphiques dans des fichiers de différents formats directement avec des
commandes R. Ceci a l’avantage de fonctionner sur toutes les plateformes et de faciliter la mise à jour du
graphique exportĂ© (on n’a qu’à relancer les commandes concernĂ©es pour que le fichier externe soit mis Ă 
jour).

La premiĂšre possibilitĂ© est d’exporter le contenu d’une fenĂȘtre dĂ©jĂ  existante Ă  l’aide de la fonction
[Link] . On doit fournir à celle-ci le format de l’export (option device ) et le nom du fichier (option
file ).

Par exemple :

R> boxplot(rnorm(100))
[Link](device = png, file = "[Link]", width = 600)

Les formats de sortie possibles varient selon les plateformes, mais on retrouve partout les formats bitmap
png , jpeg , tiff et les formats vectoriels svg , postscript ou pdf .

L’autre possibilitĂ© est de rediriger directement la sortie graphique dans un fichier, avant d’exĂ©cuter la
commande gĂ©nĂ©rant la figure. On doit pour cela faire appel Ă  l’une des commandes permettant cette
redirection. Les plus courantes sont png , jpeg et tiff pour les formats bitmap, svg , pdf ,
postscript et [Link] pour les formats vectoriels.

Ces fonctions prennent différentes options permettant de personnaliser la sortie graphique. Les plus
courantes sont width et height qui donnent la largeur et la hauteur de l’image gĂ©nĂ©rĂ©e (en pixels pour
les images bitmap, en pouces pour les images vectorielles) et pointsize qui donne la taille de base des
polices de caractÚre utilisées.

R> png(file = "[Link]", width = 800, height = 700)


plot(rnorm(100))
[Link]()
pdf(file = "[Link]", width = 9, height = 9, pointsize = 10)
plot(rnorm(150))
[Link]()

Il est nécessaire de faire un appel à la fonction [Link] aprÚs génération du graphique pour que le
résultat soit bien écrit dans le fichier de sortie (dans le cas contraire on se retrouve avec un fichier vide).

– 336 –
Export de graphiques

Export avec ggplot2


Les graphiques produits par ggplot2 peuvent ĂȘtre sauvegardĂ©s manuellement, comme vu prĂ©cĂ©demment,
ou programmatiquement. Pour sauvegarder le dernier graphique affiché par ggplot2 au format PNG, il
suffit d’utiliser la fonction ggsave , qui permet d’en rĂ©gler la taille (en pouces) et la rĂ©solution (en pixels
par pouce ; 72 par défaut) :

R> ggsave("mon_graphique.png", width = 11, height = 8)

De la mĂȘme maniĂšre, pour sauvegarder n’importe quel graphique construit avec ggplot2 et stockĂ© dans
un objet, il suffit de prĂ©ciser le nom de cet objet, comme ci-dessous, oĂč l’on sauvegarde le graphique
contenu dans l’objet p au format vectoriel PDF, qui prĂ©serve la nettetĂ© du texte et des autres Ă©lĂ©ments
du graphique Ă  n’importe quelle rĂ©solution d’affichage :

R> ggsave("mon_graphique.pdf",
plot = p,
width = 11, height = 8
)

– 337 –
Statistique univariée
Variable quantitative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Principaux indicateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Histogramme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Densité et répartition cumulée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 344
BoĂźtes Ă  moustaches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Variable qualitative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Tris Ă  plat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350
Représentation graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 354
Tableaux faciles avec gtsummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Exporter les graphiques obtenus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 362

GUIDE-R

Une version actualisée de ce chapitre est disponible sur guide-R : Statistique univariée & Intervalles
de confiance

WEBIN-R

Ce chapitre est évoqué dans le webin-R #03 (statistiques descriptives avec gtsummary et esquisse)
sur YouTube.

On entend par statistique univariĂ©e l’étude d’une seule variable, que celle-ci soit quantitative ou
qualitative. La statistique univariée fait partie de la statistique descriptive.

Nous utiliserons dans ce chapitre les donnĂ©es de l’enquĂȘte Histoire de vie 2003 fournies avec l’extension
questionr.

– 339 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> library(questionr)
data("hdv2003")
d <- hdv2003

Variable quantitative

Principaux indicateurs
Comme la fonction str nous l’a indiquĂ©, notre tableau d contient plusieurs variables numĂ©riques ou
variables quantitatives, dont la variable [Link] qui reprĂ©sente le nombre moyen passĂ© par les enquĂȘtĂ©s
à regarder la télévision quotidiennement. On peut essayer de déterminer quelques caractéristiques de
cette variable, en utilisant les fonctions mean (moyenne), sd (écart-type), min (minimum), max
(maximum) et range (étendue) :

R> mean(d$[Link])

[1] NA

R> mean(d$[Link], [Link] = TRUE)

[1] 2.247

R> sd(d$[Link], [Link] = TRUE)

[1] 1.776

R> min(d$[Link], [Link] = TRUE)

[1] 0

R> max(d$[Link], [Link] = TRUE)

[1] 12

– 340 –
Statistique univariée

R> range(d$[Link], [Link] = TRUE)

[1] 0 12

On peut lui ajouter la fonction median qui donne la valeur médiane, quantile qui calcule plus
généralement tout type de quantiles, et le trÚs utile summary qui donne toutes ces informations ou
presque en une seule fois, avec en prime le nombre de valeurs manquantes ( NA ) :

R> median(d$[Link], [Link] = TRUE)

[1] 2

R> quantile(d$[Link], [Link] = TRUE)

0% 25% 50% 75% 100%


0 1 2 3 12

R> summary(d$[Link])

Min. 1st Qu. Median Mean 3rd Qu. Max. NA’s

0 1 2 2.247 3 12 5

La fonction summary est une fonction gĂ©nĂ©rique qui peut ĂȘtre utilisĂ©e sur tout type d’objet, y compris un
tableau de données. Essayez donc summary(d) .

Histogramme
Tout cela est bien pratique, mais pour pouvoir observer la distribution des valeurs d’une variable
quantitative, il n’y a quand mĂȘme rien de mieux qu’un bon graphique.

On peut commencer par un histogramme de la rĂ©partition des valeurs. Celui-ci peut ĂȘtre gĂ©nĂ©rĂ© trĂšs
facilement avec la fonction hist :

– 341 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> hist(d$[Link], main = "Nombre d'heures passées devant la télé par jou
r", xlab = "Heures", ylab = "Effectif")

Figure 1. Exemple d’histogramme

Sous RStudio, les graphiques s’affichent dans l’onglet Plots du quadrant infĂ©rieur droit. Il est possible
d’afficher une version plus grande de votre graphique en cliquant sur Zoom.

Ici, les options main , xlab et ylab permettent de personnaliser le titre du graphique, ainsi que les
Ă©tiquettes des axes. De nombreuses autres options existent pour personnaliser l’histogramme, parmi
celles-ci on notera :

‱ probability si elle vaut TRUE , l’histogramme indique la proportion des classes de valeurs au
lieu des effectifs.
‱ breaks permet de contrîler les classes de valeurs. On peut lui passer un chiffre, qui indiquera
alors le nombre de classes, un vecteur, qui indique alors les limites des différentes classes, ou
encore une chaĂźne de caractĂšre ou une fonction indiquant comment les classes doivent ĂȘtre
calculées.
‱ col la couleur de l’histogramme1.

1. Il existe un grand nombre de couleurs prédéfinies dans R. On peut récupérer leur liste en utilisant la fonction colors

– 342 –
Statistique univariée

Voir la page d’aide de la fonction hist pour plus de dĂ©tails sur les diffĂ©rentes options. Les deux figures
ci-aprùs sont deux autres exemples d’histogramme.

R> hist(d$[Link], main = "Heures de télé en 7 classes", breaks = 7, xlab


= "Heures", ylab = "Proportion", probability = TRUE, col = "orange")

Figure 2. Un autre exemple d’histogramme

en tapant simplement colors() dans la console, ou en consultant le document suivant :


[Link]

– 343 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> hist(d$[Link], main = "Heures de télé avec classes spécifiées", breaks


= c(0, 1, 4, 9, 12), xlab = "Heures", ylab = "Proportion", col = "red")

Figure 3. Encore un autre exemple d’histogramme

Densité et répartition cumulée


La fonction density permet d’obtenir une estimation par noyau2 de la distribution du nombre d’heures
consacrĂ©es Ă  regarder la tĂ©lĂ©vision. Le paramĂštre [Link] = TRUE indique que l’on souhaite retirer les
valeurs manquantes avant de calculer cette courbe de densité.

Le rĂ©sultat de cette estimation est ensuite reprĂ©sentĂ© graphiquement Ă  l’aide de plot . L’argument main
permet de spécifier le titre du graphique.

2. Voir [Link]

– 344 –
Statistique univariée

R> plot(density(d$[Link], [Link] = TRUE), main = "Heures consacrées à la t


élévision")

Figure 4. Courbe de densité

De maniÚre similaire, on peut calculer la fonction de répartition empirique ou empirical cumulative


distribution function en anglais avec la fonction ecdf. Le rĂ©sultat obtenu peut, une fois encore, ĂȘtre
reprĂ©sentĂ© sur un graphique Ă  l’aide de la fonction plot .

– 345 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> plot(ecdf(d$[Link]))

Figure 5. Fonction de répartition empirique cumulée

BoĂźtes Ă  moustaches
Les boßtes à moustaches, ou boxplots en anglais, sont une autre représentation graphique de la répartition
des valeurs d’une variable quantitative. Elles sont particuliùrement utiles pour comparer les distributions
de plusieurs variables ou d’une mĂȘme variable entre diffĂ©rents groupes, mais peuvent aussi ĂȘtre utilisĂ©es
pour reprĂ©senter la dispersion d’une unique variable. La fonction qui produit ces graphiques est la
fonction boxplot .

– 346 –
Statistique univariée

R> boxplot(d$[Link], main = "Nombre d'heures passées devant la télé par j


our", ylab = "Heures")

Figure 6. Exemple de boĂźte Ă  moustaches

Comment interpréter ce graphique ? On le comprendra mieux à partir de la figure ci-aprÚs3.

3. Le code ayant servi Ă  gĂ©nĂ©rer cette figure est une copie quasi conforme de celui prĂ©sentĂ© dans l’excellent document
de Jean Lobry sur les graphiques de base avec R, téléchargeable sur le site du PÎle bioinformatique lyonnais :
[Link]

– 347 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> boxplot(d$[Link], col = grey(0.8), main = "Nombre d'heures passées dev


ant la télé par jour", ylab = "Heures")
abline(h = median(d$[Link], [Link] = TRUE), col = "navy", lty = 2)
text(1.35, median(d$[Link], [Link] = TRUE) + 0.15, "Médiane", col = "na
vy")
Q1 <- quantile(d$[Link], probs = 0.25, [Link] = TRUE)
abline(h = Q1, col = "darkred")
text(1.35, Q1 + 0.15, "Q1 : premier quartile", col = "darkred", lty = 2)
Q3 <- quantile(d$[Link], probs = 0.75, [Link] = TRUE)
abline(h = Q3, col = "darkred")
text(1.35, Q3 + 0.15, "Q3 : troisiĂšme quartile", col = "darkred", lty =
2)
arrows(x0 = 0.7, y0 = quantile(d$[Link], probs = 0.75, [Link] = TRUE),
x1 = 0.7, y1 = quantile(d$[Link], probs = 0.25, [Link] = TRUE), length
= 0.1, code = 3)
text(0.7, Q1 + (Q3 - Q1) / 2 + 0.15, "h", pos = 2)
mtext("L'écart inter-quartile h contient 50 % des individus", side = 1)
abline(h = Q1 - 1.5 * (Q3 - Q1), col = "darkgreen")
text(1.35, Q1 - 1.5 * (Q3 - Q1) + 0.15, "Q1 -1.5 h", col = "darkgreen", l
ty = 2)
abline(h = Q3 + 1.5 * (Q3 - Q1), col = "darkgreen")
text(1.35, Q3 + 1.5 * (Q3 - Q1) + 0.15, "Q3 +1.5 h", col = "darkgreen", l
ty = 2)

– 348 –
Statistique univariée

Figure 7. InterprĂ©tation d’une boĂźte Ă  moustaches

Le carré au centre du graphique est délimité par les premiers et troisiÚme quartiles, avec la médiane
reprĂ©sentĂ©e par une ligne plus sombre au milieu. Les « fourchettes » s’étendant de part et d’autres vont
soit jusqu’à la valeur minimale ou maximale, soit jusqu’à une valeur approximativement Ă©gale au quartile
le plus proche plus 1,5 fois l’écart interquartile. Les points se situant en-dehors de cette fourchette sont
reprĂ©sentĂ©s par des petits ronds et sont gĂ©nĂ©ralement considĂ©rĂ©s comme des valeurs extrĂȘmes,
potentiellement aberrantes.

On peut ajouter la représentation des valeurs sur le graphique pour en faciliter la lecture avec des petits
traits dessinĂ©s sur l’axe vertical (fonction rug ) :

– 349 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> boxplot(d$[Link], main = "Nombre d'heures passées devant la télé par\n


jour", ylab = "Heures")
rug(d$[Link], side = 2)

Figure 8. Boßte à moustaches avec représentation des valeurs

Variable qualitative

Tris Ă  plat
La fonction la plus utilisĂ©e pour le traitement et l’analyse des variables qualitatives (variable prenant ses
valeurs dans un ensemble de modalités) est sans aucun doute la fonction table , qui donne les effectifs
de chaque modalitĂ© de la variable, ce qu’on appelle un tri Ă  plat ou tableau de frĂ©quences.

– 350 –
Statistique univariée

R> table(d$sexe)

Homme Femme

899 1101

La tableau prĂ©cĂ©dent nous indique que parmi nos enquĂȘtĂ©s on trouve 899 hommes et 1101 femmes.

Quand le nombre de modalitĂ©s est Ă©levĂ©, on peut ordonner le tri Ă  plat selon les effectifs Ă  l’aide de la
fonction sort .

R> table(d$occup)

Exerce une Etudiant, Retire des Au Autre


profession Chomeur eleve Retraite affaires foyer inactif

1049 134 94 392 77 171 83

R> sort(table(d$occup))

Retire des Autre Etudiant, Au Exerce une


affaires inactif eleve Chomeur foyer Retraite profession

77 83 94 134 171 392 1049

R> sort(table(d$occup), decreasing = TRUE)

Exerce une Au Etudiant, Autre Retire des


profession Retraite foyer Chomeur eleve inactif affaires

1049 392 171 134 94 83 77

À noter que la fonction table exclut par dĂ©faut les non-rĂ©ponses du tableau rĂ©sultat. L’argument useNA
de cette fonction permet de modifier ce comportement :

‱ avec useNA="no" (valeur par dĂ©faut), les valeurs manquantes ne sont jamais incluses dans le tri
Ă  plat ;
‱ avec useNA="ifany" , une colonne NA est ajoutĂ©e si des valeurs manquantes sont prĂ©sentes
dans les données ;
‱ avec useNA="always" , une colonne NA est toujours ajoutĂ©e, mĂȘme s’il n’y a pas de valeurs

– 351 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

manquantes dans les données.

On peut donc utiliser :

R> table(d$[Link], useNA = "ifany")

Satisfaction Insatisfaction Equilibre NA

480 117 451 952

L’utilisation de summary permet Ă©galement l’affichage du tri Ă  plat et du nombre de non-rĂ©ponses :

R> summary(d$[Link])

Satisfaction Insatisfaction Equilibre NA's


480 117 451 952

Pour obtenir un tableau avec la répartition en pourcentages, on peut utiliser la fonction freq de
l’extension questionr4.

R> freq(d$qualif)

item count percent cum_count cum_percent

Employe 594 0.3593 594 0.3593

Ouvrier qualifie 292 0.1766 886 0.5360

Cadre 260 0.1573 1146 0.6933

Ouvrier specialise 203 0.1228 1349 0.8161

Profession intermediaire 160 0.0968 1509 0.9129

Technicien 86 0.0520 1595 0.9649

Autre 58 0.0351 1653 1.0000

La colonne n donne les effectifs bruts, la colonne % la répartition en pourcentages et val% la


répartition en pourcentages, données manquantes exclues. La fonction accepte plusieurs paramÚtres

4. En l’absence de l’extension questionr, on pourra se rabattre sur la fonction [Link] avec la commande suivante :
[Link](table(d$qualif)) .

– 352 –
Statistique univariée

permettant d’afficher les totaux, les pourcentages cumulĂ©s, de trier selon les effectifs ou de contrĂŽler
l’affichage. Par exemple :

R> freq(d$qualif, cum = TRUE, total = TRUE, sort = "inc", digits = 2, exclude = N
A)

item count percent cum_count cum_percent

Autre 58 0.0351 58 0.0351

Cadre 260 0.1573 318 0.1924

Employe 594 0.3593 912 0.5517

Ouvrier qualifie 292 0.1766 1204 0.7284

Ouvrier specialise 203 0.1228 1407 0.8512

Profession intermediaire 160 0.0968 1567 0.9480

Technicien 86 0.0520 1653 1.0000

La colonne %cum indique ici le pourcentage cumulé, ce qui est ici une trÚs mauvaise idée puisque pour ce
type de variable cela n’a aucun sens. Les lignes du tableau rĂ©sultat ont Ă©tĂ© triĂ©s par effectifs croissants, les
totaux ont été ajoutés, les non-réponses exclues et les pourcentages arrondis à deux décimales.

La fonction freq est Ă©galement en mesure de tenir compte des Ă©tiquettes de valeurs lorsqu’on utilise des
données labellisées, page 121. Ainsi :

R> data(fecondite)
questionr::describe(femmes$region)

[2000 obs.] Région de résidence


labelled double: 4 4 4 4 4 3 3 3 3 3 ...
min: 1 - max: 4 - NAs: 0 (0%) - 4 unique values
4 value labels: [1] Nord [2] Est [3] Sud [4] Ouest

n %
[1] Nord 707 35.4
[2] Est 324 16.2
[3] Sud 407 20.3
[4] Ouest 562 28.1
Total 2000 100.0

– 353 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> freq(femmes$region)

item count percent cum_count cum_percent

1 707 0.3535 707 0.3535

4 562 0.2810 1269 0.6345

3 407 0.2035 1676 0.8380

2 324 0.1620 2000 1.0000

R> freq(femmes$region, levels = "labels")

item count percent cum_count cum_percent

1 707 0.3535 707 0.3535

4 562 0.2810 1269 0.6345

3 407 0.2035 1676 0.8380

2 324 0.1620 2000 1.0000


Pour plus d’informations sur la fonction freq , consultez sa page d’aide en ligne avec ?freq ou
help("freq") .

Représentation graphique
Pour reprĂ©senter la rĂ©partition des effectifs parmi les modalitĂ©s d’une variable qualitative, on a souvent
tendance Ă  utiliser des diagrammes en secteurs (camemberts). Ceci est possible sous R avec la fonction
pie , mais la page d’aide de la dite fonction nous le dĂ©conseille assez vivement : les diagrammes en
secteur sont en effet une mauvaise maniĂšre de prĂ©senter ce type d’information, car l’oeil humain prĂ©fĂšre
comparer des longueurs plutĂŽt que des surfaces5.

On privilĂ©giera donc d’autres formes de reprĂ©sentations, Ă  savoir les diagrammes en bĂątons et les
diagrammes de Cleveland.

Les diagrammes en bĂątons sont utilisĂ©s automatiquement par R lorsqu’on applique la fonction gĂ©nĂ©rique
plot à un tri à plat obtenu avec table . On privilégiera cependant ce type de représentations pour les
variables de type numérique comportant un nombre fini de valeurs. Le nombre de frÚres, soeurs, demi-
frĂšres et demi-soeurs est un bon exemple :

5. Voir en particulier [Link] pour un exemple concret.

– 354 –
Statistique univariée

R> plot(table(d$[Link]), main = "Nombre de frĂšres, soeurs, demi-frĂšre


s et demi-soeurs", ylab = "Effectif")

Figure 9. Exemple de diagramme en bĂątons

Pour les autres types de variables qualitatives, on privilégiera les diagrammes de Cleveland, obtenus avec
la fonction dotchart . On doit appliquer cette fonction au tri Ă  plat de la variable, obtenu avec table 6 :

6. Pour des raisons liées au fonctionnement interne de la fonction dotchart , on doit transformer le tri à plat en
matrice, d’oĂč l’appel Ă  la fonction [Link] .

– 355 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> dotchart([Link](table(d$clso))[, 1], main = "Sentiment d'appartenance


Ă  une classe sociale", pch = 19)

Figure 10. Exemple de diagramme de Cleveland

– 356 –
Statistique univariée

NOTE

Il est possible d’entrer directement la commande suivante dans la console :

R> dotchart(table(d$clso))

R produira bien le diagramme de Cleveland dĂ©sirĂ© mais affichera un message d’avertissement


(Warning) car pour des raisons liées au fonctionnement interne de la fonction dotchart , il est
attendu une matrice ou un vecteur, non un objet de type table. Pour éviter cet avertissement, il est
nécessaire de faire appel à la fonction [Link] .

R> dotchart([Link](table(d$clso)))

Dans le cas présent, on voit apparaßtre un chiffre 1 au-dessus des modalités. En fait, dotchart peut
ĂȘtre appliquĂ© au rĂ©sultat d’un tableau croisĂ© Ă  deux entrĂ©es, auquel cas il prĂ©sentera les rĂ©sultats pour
chaque colonne. Comme dans l’exemple ci-aprùs.

– 357 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> dotchart([Link](table(d$clso, d$sexe)))

Cela ne rĂ©soud pas le problĂšme pour notre diagramme de Cleveland issu d’un tri Ă  plat simple. Pour
bien comprendre, la fonction [Link] a produit un objet Ă  deux dimensions ayant une colonne et
plusieurs lignes. On indiquera à R que l’on ne souhaite extraire la premiùre colonne avec [, 1] (juste
aprĂšs l’appel Ă  [Link] ). C’est ce qu’on appelle l’indexation, abordĂ©e plus en dĂ©tail dans le chapitre
Listes et tableaux de données, page 91.

Quand la variable comprend un grand nombre de modalitĂ©s, il est prĂ©fĂ©rable d’ordonner le tri Ă  plat
obtenu à l’aide de la fonction sort :

– 358 –
Statistique univariée

R> dotchart([Link](sort(table(d$qualif)))[, 1], main = "Niveau de qualifi


cation")

Figure 11. Exemple de diagramme de Cleveland ordonné

– 359 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

NOTE

L’agument pch , qui est utilisĂ© par la plupart des graphiques de type points, permet de spĂ©cifier le
symbole Ă  utiliser. Il peut prendre soit un nombre entier compris entre 0 et 25, soit un charactĂšre
textuel (voir ci-dessous).

Tableaux faciles avec gtsummary


L’extension gtsummary permets de rĂ©aliser facilement des tableaux univariĂ©s grace Ă  la fonction
tbl_summary . Le résultat produit des tableaux trÚs propres, notamment dans le cadre de rapports
automatisés au format Rmarkdown (voir le chapitre dédié, page 1189).

On peut indiquer Ă  la fois des variables quantitatives et qualitatives.

– 360 –
Statistique univariée

R> library(gtsummary)
d %>% tbl_summary(include = c("[Link]", "occup", "qualif"))

Characteristic N = 2,0001

[Link] 2.00 (1.00, 3.00)

Unknown 5

occup

Exerce une profession 1,049 (52%)

Chomeur 134 (6.7%)

Etudiant, eleve 94 (4.7%)

Retraite 392 (20%)

Retire des affaires 77 (3.9%)

Au foyer 171 (8.6%)

Autre inactif 83 (4.2%)

qualif

Ouvrier specialise 203 (12%)

Ouvrier qualifie 292 (18%)

Technicien 86 (5.2%)

Profession intermediaire 160 (9.7%)

Cadre 260 (16%)

Employe 594 (36%)

Autre 58 (3.5%)

Unknown 347

1 Median (IQR); n (%)

Il est possible de personnaliser les statisques présentées (par exemple moyenne et écart-type à la place
de la mĂ©diane et l’intervale inter-quartile). De plus, tbl_summary prend en compte les Ă©tiquettes de
variables si elles ont été définies (voir le chapitre dédié). Il est aussi possible de franciser la présentation

– 361 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

des résultats.

R> library(labelled)
var_label(d$[Link]) <- "Heures quotidiennes devant la télévision"
var_label(d$occup) <- "Activité"
theme_gtsummary_language("fr", [Link] = ",", [Link] = " ")

Setting theme `language: fr`

R> d %>% tbl_summary(


include = c("[Link]", "occup"),
statistic = list(all_continuous() ~ "{mean} ({sd})")
)

Caractéristique N = 2 0001

Heures quotidiennes devant la télévision 2,25 (1,78)

Manquant 5

Activité

Exerce une profession 1 049 (52%)

Chomeur 134 (6,7%)

Etudiant, eleve 94 (4,7%)

Retraite 392 (20%)

Retire des affaires 77 (3,9%)

Au foyer 171 (8,6%)

Autre inactif 83 (4,2%)

1 Moyenne (ET); n (%)

Pour une présentation de toutes les possibilités offertes, voir la vignette dédiée sur
[Link]

Exporter les graphiques obtenus


L’export de graphiques est trĂšs facile avec RStudio. Lorsque l’on créé un graphique, ce dernier est affichĂ©

– 362 –
Statistique univariée

sous l’onglet Plots dans le quadrant infĂ©rieur droit. Il suffit de cliquer sur Export pour avoir accĂšs Ă  trois
options différentes :

‱ Save as image pour sauvegarder le graphique en tant que fichier image ;


‱ Save as PDF pour sauvegarder le graphique dans un fichier PDF ;
‱ Copy to Clipboard pour copier le graphique dans le presse-papier (et pouvoir ainsi le coller ensuite
dans un document Word par exemple).

Pour une prĂ©sentation dĂ©taillĂ©e de l’export de graphiques avec RStudio, ainsi que pour connaĂźtre les
commandes R permettant d’exporter des graphiques via un script, on pourra se rĂ©fĂ©rer au chapitre dĂ©diĂ©,
page 331.

– 363 –
Statistique bivariée
Deux variables quantitatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Trois variables ou plus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373
Une variable quantitative et une variable qualitative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Représentations graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Tests statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Deux variables qualitatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Tableau croisé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Pourcentages en ligne et en colonne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
Représentation graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
Tests statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Tableaux faciles avec gtsummary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Analyse des associations avec GDAtools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394

GUIDE-R

Une version actualisée de ce chapitre est disponible sur guide-R : Statistique bivariée & Tests de
comparaison

WEBIN-R

Ce chapitre est évoqué dans le webin-R #03 (statistiques descriptives avec gtsummary et esquisse)
sur YouTube.

On entend par statistique bivariĂ©e l’étude des relations entre deux variables, celles-ci pouvant ĂȘtre
quantitatives ou qualitatives. La statistique bivariée fait partie de la statistique descriptive.

La statistique univariée a quant à elle déjà été abordée dans un chapitre dédié, page 339.

Comme dans la partie prĂ©cĂ©dente, on travaillera sur les jeux de donnĂ©es fournis avec l’extension questionr
et tirĂ© de l’enquĂȘte Histoire de vie et du recensement 1999 :

– 365 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> library(questionr)
data(hdv2003)
d <- hdv2003

R> load(url("[Link]
a"))

Deux variables quantitatives


La comparaison de deux variables quantitatives se fait en premier lieu graphiquement, en représentant
l’ensemble des couples de valeurs. On peut ainsi reprĂ©senter les valeurs du nombre d’heures passĂ©es
devant la tĂ©lĂ©vision selon l’ñge.

R> plot(d$age, d$[Link])

Figure 1. Nombre d’heures de tĂ©lĂ©vision selon l’ñge

Le fait que des points sont superposés ne facilite pas la lecture du graphique. On peut utiliser une

– 366 –
Statistique bivariée

représentation avec des points semi-transparents.

R> plot(d$age, d$[Link], pch = 19, col = rgb(1, 0, 0, 0.1))

Figure 2. Nombre d’heures de tĂ©lĂ©vision selon l’ñge avec semi-transparence

Plus sophistiqué, on peut faire une estimation locale de densité et représenter le résultat sous forme
de « carte ». Pour cela on commence par isoler les deux variables, supprimer les observations ayant au
moins une valeur manquante Ă  l’aide de la fonction [Link] , estimer la densitĂ© locale Ă  l’aide
de la fonction kde2d de l’extension MASS1 et reprĂ©senter le tout Ă  l’aide d’une des fonctions image ,
contour ou [Link] 


1. MASS est installée par défaut avec la version de base de R.

– 367 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> library(MASS)
tmp <- d[, c("age", "[Link]")]
tmp <- tmp[[Link](tmp), ]
[Link](kde2d(tmp$age, tmp$[Link]), color = [Link])

Figure 3. ReprĂ©sentation de l’estimation de densitĂ© locale

Une reprĂ©sentation alternative de la densitĂ© locale peut ĂȘtre obtenue avec la fonction smoothScatter .

– 368 –
Statistique bivariée

R> smoothScatter(d[, c("age", "[Link]")])

Figure 4. ReprĂ©sentation alternative de l’estimation de densitĂ© locale

Dans tous les cas, il n’y a pas de structure trĂšs nette qui semble se dĂ©gager. On peut tester ceci
mathĂ©matiquement en calculant le coefficient de corrĂ©lation entre les deux variables Ă  l’aide de la
fonction cor :

R> cor(d$age, d$[Link], use = "[Link]")

[1] 0.1776

L’option use permet d’éliminer les observations pour lesquelles l’une des deux valeurs est manquante. Le
coefficient de corrélation est trÚs faible.

On va donc s’intĂ©resser plutĂŽt Ă  deux variables prĂ©sentes dans le jeu de donnĂ©es rp99 , la part de
diplÎmés du supérieur et la proportion de cadres dans les communes du RhÎne en 1999.

À nouveau, commençons par reprĂ©senter les deux variables.

– 369 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> plot(rp99$[Link], rp99$cadres, ylab = "Part des cadres", xlab = "Part d


es diplomĂȘs du supĂ©rieur")

Figure 5. Proportion de cadres et proportion de diplÎmés du supérieur

Ça ressemble dĂ©jĂ  beaucoup plus Ă  une relation de type linĂ©aire.

Calculons le coefficient de corrélation :

R> cor(rp99$[Link], rp99$cadres)

[1] 0.8975

C’est beaucoup plus proche de 1. On peut alors effectuer une rĂ©gression linĂ©aire complĂšte en utilisant la
fonction lm :

– 370 –
Statistique bivariée

R> reg <- lm(cadres ~ [Link], data = rp99)


summary(reg)

Call:
lm(formula = cadres ~ [Link], data = rp99)

Residuals:
Min 1Q Median 3Q Max
-9.691 -1.901 -0.182 1.491 17.087

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.2409 0.3299 3.76 2e-04 ***
[Link] 1.3835 0.0393 35.20 <2e-16 ***
---
Signif. codes:
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 3.28 on 299 degrees of freedom


Multiple R-squared: 0.806, Adjusted R-squared: 0.805
F-statistic: 1.24e+03 on 1 and 299 DF, p-value: <2e-16

Le résultat montre que les coefficients sont significativement différents de 0. La part de cadres augmente
donc avec celle de diplÎmés du supérieur (Î surprise). On peut trÚs facilement représenter la droite de
rĂ©gression Ă  l’aide de la fonction abline .

– 371 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> plot(rp99$[Link], rp99$cadres, ylab = "Part des cadres", xlab = "Part d


es diplÎmés du supérieur")
abline(reg, col = "red")

Figure 6. Régression de la proportion de cadres par celle de diplÎmés du supérieur

– 372 –
Statistique bivariée

NOTE

On remarquera que le premier argument passé à la fonction lm a une syntaxe un peu particuliÚre. Il
s’agit d’une formule, utilisĂ©e de maniĂšre gĂ©nĂ©rale dans les modĂšles statistiques. On indique la variable
d’intĂ©rĂȘt Ă  gauche et la variable explicative Ă  droite, les deux Ă©tant sĂ©parĂ©es par un tilde ∌ (obtenu
sous Windows en appuyant simultanément sur les touches Alt Gr et 2 ). On remarquera que les
noms des colonnes de notre tableau de données ont été écrites sans guillemets.

Dans le cas prĂ©sent, nous avons calculĂ© une rĂ©gression linĂ©aire simple entre deux variables, d’oĂč
l’écriture cadres ∌ [Link] . Si nous avions voulu expliquer une variable z par deux variables x et
y, nous aurions Ă©crit z ∌ x + y . Il est possible de spĂ©cifier des modĂšles encore plus complexes.

Pour un aperçu de la syntaxe des formules sous R, voir [Link]


tutorials/[Link].

Trois variables ou plus


Lorsque l’on souhaite reprĂ©senter trois variables quantitatives simultanĂ©ment, il est possible de rĂ©aliser
un nuage de points reprĂ©sentant les deux premiĂšres variables sur l’axe horizontal et l’axe vertical et en
faisant varier la taille des points selon la troisiùme variable, en utilisant l’argument cex de la fonction
plot .

– 373 –
analyse-R – Introduction Ă  l’analyse d’enquĂȘtes avec R et RStudio

R> plot(rp99$[Link], rp99$[Link], cex = rp99$[Link] / 10^4)

Figure 7. Nuage de points avec taille des points proportionnels Ă  une troisiĂšme variable