0% ont trouvé ce document utile (0 vote)
2K vues929 pages

Analyse R

Manuel analyse des données d'enquête avec R

Transféré par

bkajji
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)
2K vues929 pages

Analyse R

Manuel analyse des données d'enquête avec R

Transféré par

bkajji
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 : 17 juin 2019

DOI 10.5281/zenodo.2669067

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 — http://joseph.larmarange.net


analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 libraririe).

– 2 –
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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Installation de R et RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Premier contact . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
Premier travail avec des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
Extensions (installation, mise à jour) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Introduction au tidyverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Vecteurs, indexation et assignation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
Listes et Tableaux de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Facteurs et vecteurs labellisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Organiser ses fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Import de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Où trouver de l’aide ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151

Manipulation de données

Visualiser ses données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161


Recodage de variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175
Manipuler les données avec dplyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
Manipulations avancées avec data.table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Tris . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227

– 3 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Sous-ensembles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Fusion de tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Gestion des dates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Fonctions à fenêtre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257
Manipuler du texte avec stringr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 259
Réorganiser ses données avec tidyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Scraping . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287

Exporter

Export de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297


Export de graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301

Analyser
Statistiques introductives

Statistique univariée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309


Statistique bivariée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Introduction à ggplot2, la grammaire des graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Graphiques univariés et bivariés avec ggplot2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Données pondérées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421

Statistiques intermédiaires

Intervalles de confiance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 429


Comparaisons (moyennes et proportions) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437
Définir un plan d’échantillonnage complexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
Régression linéaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Régression logistique binaire, multinomiale et ordinale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457
Analyse des correspondances multiples (ACM) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513
Classification ascendante hiérarchique (CAH) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551

Statistiques avancées

Effets d’interaction dans un modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573

– 4 –
analyse-R

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


Analyse de survie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Analyse de séquences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 623
Trajectoires de soins : un exemple de données longitudinales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 647
Analyse de réseaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 719
Analyse spatiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721

Approfondir
Graphiques

ggplot2 et la grammaire des graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 723


Étendre ggplot2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 727
Combiner plusieurs graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 739
Graphiques interactifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 753
lattice : graphiques et formules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 757
Cartes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773

Programmation

Conditions et comparaisons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775


Formules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779
Structures conditionnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 793
Vectorisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 801
Expressions régulières . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 821
R Markdown : les rapports automatisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 823

Divers

Mettre en forme des nombres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 855


Couleurs et Palettes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 857
Annotations mathématiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 869
Calculer un âge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 875
Diagramme de Lexis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 883

– 5 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Index
Index des concepts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 885
Index des fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 901
Index des extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 921

Licence
Le contenu de ce site est diffusé sous licence Creative Commons Attribution - Pas d’utilisation commerciale -
Partage dans les mêmes conditions (https://creativecommons.org/licenses/by-nc-sa/3.0/fr/).

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 :
https://github.com/larmarange/analyse-R.

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

– 6 –
Présentation et Philosophie
Présentation de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Philosophie de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Présentation de RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9

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, page 01, 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, page 02, il est devenu très aisé de produire des rapports automatisés dans
divers 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 :

1. Pour plus d’informations sur ce qu’est un logiciel libre, voir : http://www.gnu.org/philosophy/free-sw.fr.html.

2. Voir http://rmarkdown.rstudio.com/.

– 7 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

• 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, page 03, 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, page 04).
• 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.
• 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.

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.

– 8 –
Présentation et Philosophie

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

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.

– 9 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 :
http://www.rstudio.com/.

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 à https://support.rstudio.com. 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é http://blog.rstudio.org/.

– 10 –
Installation de R et RStudio
Installation de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Installation de RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Mise à jour de R sous Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12

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 : http://cran.r-project.org/bin/windows/
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, page 01.

Pour Mac OS X, les fichiers d’installation sont disponibles à http://cran.r-project.org/bin/macosx/.

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.

Installation de RStudio
Une fois R correctement installé, rendez-vous sur http://www.rstudio.com/products/rstudio/download/
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.

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.

– 11 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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
http://www.rstudio.com/products/rstudio/download/preview/.

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, update.packages soit en cliquant sur Update dans l’onglet Packages du quadrant inférieur
droit.

– 12 –
Premier contact
L’invite de commandes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Objets simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Vecteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Des fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Quelques fonctions utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Aide sur une fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Interprétation des arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Autocomplétion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30

NOTE

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

Une fois RStudio lancé, vous devriez obtenir une fenêtre similaire à la figure ci-après.

– 13 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 33) ;
• 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 :

– 14 –
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


'help.start()' 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, page 01. 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 21.

– 15 –
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.

– 16 –
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) : https://support.rstudio.com/hc/en-us/articles/200526217-Command-


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 :

– 17 –
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 .

– 18 –
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 :

– 19 –
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.

– 20 –
Premier contact

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, page 02. 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.

– 21 –
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, 155, 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] , [12] et [23] ). En fait ces nombres entre crochets indiquent la position du
premier élément de la ligne dans notre vecteur. Ainsi, le 155 en début de deuxième ligne est le 12e élément
du vecteur, tandis que le 182 de la troisième ligne est à la 23e 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 :

– 22 –
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.83653 20.07378 27.73230 16.51473 26.36560 23.66524


[7] 22.57105 14.90139 18.81892 19.03114

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 à

– 23 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

maîtriser). Nous en reparlerons dans le chapitre sur la manipulation de données.

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

– 24 –
Premier contact

R> mean(tailles)

[1] 173.4

R> var(tailles)

[1] 76.71111

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é na.rm :

– 25 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> mean(tailles, na.rm = TRUE)

[1] 171.3333

Positionner le paramètre na.rm à 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 :

– 26 –
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.

– 27 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et 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 151.

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é.

– 28 –
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, na.encode = TRUE, scientific = NA,
big.mark = "", big.interval = 3L,
small.mark = "", small.interval = 5L,
decimal.mark = ".", zero.print = 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

– 29 –
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), decimal.mark = ",", big.mark = " ")

[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(decimal.mark = ",")

Error in format.default(decimal.mark = ","): l'argument "x" est manquant, avec a


ucune valeur par défaut

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, page 03. 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.

– 30 –
Premier contact

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 (https://support.rstudio.com/hc/en-us/


articles/205273297-Code-Completion).

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

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.

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

– 33 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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.

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

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

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, page 01.

– 34 –
Premier travail avec des données

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) :
https://support.rstudio.com/hc/en-us/articles/200484448-Editing-and-Executing-Code.

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 :

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

– 35 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 :

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) :
https://support.rstudio.com/hc/en-us/articles/200484568-Code-Folding-and-Sections.

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

– 36 –
Premier travail avec des données

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.

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 53.

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 :

– 37 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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
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

– 38 –
Premier travail avec des données

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).

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.

– 39 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Figure 5. La visionneuse de données de RStudio

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 133), 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

– 40 –
Premier travail avec des données

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" "freres.soeurs" "clso"
[10] "relig" "trav.imp" "trav.satisf"
[13] "hard.rock" "lecture.bd" "peche.chasse"
[16] "cuisine" "bricol" "cinema"
[19] "sport" "heures.tv"

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

– 41 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

[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)

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)

'data.frame': 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 ...
$ freres.soeurs: 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 ...
$ trav.imp : Factor w/ 4 levels "Le plus important",..: 4 NA 2 3 NA 1 NA 4
NA 3 ...
$ trav.satisf : Factor w/ 3 levels "Satisfaction",..: 2 NA 3 1 NA 3 NA 2 NA 1
...

– 42 –
Premier travail avec des données

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


$ lecture.bd : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
$ peche.chasse : 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 ...
$ heures.tv : 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
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.

– 43 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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)

[2000 obs. x 20 variables] tbl_df tbl data.frame

$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" "Homm
e" "Femme" "Homme" ...
2 levels: Homme | Femme
NAs: 0 (0%)

$nivetud:
nominal factor: "Enseignement superieur y compris technique superieur" NA "De
rniere annee d'etudes primaires" "Enseignement superieur y compris technique
superieur" "Derniere annee d'etudes primaires" "Enseignement technique ou pro
fessionnel court" "Derniere annee d'etudes primaires" "Enseignement techniqu
e ou professionnel court" NA "Enseignement technique ou professionnel long"
...
8 levels: N'a jamais fait d'etudes | A arrete ses etudes, avant la derniere a
nnee d'etudes primaires | Derniere annee d'etudes primaires | 1er cycle | 2em
e cycle | Enseignement technique ou professionnel court | Enseignement techni
que ou professionnel long | Enseignement superieur y compris technique superi
eur
NAs: 112 (5.6%)

$poids:

– 44 –
Premier travail avec des données

numeric: 2634.3982157 9738.3957759 3994.1024587 5731.6615081 4329.0940022 867


4.6993828 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 profess
ion" "Exerce une profession" "Retraite" "Exerce une profession" "Au foyer" "E
xerce une profession" "Etudiant, eleve" "Exerce une profession" ...
7 levels: Exerce une profession | Chomeur | Etudiant, eleve | Retraite | Reti
re des affaires | Au foyer | Autre inactif
NAs: 0 (0%)

$qualif:
nominal factor: "Employe" NA "Technicien" "Technicien" "Employe" "Employe" "O
uvrier qualifie" "Ouvrier qualifie" NA "Autre" ...
7 levels: Ouvrier specialise | Ouvrier qualifie | Technicien | Profession int
ermediaire | Cadre | Employe | Autre
NAs: 347 (17.3%)

$freres.soeurs:
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 reguli
er" "Ni croyance ni appartenance" "Appartenance sans pratique" "Ni croyance n
i appartenance" "Appartenance sans pratique" "Pratiquant occasionnel" ...
6 levels: Pratiquant regulier | Pratiquant occasionnel | Appartenance sans pr
atique | Ni croyance ni appartenance | Rejet | NSP ou NVPR
NAs: 0 (0%)

$trav.imp:
nominal factor: "Peu important" NA "Aussi important que le reste" "Moins impo
rtant que le reste" NA "Le plus important" NA "Peu important" NA "Moins impor
tant que le reste" ...
4 levels: Le plus important | Aussi important que le reste | Moins important

– 45 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

que le reste | Peu important


NAs: 952 (47.6%)

$trav.satisf:
nominal factor: "Insatisfaction" NA "Equilibre" "Satisfaction" NA "Equilibr
e" NA "Insatisfaction" NA "Satisfaction" ...
3 levels: Satisfaction | Insatisfaction | Equilibre
NAs: 952 (47.6%)

$hard.rock:
nominal factor: "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non"
...
2 levels: Non | Oui
NAs: 0 (0%)

$lecture.bd:
nominal factor: "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non"
...
2 levels: Non | Oui
NAs: 0 (0%)

$peche.chasse:
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

– 46 –
Premier travail avec des données

NAs: 0 (0%)

$sport:
nominal factor: "Non" "Oui" "Oui" "Oui" "Non" "Oui" "Non" "Non" "Non" "Oui"
...
2 levels: Non | Oui
NAs: 0 (0%)

$heures.tv:
numeric: 0 1 0 2 3 2 2.9 1 2 2 ...
min: 0 - max: 12 - NAs: 5 (0.2%) - 30 unique values

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.157

R> median(d$age)

[1] 48

R> min(d$age)

[1] 18

R> max(d$age)

[1] 97

– 47 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 875.

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.00 35.00 48.00 48.16 60.00 97.00

R> summary(d$qualif)

Ouvrier specialise Ouvrier qualifie


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

– 48 –
Premier travail avec des données

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
qualif freres.soeurs
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

trav.imp trav.satisf
Le plus important : 29 Satisfaction :480
Aussi important que le reste:259 Insatisfaction:117
Moins important que le reste:708 Equilibre :451

– 49 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Peu important : 52 NA's :952


NA's :952

hard.rock lecture.bd peche.chasse cuisine bricol


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

cinema sport heures.tv


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

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 .

– 50 –
Premier travail avec des données

R> plot(d$sexe)

Figure 6. Nombre d’observations par sexe

Essayons avec deux variables :

– 51 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> plot(d$hard.rock, 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.

– 52 –
Extensions (installation, mise
à jour)
Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Le «tidyverse» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Installation depuis CRAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
Installation depuis GitHub . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
Mise à jour des extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55

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
baptisé CRAN (Comprehensive R Archive Network).

La liste de toutes les extensions disponibles sur CRAN est disponible ici : http://cran.r-project.org/web/
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 : http://cran.r-project.org/
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 : http://cran.r-
project.org/web/views/SocialSciences.html.

On peut aussi citer le site Awesome R (https://awesome-r.com/) qui fournit une liste d’extensions choisies

– 53 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 : https://github.com/
tidyverse/. Une présentation plus générale du tidyverse est disponible sur le site de RStudio
(https://www.rstudio.com/products/rpackages/) et sur un sité dédié (http://tidyverse.org/).

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 57.

Installation depuis CRAN


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

R> install.packages("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 :

– 54 –
Extensions (installation, mise à jour)

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 update.packages suffit :

R> update.packages()

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


remove.packages :

R> remove.packages("ade4")

I M P O R TA N T

Il est important de bien comprendre la différence entre install.packages 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.

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, update.packages
soit en cliquant sur Update dans l’onglet Packages du quadrant inférieur droit.

– 55 –
Introduction au tidyverse
Extensions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
tidy data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
tibbles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59

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.

– 57 –
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> install.packages("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

– 58 –
Introduction au tidyverse

Un chapitre dédié à tidyr, page 269 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
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, page 01
• 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, page 02
• 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 x 12
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
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

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.

– 59 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 3 more variables: gear <dbl>,
# carb <dbl>, name <chr>

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 x 13
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 4 more variables: am <dbl>,
# gear <dbl>, carb <dbl>, name <chr>

À l’inverse, on peut à tout moment convertir un tibble en data frame avec as.data.frame :

R> as.data.frame(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
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

– 60 –
Introduction au tidyverse

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 name
1 0 1 4 4 Mazda RX4
2 0 1 4 4 Mazda RX4 Wag
3 1 1 4 1 Datsun 710
4 1 0 3 1 Hornet 4 Drive
5 0 0 3 2 Hornet Sportabout
6 1 0 3 1 Valiant
7 0 0 3 4 Duster 360
8 1 0 4 2 Merc 240D
9 1 0 4 2 Merc 230
10 1 0 4 4 Merc 280
11 1 0 4 4 Merc 280C
12 0 0 3 3 Merc 450SE
13 0 0 3 3 Merc 450SL
14 0 0 3 3 Merc 450SLC
15 0 0 3 4 Cadillac Fleetwood
16 0 0 3 4 Lincoln Continental
17 0 0 3 4 Chrysler Imperial
18 1 1 4 1 Fiat 128
19 1 1 4 2 Honda Civic
20 1 1 4 1 Toyota Corolla
21 1 0 3 1 Toyota Corona
22 0 0 3 2 Dodge Challenger
23 0 0 3 2 AMC Javelin
24 0 0 3 4 Camaro Z28
25 0 0 3 2 Pontiac Firebird

– 61 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

26 1 1 4 1 Fiat X1-9
27 0 1 5 2 Porsche 914-2
28 1 1 5 2 Lotus Europa
29 0 1 5 4 Ford Pantera L
30 0 1 5 6 Ferrari Dino
31 0 1 5 8 Maserati Bora
32 1 1 4 2 Volvo 142E

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

R> column_to_rownames(as.data.frame(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
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

– 62 –
Introduction au tidyverse

am gear carb name


Mazda RX4 1 4 4 Mazda RX4
Mazda RX4 Wag 1 4 4 Mazda RX4 Wag
Datsun 710 1 4 1 Datsun 710
Hornet 4 Drive 0 3 1 Hornet 4 Drive
Hornet Sportabout 0 3 2 Hornet Sportabout
Valiant 0 3 1 Valiant
Duster 360 0 3 4 Duster 360
Merc 240D 0 4 2 Merc 240D
Merc 230 0 4 2 Merc 230
Merc 280 0 4 4 Merc 280
Merc 280C 0 4 4 Merc 280C
Merc 450SE 0 3 3 Merc 450SE
Merc 450SL 0 3 3 Merc 450SL
Merc 450SLC 0 3 3 Merc 450SLC
Cadillac Fleetwood 0 3 4 Cadillac Fleetwood
Lincoln Continental 0 3 4 Lincoln Continental
Chrysler Imperial 0 3 4 Chrysler Imperial
Fiat 128 1 4 1 Fiat 128
Honda Civic 1 4 2 Honda Civic
Toyota Corolla 1 4 1 Toyota Corolla
Toyota Corona 0 3 1 Toyota Corona
Dodge Challenger 0 3 2 Dodge Challenger
AMC Javelin 0 3 2 AMC Javelin
Camaro Z28 0 3 4 Camaro Z28
Pontiac Firebird 0 3 2 Pontiac Firebird
Fiat X1-9 1 4 1 Fiat X1-9
Porsche 914-2 1 5 2 Porsche 914-2
Lotus Europa 1 5 2 Lotus Europa
Ford Pantera L 1 5 4 Ford Pantera L
Ferrari Dino 1 5 6 Ferrari Dino
Maserati Bora 1 5 8 Maserati Bora
Volvo 142E 1 4 2 Volvo 142E

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.

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

Nous allons reprendre plusieurs éléments de base du langage R que nous avons déjà abordé mais de
manière plus formelle. Une bonne compréhension des bases du langage, bien qu’un peu ardue de prime
abord, permets de comprendre le sens des commandes que l’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 85.

– 65 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Présentation des vecteurs


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

• les vecteurs sont unidimensionnels (i.e. c’est un objet à 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 caratè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 :

R> class(3)

[1] "numeric"

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

– 66 –
Vecteurs, indexation et assignation

R> class(3L)

[1] "integer"

Au quotidien, il arrive rarement d’avoir à utiliser ce suffixe, mais il est tonjour 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 que l’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

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 :

– 67 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Classe R Type

factor facteur, page 105

labelled vecteur labellisé, page 111

Date date, page 255

POSIXct date et heure, page 255

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"

R> class(sexe)

[1] "character"

– 68 –
Vecteurs, indexation et assignation

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 du même type. Dès lors, si l’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 longeur mais dont
toutes les valeurs sont identiques. Cela se réalise facilement avec rep à qui l’on indiquera la valeur à
répéter puis le nombre de répétitions :

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 :

– 69 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 l’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

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

– 70 –
Vecteurs, indexation et assignation

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 aux nombres de valeurs qui le compose. Elle
s’obtient avec length :

R> length(taille)

[1] 4

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

[1] 2

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

– 71 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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
• month.name : les noms des 12 mois de l’année en anglais
• month.abb : la version abrégée des 12 mois en anglais
• pi : la constante mathématique p

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

R> month.name

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


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

– 72 –
Vecteurs, indexation et assignation

R> month.abb

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

R> length(month.abb)

[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

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


length(y)

[1] 6

– 73 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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
Lorsque l’on travaille avec des données d’enquêtes, 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
dystonctionnement 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.

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 longeur du vecteur.

– 74 –
Vecteurs, indexation et assignation

R> length(taille)

[1] 6

Il ne faut pas confondre NA avec un autre objet que l’on rencontre sous R et appelé NULL qui représente
l’«objet vide». NULL ne contient absolument rien du tout. La différence se comprends mieux lorsque que
l’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.

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 que l’on
souhaite garder ou non.

– 75 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 :

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

– 76 –
Vecteurs, indexation et assignation

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 l’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és. 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, Marie = "f")

Lorsque l’on affiche le vecteur, la présentation change quelque peu.

R> sexe

Michel Anne Dominique Jean Claude Marie


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

La liste des noms s’obient 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 :

– 77 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 tout 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
é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».

– 78 –
Vecteurs, indexation et assignation

Indexation par condition


L’indexation par condition consiste à fournir un vecteur logique indiquant si chaque élément doit être inclu
(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 que l’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 :

– 79 –
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 :

– 80 –
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 is.na :

R> is.na(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 :

– 81 –
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 lorsque l’on a des valeurs manquantes de les exclure ainsi :

R> poids[taille > 1.8 & !is.na(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 775.

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 :

– 82 –
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

– 83 –
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 175).

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 permets de connaître le type de vecteur et la fonction length sa longueur,
c’est-à-dire le nombre d’éléments du vecteur.
• 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 da sa création ou avec
la fonction names .
• L’indexation consiste à extraire certains éléments d’un vecteur. Pour cela, on indique ce que l’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ésent la position
dans le vecteur des éléments que l’on souhaite extraire. Un nombre négatif s’interprète comme
«tous les éléments sauf celui-là».
• Si l’on indique des chaînes de caractères, c’est l’indexation par nom : on indique le nom des
éléments que l’on souhaite extraire. Cette forme d’indexation ne fonctionne que si le vecteur
est nommé.
• Si l’on transmets 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 ( <- ).

– 84 –
Listes et Tableaux de
données
Listes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Propriétés et création . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
Indexation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Tableaux de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Propriétés et création . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92
Indexation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
Afficher les données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
En résumé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103

NOTE

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

Listes
Par nature, les vecteurs ne peuvent contenir que des valeurs de même type (numériques, textuels 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 :

– 85 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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éée une liste l1 composée de deux
élements : un vecteur d’entiers de longeur 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ées et les noms des éléments d’une liste accessibles avec
names :

R> l2 <- list(minuscules = letters, majuscules = LETTERS, mois = month.name)


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"

$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

– 86 –
Listes et Tableaux de données

R> names(l2)

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

Que se passe-t-il maintenant si l’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

Et bien non ! Elle est de longeur 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 l’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" ...
..$ majuscules: chr [1:26] "A" "B" "C" "D" ...
..$ mois : chr [1:12] "January" "February" "March" "April" ...

Une liste peut contenir tout type 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

– 87 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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
[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

– 88 –
Listes et Tableaux de données

$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"
[5] "May" "June" "July" "August"
[9] "September" "October" "November" "December"

Même si l’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 :

– 89 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> mean(l[1])

Warning in mean.default(l[1]): argument is not numeric or


logical: returning 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
que l’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 :

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"

– 90 –
Listes et Tableaux de données

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. Que l’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]]
[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"

– 91 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 33, 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éficiques :

• 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 que l’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 data.frame :

R> df <- data.frame(sexe = c("f", "f", "h", "h"), age = c(52, 31,
29, 35), blond = c(FALSE, TRUE, TRUE, FALSE))
df

R> str(df)

'data.frame': 4 obs. of 3 variables:


$ sexe : Factor w/ 2 levels "f","h": 1 1 2 2
$ age : num 52 31 29 35
$ blond: logi FALSE TRUE TRUE FALSE

La fonction data.frame a un gros défaut : si on ne désactive pas l’option stringsAsFactors elle


transforme 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 105).

R> df <- data.frame(sexe = c("f", "f", "h", "h"), age = c(52, 31,
29, 35), blond = c(FALSE, TRUE, TRUE, FALSE), stringsAsFactors = FALSE)
df

– 92 –
Listes et Tableaux de données

R> str(df)

'data.frame': 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

R> names(df)

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

Comme tous les éléments d’un tableau de données ont la même longeur, 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 row.names :

– 93 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> row.names(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]

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.

– 94 –
Listes et Tableaux de données

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

[1] 29

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

[1] 29

R> df[3, "age"]

[1] 29

R> df["Michael", 2]

[1] 29

Il est également possible de ne préciser qu’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 suffit de laisser un espace vide avant ou après la virgule. ATTENTION ! Il est cependant impératif
de laisser la virgule pour indiquer à R que l’on souhaite effectuer une indexation à deux dimensions. Si
l’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]

– 95 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

NOTE

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

R> str(df[2, ])

'data.frame': 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])

'data.frame': 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 que l’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’occurence 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
longeur quatre. Reste df[, 2] qui signifie renvoie toutes les observations pour la seconde colonne.
Or l’indexation bidimensionnelle a un fonctionnement un peu particulier : par défaut cela renvoie
un tableau de données mais s’il n’y a qu’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 [.data.frame .

Afficher les données


Prenons un tableau de données un peu plus conséquent, en l’occurence un jeu de données disponible dans

– 96 –
Listes et Tableaux de données

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 l’on demande à 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 que l’on peut appeller
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 205, 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)

Observations: 2,000
Variables: 20
$ id <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11...
$ age <int> 28, 23, 59, 34, 71, 35, 60, 47, 2...
$ sexe <fct> Femme, Femme, Homme, Homme, Femme...
$ nivetud <fct> "Enseignement superieur y compris...
$ poids <dbl> 2634.3982, 9738.3958, 3994.1025, ...
$ occup <fct> "Exerce une profession", "Etudian...
$ qualif <fct> Employe, NA, Technicien, Technici...
$ freres.soeurs <int> 8, 2, 2, 1, 0, 5, 1, 5, 4, 2, 3, ...
$ clso <fct> Oui, Oui, Non, Non, Oui, Non, Oui...
$ relig <fct> Ni croyance ni appartenance, Ni c...
$ trav.imp <fct> Peu important, NA, Aussi importan...
$ trav.satisf <fct> Insatisfaction, NA, Equilibre, Sa...
$ hard.rock <fct> Non, Non, Non, Non, Non, Non, Non...

– 97 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

$ lecture.bd <fct> Non, Non, Non, Non, Non, Non, Non...


$ peche.chasse <fct> Non, Non, Non, Non, Non, Non, Oui...
$ cuisine <fct> Oui, Non, Non, Oui, Non, Non, Oui...
$ bricol <fct> Non, Non, Non, Oui, Non, Non, Non...
$ cinema <fct> Non, Oui, Non, Oui, Non, Oui, Non...
$ sport <fct> Non, Oui, Oui, Oui, Non, Oui, Non...
$ heures.tv <dbl> 0.0, 1.0, 0.0, 2.0, 3.0, 2.0, 2.9...

L’extension questionr propose une fonction lookfor qui permet de lister les différentes variables d’un
fichier de données :

R> lookfor(d)

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 à lookfor un mot-clé pour limiter la recherche. Par
exemple :

R> lookfor(d, "trav")

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

– 98 –
Listes et Tableaux de données

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 freres.soeurs
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

trav.imp trav.satisf
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

hard.rock lecture.bd peche.chasse cuisine bricol


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

cinema sport heures.tv


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

– 99 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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

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)

[2000 obs. x 20 variables] tbl_df tbl data.frame

$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
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

– 100 –
Listes et Tableaux de données

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" "Exerc
e 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%)

$freres.soeurs:
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" "N
i croyance ni appartenance" "Appartenance sans pratique" "Ni croyance ni apparte
nance" "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%)

$trav.imp:
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 qu
e le reste | Peu important
NAs: 952 (47.6%)

– 101 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

$trav.satisf:
nominal factor: "Insatisfaction" NA "Equilibre" "Satisfaction" NA "Equilibre" N
A "Insatisfaction" NA "Satisfaction" ...
3 levels: Satisfaction | Insatisfaction | Equilibre
NAs: 952 (47.6%)

$hard.rock:
nominal factor: "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" ...
2 levels: Non | Oui
NAs: 0 (0%)

$lecture.bd:
nominal factor: "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" ...
2 levels: Non | Oui
NAs: 0 (0%)

$peche.chasse:
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%)

$heures.tv:
numeric: 0 1 0 2 3 2 2.9 1 2 2 ...
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

– 102 –
Listes et Tableaux de données

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.

R> describe(d, "age", "trav.satisf")

[2000 obs. x 20 variables] tbl_df tbl data.frame

$age:
integer: 28 23 59 34 71 35 60 47 20 28 ...
min: 18 - max: 97 - NAs: 0 (0%) - 78 unique values

$trav.satisf:
nominal factor: "Insatisfaction" NA "Equilibre" "Satisfaction" NA "Equilibre" N
A "Insatisfaction" NA "Satisfaction" ...
3 levels: Satisfaction | Insatisfaction | Equilibre
NAs: 952 (47.6%)

On peut également transmettre juste une variable :

R> describe(d$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
Total 2000 100

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 que l’obtient avec length .
• On créé une liste avec list et on peut fusionner des listes avec append .

– 103 –
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 que l’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 data.frame .
• Les tableaux de données correspondent aux fichiers de données que l’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 renvoit 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 ( , ).

– 104 –
Facteurs et vecteurs
labellisés
Facteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Vecteurs labellisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Les étiquettes de variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112
Les étiquettes de valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Assignation et condition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Quelques fonctions supplémentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121

Dans le chapire sur les vecteurs, page 65, 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
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 133) 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.

– 105 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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

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

R> str(d)

'data.frame': 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 ...
$ freres.soeurs: 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 ...
$ trav.imp : Factor w/ 4 levels "Le plus important",..: 4 NA 2 3 NA 1 NA 4
NA 3 ...
$ trav.satisf : Factor w/ 3 levels "Satisfaction",..: 2 NA 3 1 NA 3 NA 2 NA 1
...
$ hard.rock : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
$ lecture.bd : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
$ peche.chasse : 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 ...
$ heures.tv : 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 :

– 106 –
Facteurs et vecteurs labellisés

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, : invalid factor level, NA generated

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 :

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 :

– 107 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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
58

– 108 –
Facteurs et vecteurs labellisés

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.

On peut également modifier les niveaux eux-mêmes. Imaginons que l’on souhaite créer une nouvelle
variable qualif.abr contenant les noms abrégés des catégories socioprofessionnelles de qualif. On peut

– 109 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

alors procéder comme suit :

R> d$qualif.abr <- 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$qualif.abr)

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$qualif.abr)

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

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 175.

À 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 :

– 110 –
Facteurs et vecteurs labellisés

R> summary(d$trav.satisf)

Satisfaction Insatisfaction Equilibre NA's


480 117 451 952

R> summary(addNA(d$trav.satisf))

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$trav.satisf, "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 133) 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
labellisées.

– 111 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 lookfor et describe de l’extension questionr affichent également les étiquettes de
variables lorsqu’elles existent.

R> lookfor(femmes, "rés")

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"

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 :

– 112 –
Facteurs et vecteurs labellisés

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

– 113 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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)

Observations: 2,000
Variables: 17
$ id_femme <dbl> 391, 1643, 85, 881, 1981, 1072, ...
$ id_menage <dbl> 381, 1515, 85, 844, 1797, 1015, ...
$ poids <dbl> 1.803150, 1.803150, 1.803150, 1....
$ date_entretien <date> 2012-05-05, 2012-01-23, 2012-01...
$ date_naissance <date> 1997-03-07, 1982-01-06, 1979-01...
$ age <dbl> 15, 30, 33, 43, 25, 18, 45, 23, ...
$ milieu <dbl+lbl> 2, 2, 2, 2, 2, 2, 2, 2, 2, 2...
$ region <dbl+lbl> 4, 4, 4, 4, 4, 3, 3, 3, 3, 3...
$ educ <dbl+lbl> 0, 0, 0, 0, 1, 0, 0, 0, 0, 0...
$ travail <dbl+lbl> 1, 1, 0, 1, 1, 0, 1, 0, 1, 1...
$ matri <dbl+lbl> 0, 2, 2, 2, 1, 0, 1, 1, 2, 5...
$ religion <dbl+lbl> 1, 3, 2, 3, 2, 2, 3, 1, 3, 3...
$ journal <dbl+lbl> 0, 0, 0, 0, 0, 0, 0, 0, 0, 0...
$ radio <dbl+lbl> 0, 1, 1, 0, 0, 1, 1, 0, 0, 0...
$ tv <dbl+lbl> 0, 0, 0, 0, 0, 1, 0, 0, 0, 0...
$ nb_enf_ideal <dbl+lbl> 4, 4, 4, 4, 4, 5, 10, 5, 4, ...
$ test <dbl+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 .

R> class(femmes$region)

[1] "haven_labelled"

Regardons les premières valeurs prises par cette variable.

– 114 –
Facteurs et vecteurs labellisés

R> head(femmes$region)

<Labelled double>: 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 .

R> val_labels(femmes$region)

Nord Est Sud Ouest


1 2 3 4

– 115 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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>: 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 is.numeric .

R> typeof(femmes$region)

[1] "double"

– 116 –
Facteurs et vecteurs labellisés

R> is.numeric(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 mean.default(d$nivetud): argument is not numeric


or logical: returning 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 .

R> val_label(v, "f") <- "femmes"


val_label(v, "h") <- "hommes"
v

<Labelled character>
[1] f f h f h

Labels:

– 117 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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>
[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>
[1] f f h f h

Labels:
value label
h Homme
f Femme

– 118 –
Facteurs et vecteurs labellisés

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")
[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 :

– 119 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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
1100 900

R> table(d$sexe == 1)

FALSE
2000

– 120 –
Facteurs et vecteurs labellisés

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")

FALSE
2000

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.

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 133 et le recodage de variables, page 175 (dont la conversion d’un
vecteur labellisé en facteur) seront quant à eux abordés dans les prochains chapitres.

– 121 –
Organiser ses fichiers
Le répertoire de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
Les projets dans RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124
Créer un nouveau projet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
Fonctionnement par défaut des projets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Options des projets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Naviguer d’un projet à un autre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
Voir aussi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
Appeler un script depuis un autre script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

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 133), 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).

– 123 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et 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, page 01.

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.

– 124 –
Organiser ses fichiers

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).

– 125 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et 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.

– 126 –
Organiser ses fichiers

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.

– 127 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et 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 qu’on vient de fermer ne sont plus en mémoire) ;

– 128 –
Organiser ses fichiers

• 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.
Dans ce cas là, chaque projet aura sa propre session R. Les objets chargés en mémoire pour le projet A ne

– 129 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

seront pas accessibles dans le cadre du projet B et inversement.

Voir aussi
On pourra se référer à la documentation officielle de RStudio : https://support.rstudio.com/hc/en-us/
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 :

– 130 –
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.

– 131 –
Import de données
Importer des fichiers texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Structure d’un fichier texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Interface graphique avec RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
Dans un script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Importer depuis des logiciels de statistique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
SPSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
SAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Stata . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Excel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
dBase . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Feuille de calcul Google Sheets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Données spatiales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Shapefile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Rasters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144
Connexion à des bases de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Interfaçage via l’extension DBI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Utilisation de dplyr et dbplyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146
Ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Autres sources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Sauver ses données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148

– 133 –
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 151) 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 123). 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 38 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

– 134 –
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, page 01. 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 http://larmarange.github.io/


analyse-R/data/exemple_texte_tabule.txt.

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

– 135 –
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("http://larmarange.github.io/analyse-R/data/exemple_texte_tabu
le.txt",
delim = "\t", quote = "'")

Parsed with column specification:


cols(
Sexe = col_character(),
Age = col_double(),
Taille = col_number(),
Etudes = col_character()
)

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 123.

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" "data.frame"

R> d

– 136 –
Import de données

L’objet renvoyé est un tableau de données ou data.frame. 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 205.

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
read.table , read.csv , read.csv2 , read.delim 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 http://cran.r-project.org/manuals.html. 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 ;
• 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 ;

– 137 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

• 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 111.

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 :

– 138 –
Import de données

R> library(haven)
donnees <- read_spss("data/fichier.sav", 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.

– 139 –
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 read.spss . On indiquera
à la fonction de renvoyer un tableau de données avec l’argument to.data.frame = 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 use.value.labels et use.missings .

R> library(foreign)
donnees <- read.spss("data/fichier.sav", to.data.frame = TRUE,
use.value.labels = FALSE, use.missings = FALSE)

Il est important de noter que read.spss 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 <- as.POSIXlt(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.

– 140 –
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 read.xport de l’extension
foreign. Celle-ci s’utilise très simplement, en lui passant le nom du fichier en argument :

R> library(foreign)
donnees <- read.xport("data/fichier.xpt")

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/fichier.dta")

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 .

– 141 –
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 read.dta .

L’option convert.factors 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 <- read.dta("data/fichier.dta", convert.factors = FALSE)

L’option convert.dates 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 <- as.Date(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/fichier.xlsx")

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/fichier.xlsx", sheet = 3)


donnees <- read_excel("data/fichier.xlsx", 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 .

– 142 –
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 alternative est l’extension xlsx qui propose deux fonctions différentes pour importer des fichiers
Excel : read.xlsx 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 <- read.xlsx("data/fichier.xlsx", 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 read.dbf de l’extension foreign.

R> library(foreign)
donnees <- read.dbf("data/fichier.dbf")

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 239.

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.

Données spatiales

Shapefile
Les fichiers Shapefile sont couramment utilisés pour échanger des données géoréférencées. La majorité

– 143 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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
• .shp.xml - 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 :

R> library(maptools)
donnees_spatiales <- readShapeSpatial("data/fichier.shp")

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 .

– 144 –
Import de données

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/fichier.asc")

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, http://www.gdal.org/).

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 bdd.sqlite :

R> library(DBI)
library(RSQLite)
con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "bdd.sqlite")
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 :

– 145 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> library(DBI)
library(RSQLite)
con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "bdd.sqlite")

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")

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 205. 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 :

– 146 –
Import de données

R> library(DBI)
library(RSQLite)
library(dplyr)
con <- DBI::dbConnect(RSQLite::SQLite(), dbname = "bdd.sqlite")

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 205 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.

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 :

– 147 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 :


http://cran.r-project.org/manuals.html.

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 export.RData :

– 148 –
Import de données

R> save(d, tailles, poids, file = "export.RData")

À tout moment, il sera toujours possible de recharger ces données en mémoire à l’aide de la fonction
load :

R> load("export.RData")

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 save.image 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 save.image qui sera appliquée.

R> save.image()

[1] FALSE

– 149 –
Où trouver de l’aide ?
Aide en ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Aide sur une fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
Naviguer dans l’aide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Ressources sur le Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Moteur de recherche . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
Aide en ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Ressources officielles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Ouvrages, blogs, MOOCs… . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Revue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Ressources francophones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Antisèches (cheatsheet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Où poser des questions ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
Les forums d’analyse-R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Liste R-soc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
StackOverflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Forum Web en français . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
Canaux IRC (chat) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160
Listes de discussion officielles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

NOTE

La version originale de ce chapitre a été écrite par Julien Barnier dans le cadre du support de cours
Introduction à R.

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.

– 151 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 :

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 :

– 152 –
Où trouver de l’aide ?

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 help.start permet d’afficher le sommaire de l’aide en ligne. Saisissez simplement :

R> help.start()

Si vous souhaitez rechercher quelque chose dans le contenu de l’aide, vous pouvez utiliser la fonction
help.search (ou ?? qui est équivalente) qui renvoie une liste des pages d’aide contenant les termes
recherchés.

Par exemple :

R> help.search("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.

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 :

– 153 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

http://www.rseek.org/.

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
Le site R documentation propose 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 permet notamment de
rechercher et naviguer facilement entre les pages des différentes fonctions :
http://www.rdocumentation.org/.

Ressources officielles
La documentation officielle de R est accessible en ligne depuis le site du projet :
http://www.r-project.org/.

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 :
http://cran.r-project.org/manuals.html.

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 :
http://cran.r-project.org/doc/manuals/R-intro.html.

R Data Import/Export explique notamment comment importer des données depuis d’autres logiciels :
http://cran.r-project.org/doc/manuals/R-data.html.

Ouvrages, blogs, MOOCs…

Francophones

Parmi les ressources en français, on peut citer notamment R et espace, manuel d’initiation à la

– 154 –
Où trouver de l’aide ?

programmation avec R appliqué à l’analyse de l’information géographique, librement téléchargeable en


ligne.

La très bonne Introduction à R et au tidyverse de Julien Barnier disponible sur https://juba.github.io/


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 :

• http://pbil.univ-lyon1.fr/R/

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 : https://github.com/frrrenchies/frrrenchies/.

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.

On notera également l’existence du R journal, revue en ligne consacrée à R, et qui propose régulièrement

– 155 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 (https://awesome-r.com/) qui fournit une liste d’extensions choisies
et triées par thématique et le site [R Data Science Tutorials](https://github.com/ujjwalkarn/
DataScienceR] 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 :
http://cran.r-project.org/faqs.html.

La FAQ la plus utile est la FAQ généraliste sur R :


http://cran.r-project.org/doc/FAQ/R-FAQ.html.

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 help.start 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 :
https://stat.ethz.ch/mailman/listinfo/r-announce

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 :

– 156 –
Où trouver de l’aide ?

http://journal.r-project.org/.

Autres documents

On trouvera de nombreux documents dans différentes langues, en général au format PDF, dans le
répertoire suivant :
http://cran.r-project.org/doc/contrib/.

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 :
http://cran.r-project.org/doc/contrib/Short-refcard.pdf

On notera également un document d’introduction en anglais progressif et s’appuyant sur des méthodes
statistiques relativement simples :
http://cran.r-project.org/doc/contrib/Verzani-SimpleR.pdf

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 :
http://rforsasandspssusers.com/ et http://www.statmethods.net/.

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 :
http://www.jstatsoft.org/

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 :
http://cran.r-project.org/doc/contrib/Paradis-rdebuts_fr.pdf.

La somme de documentation en français la plus importante liée à R est sans nulle doute celle mise à

– 157 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

disposition par le Pôle bioinformatique lyonnais. Leur site propose des cours complets de statistique
utilisant R :
http://pbil.univ-lyon1.fr/R/enseignement.html.

La plupart des documents sont assez pointus niveau mathématique et plutôt orientés biostatistique, mais
on trouvera des documents plus introductifs ici :
http://pbil.univ-lyon1.fr/R/html/cours1.

Dans tous les cas la somme de travail et de connaissances mise à disposition librement est
impressionnante… Enfin, le site de Vincent Zoonekynd (http://zoonek2.free.fr/UNIX/48_R_2004/
all.html) 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 https://support.rstudio.com (catégorie
Documentation disponible en milieu de page).

Antisèches (cheatsheet)
On peut trouver un peu partout sur internet des antisèches (cheatsheets en anglais) qui sont en général
un fichier PDF résumant les principales fonctions d’une extension ou d’une problématique donnée. Ces
antisèches peuvent être imprimées afin de les avoir facilement à porter de main.

Pour les trouver, il suffit d’effectuer une recherche Google avec les mots-clés R cheatsheet ou
<pkg> cheatsheet en remplacant <pkg> par le nom du package qui nous intéresse.

Certaines sont également disponibles directement dans RStudio, dans le menu Help > Cheatsheets .

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.

– 158 –
Où trouver de l’aide ?

Les forums d’analyse-R


En premier lieu (autopromotion oblige), chaque chapitre du site d’analyse-R (http://larmarange.github.io/
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é.

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 :
https://groupes.renater.fr/sympa/subscribe/r-soc.

Grâce aux services offerts par le site gmane.org, 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 :
http://dir.gmane.org/gmane.comp.lang.r.user.french.

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 :
http://stackoverflow.com/questions/tagged/r.

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 :
http://forums.cirad.fr/logiciel-R/index.php.

Les questions diverses et variées peuvent être posées dans la rubrique Questions en cours :
http://forums.cirad.fr/logiciel-R/viewforum.php?f=3.

Il est tout de même conseillé de faire une recherche rapide sur le forum avant de poser une question, pour
voir si la réponse ne s’y trouverait pas déjà.

– 159 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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
( irc.freenode.net ) 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
http://www.mibbit.com/.

Dans le champ Connect to IRC, sélectionnez Freenode.net, 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 :
https://stat.ethz.ch/mailman/listinfo/r-help.

Pour une consultation ou un envoi ponctuels, le mieux est sans doute d’utiliser les interfaces Web fournies
par gmane.org :
http://blog.gmane.org/gmane.comp.lang.r.general.

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 :
http://www.r-project.org/posting-guide.html.

Plusieurs autres listes plus spécialisées existent également, elles sont listées à l’adresse suivante :
http://www.r-project.org/mail.html.

– 160 –
Visualiser ses données
Inspection visuelle des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
summary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
str . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
glimpse (dplyr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 166
lookfor (questionr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
describe (questionr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
skim (skimr) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173
create_report (DataExplorer) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174
makeCodebook (dataMaid) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174

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(rp99)
data(fecondite)

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 :

– 161 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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).

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.

– 162 –
Visualiser ses données

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

– 163 –
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 freres.soeurs
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

trav.imp trav.satisf
Le plus important : 29 Satisfaction :480
Aussi important que le reste:259 Insatisfaction:117
Moins important que le reste:708 Equilibre :451

– 164 –
Visualiser ses données

Peu important : 52 NA's :952


NA's :952

hard.rock lecture.bd peche.chasse cuisine bricol


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

cinema sport heures.tv


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)

'data.frame': 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 ...
$ freres.soeurs: 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 ...

– 165 –
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 ...
$ trav.imp : Factor w/ 4 levels "Le plus important",..: 4 NA 2 3 NA 1 NA 4
NA 3 ...
$ trav.satisf : Factor w/ 3 levels "Satisfaction",..: 2 NA 3 1 NA 3 NA 2 NA 1
...
$ hard.rock : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
$ lecture.bd : Factor w/ 2 levels "Non","Oui": 1 1 1 1 1 1 1 1 1 1 ...
$ peche.chasse : 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 ...
$ heures.tv : 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 205), 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)

Observations: 2,000
Variables: 20
$ id <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11...
$ age <int> 28, 23, 59, 34, 71, 35, 60, 47, 2...
$ sexe <fct> Femme, Femme, Homme, Homme, Femme...
$ nivetud <fct> "Enseignement superieur y compris...
$ poids <dbl> 2634.3982, 9738.3958, 3994.1025, ...
$ occup <fct> "Exerce une profession", "Etudian...
$ qualif <fct> Employe, NA, Technicien, Technici...
$ freres.soeurs <int> 8, 2, 2, 1, 0, 5, 1, 5, 4, 2, 3, ...

– 166 –
Visualiser ses données

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


$ relig <fct> Ni croyance ni appartenance, Ni c...
$ trav.imp <fct> Peu important, NA, Aussi importan...
$ trav.satisf <fct> Insatisfaction, NA, Equilibre, Sa...
$ hard.rock <fct> Non, Non, Non, Non, Non, Non, Non...
$ lecture.bd <fct> Non, Non, Non, Non, Non, Non, Non...
$ peche.chasse <fct> Non, Non, Non, Non, Non, Non, Oui...
$ cuisine <fct> Oui, Non, Non, Oui, Non, Non, Oui...
$ bricol <fct> Non, Non, Non, Oui, Non, Non, Non...
$ cinema <fct> Non, Oui, Non, Oui, Non, Oui, Non...
$ sport <fct> Non, Oui, Oui, Oui, Non, Oui, Non...
$ heures.tv <dbl> 0.0, 1.0, 0.0, 2.0, 3.0, 2.0, 2.9...

lookfor (questionr)
L’extension questionr propose une fonction lookfor , inspirée de Stata, qui permet de lister les
différentes variables d’un fichier de données :

R> lookfor(hdv2003)

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 à lookfor un mot-clé pour limiter la recherche. Par
exemple :

R> lookfor(hdv2003, "trav")

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 lookfor 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> lookfor(femmes, "rés")

R> lookfor(femmes, "rés", "nb")

Enfin, il est possible d’afficher plus de détails avec l’option detailed = TRUE .

R> lookfor(femmes, "rés", details = TRUE)

À noter, le résultats renvoyé par lookfor est un tableau de données qui peut ensuite être aisément

– 167 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

manipulé.

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 data.frame

$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
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

– 168 –
Visualiser ses données

n" "Exerce une profession" "Retraite" "Exerce une profession" "Au foyer" "Exerc
e 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%)

$freres.soeurs:
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" "N
i croyance ni appartenance" "Appartenance sans pratique" "Ni croyance ni apparte
nance" "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%)

$trav.imp:
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 qu
e le reste | Peu important
NAs: 952 (47.6%)

$trav.satisf:
nominal factor: "Insatisfaction" NA "Equilibre" "Satisfaction" NA "Equilibre" N
A "Insatisfaction" NA "Satisfaction" ...
3 levels: Satisfaction | Insatisfaction | Equilibre
NAs: 952 (47.6%)

$hard.rock:
nominal factor: "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" ...

– 169 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

2 levels: Non | Oui


NAs: 0 (0%)

$lecture.bd:
nominal factor: "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" "Non" ...
2 levels: Non | Oui
NAs: 0 (0%)

$peche.chasse:
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%)

$heures.tv:
numeric: 0 1 0 2 3 2 2.9 1 2 2 ...
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 ).

– 170 –
Visualiser ses données

R> describe(hdv2003, "age", "trav")

[2000 obs. x 20 variables] tbl_df tbl data.frame

$age:
integer: 28 23 59 34 71 35 60 47 20 28 ...
min: 18 - max: 97 - NAs: 0 (0%) - 78 unique values

$trav.imp:
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 qu
e le reste | Peu important
NAs: 952 (47.6%)

$trav.satisf:
nominal factor: "Insatisfaction" NA "Equilibre" "Satisfaction" NA "Equilibre" N
A "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
Total 2000 100

Enfin, describe est également compatible avec les vecteurs labellisés, page 105.

R> describe(femmes, "milieu")

[2000 obs. x 17 variables] tbl_df tbl data.frame

– 171 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

$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 freq.n.max permets d’indiquer le nombre de modalités en-dessous duquel


describe renverra également un tri à plat de la variable.

R> describe(menages, freq.n.max = 6)

[1814 obs. x 5 variables] tbl_df tbl data.frame

$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é

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

– 172 –
Visualiser ses données

$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

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.

R> library(skimr)
skim(hdv2003$cuisine)

R> skim(hdv2003)

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"))

Le support des vecteurs labellisés est encore en cours d’intégration.

R> skim(menages)

Warning: No summary functions for vectors of class: haven_labelled.


Coercing to character

Warning: No summary functions for vectors of class: haven_labelled.


Coercing to character

– 173 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Warning: No summary functions for vectors of class: haven_labelled.


Coercing to character

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 http://larmarange.github.io/analyse-R/data/


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 https://cran.r-project.org/web/packages/DataExplorer/vignettes/
dataexplorer-intro.html.

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 cliquez sur ce lien pour voir le PDF produit par dataMaid.

– 174 –
Recodage de variables
Renommer des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
Convertir une variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177
Variable numérique ou textuelle en facteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Conversion d’un facteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
Conversion d’un vecteur labellisé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Découper une variable numérique en classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
Regrouper les modalités d’une variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
Variables calculées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Combiner plusieurs variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
Variables scores . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Vérification des recodages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Facteurs et forcats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Modifier les modalités d’une variable qualitative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
Ordonner les modalités d’une variable qualitative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198
Combiner plusieurs variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Recodage et data.table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

NOTE

La version originale de ce chapitre a été écrite par Julien Barnier dans le cadre du support de cours
Introduction à R.

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 :

– 175 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 (data.frame) à l’aide de la fonction names :

R> names(d)

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


[4] "nivetud" "poids" "occup"
[7] "qualif" "freres.soeurs" "clso"
[10] "relig" "trav.imp" "trav.satisf"
[13] "hard.rock" "lecture.bd" "peche.chasse"
[16] "cuisine" "bricol" "cinema"
[19] "sport" "heures.tv"

Cette fonction 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 :

– 176 –
Recodage de variables

R> d.maj <- d


names(d.maj) <- c("ID", "AGE", "SEXE", "NIVETUD", "POIDS", "OCCUP",
"QUALIF", "FRERES.SOEURS", "CLSO", "RELIG", "TRAV.IMP", "TRAV.SATISF",
"HARD.ROCK", "LECTURE.BD", "PECHE.CHASSE", "CUISINE", "BRICOL",
"CINEMA", "SPORT", "HEURES.TV")
summary(d.maj$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",


"freres.soeurs", "clso", "relig", "trav.imp", "trav.satisf",
"hard.rock", "lecture.bd", "peche.chasse", "cuisine", "bricol",
"cinema", "sport", "heures.tv")

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 rename.variable
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 :

R> d <- rename.variable(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.

– 177 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Variable numérique ou textuelle en facteur


Par exemple, on peut considérer que la variable numérique freres.soeurs 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$fs.fac <- factor(d$freres.soeurs)


levels(d$fs.fac)

[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 as.character :

R> d$fs.char <- as.character(d$freres.soeurs)


d$qualif.char <- as.character(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
commandes suivantes génère un message d’avertissement, tandis que les deux autres fonctionnent :

R> d.temp <- d


d.temp$qualif[d.temp$qualif == "Ouvrier specialise"] <- "Ouvrier"

Warning in `[<-.factor`(`*tmp*`, d.temp$qualif == "Ouvrier


specialise", : invalid factor level, NA generated

R> d$qualif.char <- as.character(d$qualif)


d$qualif.char[d$qualif.char == "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

– 178 –
Recodage de variables

variable numérique avec la fonction as.numeric .

R> v <- c("1", "3.1415", "4", "5.6", "1", "4")


v

[1] "1" "3.1415" "4" "5.6" "1" "4"

R> as.numeric(v)

[1] 1.0000 3.1415 4.0000 5.6000 1.0000 4.0000

I M P O R TA N T

Lorsque l’on convertit un facteur avec as.numeric , 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> as.numeric(vf)

[1] 1 2 3 4 1 3

R> as.numeric(as.character(vf))

[1] 1.0000 3.1415 4.0000 5.6000 1.0000 4.0000

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.

– 179 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Conversion d’un vecteur labellisé


Nous avons abordé dans un chapitre précédent, page 111 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. Il est très facile de convertir ubn
vecteur labellisé en facteur à l’aide la fonction to_factor de l’extension labelled1, page 01.

R> library(labelled)
v <- labelled(c(1, 2, 9, 3, 3, 2, NA), c(oui = 1, `peut-être` = 2,
non = 3, `ne sait pas` = 9))
v

<Labelled double>
[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.

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.

– 180 –
Recodage de variables

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

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.

– 181 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 ;
• include.lowest et right influent sur la manière dont les valeurs situées à la frontière des
classes seront inclues ou exclues ;
• dig.lab 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 :

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 :

– 182 –
Recodage de variables

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 include.lowest=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), include.lowest = TRUE)
table(d$age20)

[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,
include.lowest = TRUE)
table(d$age20)

[18,20) [20,40) [40,60) [60,80) [80,97]


48 643 793 454 62

– 183 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> d$age20 <- cut(d$age, c(18, 20, 40, 60, 80, 97), include.lowest = 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

– 184 –
Recodage de variables

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 quant.cut permettant de découper une variable

– 185 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 <- quant.cut(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

quant.cut admet les mêmes autres options que cut ( include.lowest , 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 qualif.reg 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

– 186 –
Recodage de variables

R> d$qualif.reg[d$qualif == "Ouvrier specialise"] <- "Ouvrier"


d$qualif.reg[d$qualif == "Ouvrier qualifie"] <- "Ouvrier"
d$qualif.reg[d$qualif == "Employe"] <- "Employe"
d$qualif.reg[d$qualif == "Profession intermediaire"] <- "Intermediaire"
d$qualif.reg[d$qualif == "Technicien"] <- "Intermediaire"
d$qualif.reg[d$qualif == "Cadre"] <- "Cadre"
d$qualif.reg[d$qualif == "Autre"] <- "Autre"
table(d$qualif.reg)

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 qualif.reg, 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
as.character :

R> d$qualif.reg <- as.character(d$qualif)


d$qualif.reg[d$qualif == "Ouvrier specialise"] <- "Ouvrier"
d$qualif.reg[d$qualif == "Ouvrier qualifie"] <- "Ouvrier"
d$qualif.reg[d$qualif == "Profession intermediaire"] <- "Intermediaire"
d$qualif.reg[d$qualif == "Technicien"] <- "Intermediaire"
table(d$qualif.reg)

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 ( | ) :

R> d$qualif.reg <- as.character(d$qualif)


d$qualif.reg[d$qualif == "Ouvrier specialise" | d$qualif == "Ouvrier qualifi
e"] <- "Ouvrier"
d$qualif.reg[d$qualif == "Profession intermediaire" | d$qualif ==
"Technicien"] <- "Intermediaire"
table(d$qualif.reg)

Autre Cadre Employe Intermediaire

– 187 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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$qualif.reg <- as.character(d$qualif)


d$qualif.reg[d$qualif %in% c("Ouvrier specialise", "Ouvrier qualifie")] <- "Ou
vrier"
d$qualif.reg[d$qualif %in% c("Profession intermediaire", "Technicien")] <- "In
termediaire"
table(d$qualif.reg)

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$qualif.reg <- factor(d$qualif.reg)

Si on souhaite recoder les valeurs manquantes, il suffit de faire appel à la fonction is.na :

R> table(d$trav.satisf)

Satisfaction Insatisfaction Equilibre


480 117 451

R> d$trav.satisf.reg <- as.character(d$trav.satisf)


d$trav.satisf.reg[is.na(d$trav.satisf)] <- "Manquant"
table(d$trav.satisf.reg)

Equilibre Insatisfaction Manquant Satisfaction


451 117 952 480

– 188 –
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

– 189 –
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.

– 190 –
Recodage de variables

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)
describe(femmes$educ)

[2000 obs.] Niveau d'éducation


labelled double: 0 0 0 0 1 0 0 0 0 0 ...
min: 0 - max: 3 - NAs: 0 (0%) - 4 unique values
4 value labels: [0] aucun [1] primaire [2] secondaire [3] supérieur

n %
[0] aucun 1138 56.9
[1] primaire 460 23.0
[2] secondaire 348 17.4
[3] supérieur 54 2.7
Total 2000 100.0

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)
describe(femmes$educ2)

[2000 obs.] A atteint un niveau secondaire ou supérieur ?


labelled double: 0 0 0 0 0 0 0 0 0 0 ...
min: 0 - max: 1 - NAs: 0 (0%) - 2 unique values
2 value labels: [0] non [1] oui

n %
[0] non 1598 79.9
[1] oui 402 20.1
Total 2000 100.0

– 191 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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$heures.tv, na.rm = TRUE)

[1] 0 12

R> mean(d$heures.tv, na.rm = TRUE)

[1] 2.246566

R> d$ecart.heures.tv <- d$heures.tv - mean(d$heures.tv, na.rm = TRUE)


range(d$ecart.heures.tv, na.rm = TRUE)

[1] -2.246566 9.753434

R> mean(d$ecart.heures.tv, na.rm = TRUE)

[1] 4.714578e-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 pop.act par la population totale pop.tot.

R> data("rp99")
rp99$part.actifs <- rp99$pop.act/rp99$pop.tot * 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

– 192 –
Recodage de variables

rigoureuse.

On peut ainsi vouloir combiner plusieurs variables qualitatives en une seule :

R> d$act.manuelles <- NA


d$act.manuelles[d$cuisine == "Oui" & d$bricol == "Oui"] <- "Cuisine et Bricola
ge"
d$act.manuelles[d$cuisine == "Oui" & d$bricol == "Non"] <- "Cuisine seulement"
d$act.manuelles[d$cuisine == "Non" & d$bricol == "Oui"] <- "Bricolage seulemen
t"
d$act.manuelles[d$cuisine == "Non" & d$bricol == "Non"] <- "Ni cuisine ni bric
olage"
table(d$act.manuelles)

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$age.sexe <- NA


d$age.sexe[d$sexe == "Homme" & d$age < 40] <- "Homme moins de 40 ans"
d$age.sexe[d$sexe == "Homme" & d$age >= 40] <- "Homme plus de 40 ans"
d$age.sexe[d$sexe == "Femme" & d$age < 40] <- "Femme moins de 40 ans"
d$age.sexe[d$sexe == "Femme" & d$age >= 40] <- "Femme plus de 40 ans"
table(d$age.sexe)

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.

– 193 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> d$age20.sexe <- interaction(d$sexe, d$age20)


table(d$age20.sexe)

Homme.<20ans Femme.<20ans Homme.21-40 ans


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$score.ext <- 0


d$score.ext[d$cinema == "Oui"] <- d$score.ext[d$cinema == "Oui"] +
10
d$score.ext[d$peche.chasse == "Oui"] <- d$score.ext[d$peche.chasse ==
"Oui"] + 30
d$score.ext[d$sport == "Oui"] <- d$score.ext[d$sport == "Oui"] +
20
table(d$score.ext)

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.

– 194 –
Recodage de variables

R> d$score.ext <- 0


d$score.ext <- ifelse(d$cinema == "Oui", 10, 0) + ifelse(d$peche.chasse ==
"Oui", 30, 0) + ifelse(d$sport == "Oui", 20, 0)
table(d$score.ext)

0 10 20 30 40 50 60
800 342 229 509 31 41 48

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$act.manuelles <- NA


d$act.manuelles[d$cuisine == "Oui" & d$bricol == "Oui"] <- "Cuisine et Bricola
ge"
d$act.manuelles[d$cuisine == "Oui" & d$bricol == "Non"] <- "Cuisine seulement"
d$act.manuelles[d$cuisine == "Non" & d$bricol == "Oui"] <- "Bricolage seulemen
t"
d$act.manuelles[d$cuisine == "Non" & d$bricol == "Non"] <- "Ni cuisine ni bric
olage"
table(d$act.manuelles, 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$act.manuelles, d$bricol)

– 195 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Non Oui
Bricolage seulement 0 437
Cuisine et Bricolage 0 416
Cuisine seulement 465 0
Ni cuisine ni bricolage 682 0

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)

– 196 –
Recodage de variables

R> hdv2003$qualif5 <- fct_recode(hdv2003$qualif, Ouvrier = "Ouvrier specialise",


Ouvrier = "Ouvrier qualifie", Interm = "Technicien", Interm = "Profession in
termediaire")

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 :

R> hdv2003$qualif_rec <- fct_collapse(hdv2003$qualif, Ouvrier = c("Ouvrier specia


lise",
"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” :

– 197 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> hdv2003$qualif_rec <- fct_other(hdv2003$qualif, drop = c("Ouvrier specialis


e",
"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 interme


diaire",
"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 :

– 198 –
Recodage de variables

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.

– 199 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 205).

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.

Voici un exemple simple :

– 200 –
Recodage de variables

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.

– 201 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 data.table
Nous aborderons dans un prochain chapitre, page 221 l’extension data.table 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.

– 202 –
Recodage de variables

R> library(data.table)
dt <- data.table(hdv2003)

dt[, score.ext := 0]
dt[cinema == "Oui", score.ext := score.ext + 10]
dt[peche.chasse == "Oui", score.ext := score.ext + 30]
dt[sport == "Oui", score.ext := score.ext + 20]
table(dt$score.ext)

0 10 20 30 40 50 60
800 342 229 509 31 41 48

R> dt[cuisine == "Oui" & bricol == "Oui", act.manuelles := "Cuisine et Bricolag


e"]
dt[cuisine == "Oui" & bricol == "Non", act.manuelles := "Cuisine seulement"]
dt[cuisine == "Non" & bricol == "Oui", act.manuelles := "Bricolage seulement"]
dt[cuisine == "Non" & bricol == "Non", act.manuelles := "Ni cuisine ni bricola
ge"]
table(dt$act.manuelles)

Bricolage seulement Cuisine et Bricolage


437 416
Cuisine seulement Ni cuisine ni bricolage
465 682

– 203 –
Manipuler les données avec
dplyr
Préparation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Les verbes de dplyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
slice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
filter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207
select et rename . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
arrange . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
mutate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
Enchaîner les opérations avec le «pipe» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
Opérations groupées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
group_by . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
summarise et count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Grouper selon plusieurs variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Autres fonctions utiles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
sample_n et sample_frac . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
lead et lag . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
tally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
distinct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
Ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219
dplyr et data.table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
dplyr et survey . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220

NOTE

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

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.

– 205 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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, page 01.

dplyr part du principe que les données sont tidy (voir la section consacrée aux tidy data, page 58). Les
fonctions de l’extension peuvent s’appliquer à des tableaux de type data.frame ou tibble , et elles
retournent systématiquement un tibble (voir la section dédiée, page 59).

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

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 data.frame , avec justes quelques
différentes :

• leur classe est c("tbl_df", "tbf", "data.frame") ;


• 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

1. Elles sont cependant moins rapides que les fonctions de data.table, voir le chapitre dédié, page 221

– 206 –
Manipuler les données avec dplyr

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)

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 :

– 207 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 et rename
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
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, page 02 :

R> select(flights, year:day)

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

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.

– 208 –
Manipuler les données avec dplyr

faire passer la colonne name en première position de la table airports , on peut faire :

R> select(airports, name, everything())

Une variante de select est rename 3, page 03, 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> 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 <- 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> arrange(flights, dep_delay)

On peut trier selon plusieurs colonnes. Par exemple selon le mois, puis selon le retard au départ :

R> arrange(flights, month, dep_delay)

Si on veut trier selon une colonne par ordre décroissant, on lui applique la fonction desc() :

R> arrange(flights, desc(dep_delay))

Combiné avec slice , arrange permet par exemple de sélectionner les trois vols ayant eu le plus de
retard :

3. Il est également possible de renommer des colonnes directement avec select , avec la même syntaxe que pour
rename .

– 209 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> tmp <- arrange(flights, desc(dep_delay))


slice(tmp, 1:3)

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 175 : 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 .

– 210 –
Manipuler les données avec dplyr

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»


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 :

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

– 211 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

réellement besoin.

Pour simplifier et améliorer encore la lisibilité du code, on va utiliser un nouvel opérateur, baptisé pipe4,
page 04. 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 :

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.

4. Le pipe a été introduit à l’origine par l’extension magrittr, et repris par dplyr

– 212 –
Manipuler les données avec dplyr

É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.

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 :

– 213 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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, na.rm = 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, na.rm = TRUE))

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 :

– 214 –
Manipuler les données avec dplyr

R> flights %>%


group_by(month) %>%
arrange(desc(dep_delay))

R> flights %>%


group_by(month) %>%
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 %>%


summarise(retard_dep = mean(dep_delay, na.rm=TRUE),
retard_arr = mean(arr_delay, na.rm=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) %>%
summarise(max_delay = max(dep_delay, na.rm=TRUE),
min_delay = min(dep_delay, na.rm=TRUE),
mean_delay = mean(dep_delay, na.rm=TRUE))

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) %>%
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 :

– 215 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> flights %>%


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) %>%
summarise(nb = n()) %>%
arrange(desc(nb))

On peut également compter selon plusieurs variables :

R> flights %>%


count(origin, dest) %>%
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 :

R> flights %>%


group_by(month, origin, dest) %>%
summarise(nb = n()) %>%
group_by(month) %>%
filter(nb == max(nb))

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) %>%
summarise(nb = n())

Cela peut permettre “d’enchaîner” les opérations groupées. Dans l’exemple suivant on calcule le

– 216 –
Manipuler les données avec dplyr

pourcentage des trajets pour chaque destination par rapport à tous les trajets du mois :

R> flights %>%


group_by(month, dest) %>%
summarise(nb = n()) %>%
mutate(pourcentage = nb / sum(nb) * 100)

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 :

R> flights %>%


group_by(month, dest) %>%
summarise(nb = n()) %>%
ungroup() %>%
mutate(pourcentage = nb / sum(nb) * 100)

À noter que count , par contre, renvoit un tableau non groupé :

R> flights %>%


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.

– 217 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 ).

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)) :

– 218 –
Manipuler les données avec dplyr

R> flights %>%


group_by(month, origin, dest) %>%
tally %>%
tally

Using `n` as weighting variable

distinct
distinct filtre les lignes du tableau pour ne conserver que les lignes distinctes, en supprimant toutes
les lignes en double.

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)

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.

– 219 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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.

Enfin, on trouvera des exercices dans l’Introduction à R et au tidyverse de Julien Barnier.

dplyr et data.table
Pour ceux travaillant également avec l’extension data.table, il est possible de concilier tibble et data.table
avec l’extension dtplyr et sa fonction tbl_dt .

R> library(dtplyr)
iris_dt <- tbl_dt(iris)
class(iris_dt)

[1] "tbl_dt" "tbl" "data.table" "data.frame"

Le tableau de données est à la fois compatible avec data.table (et notamment sa syntaxe particulière des
crochets) et les verbes de dplyr.

Pour décrouvrir data.table, voir le chapitre dédié, page 221.

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 :
https://cran.r-project.org/web/packages/srvyr/vignettes/srvyr-vs-survey.html.

– 220 –
Manipulations avancées
avec data.table
Convertir un data.frame en data.table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
setDT et setDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
dplyr et data.table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
La syntaxe des crochets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Sélectionner des observations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Sélectionner des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
Grouper les résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Ajouter / Modifier / Supprimer une variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Enchaîner les opérations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226

L’extension data.table 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 data.table, voir
https://www.datacamp.com/courses/data-table-data-manipulation-r-tutorial. On pourra aussi se référer
à la vignette officielle https://cran.r-project.org/web/packages/data.table/vignettes/datatable-
intro.html.

– 221 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Convertir un data.frame en
data.table
Il suffit d’avoir recours à la fonction as.data.table .

R> library(data.table)
iris2 <- as.data.table(iris)
class(iris2)

[1] "data.table" "data.frame"

Comme on le voit, cela ajoute plusieurs classes additionnelles au tableau de données, celui-ci restant
malgré tout toujours un data.frame. 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 as.data.table , 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 data.table 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 data.table tandis que setDF fait l’opération opposée.

– 222 –
La syntaxe des crochets

R> setDT(iris)
class(iris)

[1] "data.table" "data.frame"

R> setDF(iris)
class(iris)

[1] "data.frame"

dplyr et data.table
Pour ceux travaillant également avec les extension dplyr et tibble, il est possible de concilier tibble et
data.table avec l’extension dtplyr et sa fonction tbl_dt .

R> library(dtplyr)
iris_dt <- tbl_dt(iris)
class(iris_dt)

[1] "tbl_dt" "tbl" "data.table" "data.frame"

Le tableau de données est à la fois compatible avec data.table (et notamment sa syntaxe particulière des
crochets) et les verbes de dplyr.

La syntaxe des crochets


La syntaxe des crochets change radicalement avec data.table. 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
data.table-package ).

– 223 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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[Sepal.Length < 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 data.table tandis que, pour un data.frame 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 .

R> iris2[, Sepal.Length]

[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

– 224 –
La syntaxe des crochets

Pour sélectionner plusieurs variables, on fournira une liste définie avec list (et non un vecteur défini
avec c ).

R> iris2[, list(Sepal.Length, Sepal.Width)]

data.table fourni un raccourci pour écrire une liste : .() . A l’intérieur des crochets (mais pas en dehors),
.() sera compris comme list() .

R> iris2[, .(Sepal.Length, Sepal.Width)]

Il est possible de renommer une variable à la volée et même d’en calculer d’autres.

R> iris2[, .(espece = Species, aire_petal = Petal.Length * Petal.Width)]

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
utiliser .N pour obtenir le nombre d’observations.

R> iris2[, .(min_sepal_width = min(Sepal.Width), max_sepal_width = max(Sepal.Widt


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(Sepal.Width), max_sepal_width = max(Sepal.Widt


h),
n_observations = .N), by = Species]

– 225 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Ajouter / Modifier / Supprimer une variable


data.table 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 = Petal.Width * Petal.Length, Species)][,


.(min_petal_area = min(petal_area)), by = Species]

– 226 –
Tris
Fonctions R de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 227
Extension dplyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Extension data.table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229

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 :

– 227 –
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> d.tri <- 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(d.tri, 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> d.tri <- 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 ).

– 228 –
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 <- tbl_df(hdv2003)
tbl <- tbl %>% arrange(sexe, desc(age))

Extension data.table
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(data.table)
dt <- as.data.table(hdv2003)

# Option 1
dt <- dt[order(sexe, -age)]

# Option 2
setorder(dt, sexe, -age)

– 229 –
Sous-ensembles
Par indexation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Fonction subset . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Fonction tapply . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
Extension dplyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Extension data.table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236

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

– 231 –
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$trav.satisf)

Satisfaction Insatisfaction Equilibre NA's


480 117 451 952

R> d.satisf <- d[d$trav.satisf == "Satisfaction", ]


dim(d.satisf)

[1] 1432 20

Comme on le voit, ici d.satisf 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 :

– 232 –
Sous-ensembles

R> d.satisf <- d[d$trav.satisf == "Satisfaction" & !is.na(d$trav.satisf),


]
dim(d.satisf)

[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$trav.satisf)

Satisfaction Insatisfaction Equilibre NA's


480 117 451 952

– 233 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> d.satisf <- d[d$trav.satisf == "Satisfaction", ]


dim(d.satisf)

[1] 1432 20

R> d.satisf <- subset(d, trav.satisf == "Satisfaction")


dim(d.satisf)

[1] 480 20

Dans le cas présent, l’extraction obtenue avec subset est équivalente à :

R> d.satisf <- d[d$trav.satisf == "Satisfaction" & !is.na(d$trav.satisf),


]
dim(d.satisf)

[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

– 234 –
Sous-ensembles

correspondant à un même niveau du facteur. Vite, un exemple !

R> tapply(d$age, d$sexe, mean)

Homme Femme
48.16129 48.15350

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
n % val%
Non 384 42.7 42.7
Oui 515 57.3 57.3

$Femme
n % val%
Non 763 69.3 69.3
Oui 338 30.7 30.7

Les arguments supplémentaires fournis à tapply sont en fait fournis directement à la fonction appelée.

R> tapply(d$bricol, d$sexe, freq, total = TRUE)

$Homme
n % val%
Non 384 42.7 42.7
Oui 515 57.3 57.3
Total 899 100.0 100.0

$Femme
n % val%
Non 763 69.3 69.3
Oui 338 30.7 30.7
Total 1101 100.0 100.0

– 235 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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.16129 48.15350

R> by(d$age, d$sexe, mean)

d$sexe: Homme
[1] 48.16129
---------------------------------------------
d$sexe: Femme
[1] 48.1535

Extension dplyr
On utilisera tout simplement la fonction filter .

R> library(dplyr)
tbl <- tbl_df(hdv2003)
hommes_jeunes <- tbl %>% filter(sexe == "Homme", age < 30)

Voir le chapitre dédié à dplyr, page 205 pour plus de détails.

Extension data.table
Il suffit d’indiquer la condition entre crochets.

– 236 –
Sous-ensembles

R> library(data.table)
dt <- as.data.table(hdv2003)
hommes_jeunes <- dt[sexe == "Hommes" & age < 30]

Voir le chapitre dédié à data.table, page 221 pour plus de détails.

– 237 –
Fusion de tables
La fonction merge et les jointures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
Jointures avec dplyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
Clés implicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
Clés explicites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Types de jointures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Jointures avec data.table . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 251
Ajouter des observations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252

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 :

– 239 –
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 :

– 240 –
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, page 01, 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> d.complet <- merge(d1, d2, by = "id")


head(d.complet)

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…

– 241 –
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","date.naissance") .

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 :

– 242 –
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.

– 243 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> library(dplyr)
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, 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.

– 244 –
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)

`by` required, because the data sources have no common


variables

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 :

R> left_join(flights_ex, airports_ex, by = c(origin = "faa"))

– 245 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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("_depar


t",
"_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 :

R> personnes <- data_frame(nom = c("Sylvie", "Sylvie", "Monique",


"Gunter", "Rayan", "Rayan"), voiture = c("Twingo", "Ferrari",
"Scenic", "Lada", "Twingo", "Clio"))

Warning: `data_frame()` is deprecated, use `tibble()`.


This warning is displayed once per session.

– 246 –
Fusion de tables

nom voiture

Sylvie Twingo

Sylvie Ferrari

Monique Scenic

Gunter Lada

Rayan Twingo

Rayan Clio

R> voitures <- data_frame(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 :

R> left_join(personnes, voitures)

Joining, by = "voiture"

– 247 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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, by = "voiture"

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

– 248 –
Fusion de tables

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, by = "voiture"

nom voiture vitesse

Sylvie Twingo 140

Rayan Twingo 140

Sylvie Ferrari 280

Rayan Clio 160

Gunter Lada 85

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, by = "voiture"

– 249 –
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

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 :

R> full_join(personnes, voitures)

Joining, 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

– 250 –
Fusion de tables

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, by = "voiture"

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, by = "voiture"

nom voiture

Monique Scenic

Jointures avec data.table


data.table fournit une fonction merge beaucoup plus rapide que celle standard de R mais fonctionnant
de manière identique.

– 251 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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.

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")

– 252 –
Fusion de tables

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")

NOTE

Une alternative à bind_rows est la fonction rbind.fill de l’extension plyr qui fonctionne de
manière similaire.

– 253 –
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 (https://cran.r-project.org/web/packages/lubridate/vignettes/
lubridate.html, en anglais)
• à ce tutoriel (https://rpubs.com/davoodastaraky/lubridate)

– 255 –
Fonctions à fenêtre
I M P O R TA N T

Ce chapitre est en cours d’écriture.

Ces fonctions sont présentées en détail (en anglais) dans une vignette dédiée de l’extension dplyr
(https://cran.r-project.org/web/packages/dplyr/vignettes/window-functions.html).

– 257 –
Manipuler du texte avec
stringr
Expressions régulières . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Concaténer des chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 261
Convertir en majuscules / minuscules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Découper des chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
Extraire des sous-chaînes par position . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Détecter des motifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Extraire des motifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
Remplacer des motifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Modificateurs de motifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 267
Insérer une variable dans une chaîne de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
Ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268

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 :

– 259 –
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 octobre 1961", "221 avenue de la Li
bé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, page 01 :

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…

– 260 –
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"
[4] "221 avenue de la LibérationMarseille"

– 261 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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"


[3] "M. MARTIAL TRUC" "MME HUGUETTE CHOSE"

– 262 –
Manipuler du texte avec stringr

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]


[1,] "Mr" "Félicien" "Machin"
[2,] "Mme" "Raymonde" "Bidule"
[3,] "M." "Martial" "Truc"

– 263 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

[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"))

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.

Une variante, str_count , compte le nombre d’occurrences d’une chaîne pour chaque élément d’un
vecteur :

– 264 –
Manipuler du texte avec stringr

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.

R> str_extract(d$adresse, "^\\d+")

[1] "3" "47" "12" "221"

– 265 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 %>% 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 :

R> str_replace(d$nom, "Mr", "M.")

[1] "M. Félicien Machin" "Mme Raymonde Bidule"

– 266 –
Manipuler du texte avec stringr

[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 = "Rue"))

[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 :

R> str_detect(d$nom, "mme")

[1] FALSE FALSE FALSE FALSE

– 267 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 <- as.Date("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 1


2 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
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.

– 268 –
Réorganiser ses données
avec tidyr
Tidy data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Trois règles pour des données bien rangées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 273
Les verbes de tidyr . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
gather : rassembler des colonnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
spread : disperser des lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 278
separate : séparer une colonne en plusieurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
unite : regrouper plusieurs colonnes en une seule . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281
extract : créer de nouvelles colonnes à partir d’une colonne de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282
complete : compléter des combinaisons de variables manquantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Ressources . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284

NOTE

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

Tidy data
Comme indiqué dans l’introduction au tidyverse, page 58, 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 :

-- Attaching packages
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------

– 269 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

-- tidyverse 1.2.1 --

v ggplot2 3.1.0 v purrr 0.3.2


v tibble 2.1.1 v dplyr 0.8.0.1
v tidyr 0.8.3 v stringr 1.4.0
v readr 1.3.1 v forcats 0.4.0

-- Conflicts
--------------------------------------------------------------------------------
--------------------------------------------------------------------------------
----- tidyverse_conflicts() --
x dplyr::filter() masks stats::filter()
x dplyr::lag() masks stats::lag()

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 :

– 270 –
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 :

– 271 –
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 x 2
country pop_min
<fct> <dbl>
1 Belgium 10045622
2 France 57374179
3 Germany 80597764

– 272 –
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 :

– 273 –
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 :

– 274 –
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

– 275 –
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.

gather : 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 gather (“rassembler”) :

– 276 –
Réorganiser ses données avec tidyr

R> d %>% gather(`2002`, `2007`, key = annee, value = population)

# A tibble: 12 x 3
country annee population
<fct> <chr> <int>
1 Belgium 2002 10311970
2 France 2002 59925035
3 Germany 2002 82350671
4 Italy 2002 57926999
5 Spain 2002 40152517
6 Switzerland 2002 7361757
7 Belgium 2007 10392226
8 France 2007 61083916
9 Germany 2007 82400996
10 Italy 2007 58147733
11 Spain 2007 40448191
12 Switzerland 2007 7554661

La fonction gather prend comme arguments la liste des colonnes à rassembler (ici on a mis 2002 et
2007 entre backticks ( `2002` ) pour indiquer à gather qu’il s’agit d’un nom de colonne et pas d’un
nombre), ainsi que deux arguments key et value :

• key est le nom de la colonne qui va contenir les “clés”, c’est-à-dire les identifiants des
différentes observations
• value est le nom de la colonne qui va contenir la valeur des observations

Parfois il est plus rapide d’indiquer à gather les colonnes qu’on ne souhaite pas rassembler. On peut le
faire avec la syntaxe suivante :

R> d %>% gather(-country, key = annee, value = population)

# A tibble: 12 x 3
country annee population
<fct> <chr> <int>
1 Belgium 2002 10311970
2 France 2002 59925035
3 Germany 2002 82350671
4 Italy 2002 57926999
5 Spain 2002 40152517
6 Switzerland 2002 7361757
7 Belgium 2007 10392226
8 France 2007 61083916
9 Germany 2007 82400996
10 Italy 2007 58147733

– 277 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

11 Spain 2007 40448191


12 Switzerland 2007 7554661

spread : disperser des lignes


La fonction spread est l’inverse de gather .

Soit le tableau d suivant :

country continent year variable value

Belgium Europe 2002 lifeExp 78.320

Belgium Europe 2007 lifeExp 79.441

France Europe 2002 lifeExp 79.590

France Europe 2007 lifeExp 80.657

Germany Europe 2002 lifeExp 78.670

Germany Europe 2007 lifeExp 79.406

Belgium Europe 2002 pop 10311970.000

Belgium Europe 2007 pop 10392226.000

France Europe 2002 pop 59925035.000

France Europe 2007 pop 61083916.000

Germany Europe 2002 pop 82350671.000

Germany Europe 2007 pop 82400996.000

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 spread pour «disperser» ces lignes dans deux colonnes différentes :

R> d %>% spread(key = variable, value = value)

# A tibble: 6 x 5
country continent year lifeExp pop

– 278 –
Réorganiser ses données avec tidyr

<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

spread prend deux arguments principaux :

• key indique la colonne contenant les noms des nouvelles variables à créer
• value 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 fill permet de spécifier la valeur à utiliser pour ces données manquantes (par défaut fill
vaut, logiquement, NA ).

Exemple avec le tableau d suivant :

country continent year variable value

Belgium Europe 2002 lifeExp 78.320

Belgium Europe 2007 lifeExp 79.441

France Europe 2002 lifeExp 79.590

France Europe 2007 lifeExp 80.657

Germany Europe 2002 lifeExp 78.670

Germany Europe 2007 lifeExp 79.406

Belgium Europe 2002 pop 10311970.000

Belgium Europe 2007 pop 10392226.000

France Europe 2002 pop 59925035.000

France Europe 2007 pop 61083916.000

Germany Europe 2002 pop 82350671.000

Germany Europe 2007 pop 82400996.000

France Europe 2002 density 94.000

– 279 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> d %>% spread(key = variable, value = value)

# A tibble: 6 x 6
country continent year density lifeExp pop
<chr> <chr> <dbl> <dbl> <dbl> <dbl>
1 Belgium Europe 2002 NA 78.3 10311970
2 Belgium Europe 2007 NA 79.4 10392226
3 France Europe 2002 94 79.6 59925035
4 France Europe 2007 NA 80.7 61083916
5 Germany Europe 2002 NA 78.7 82350671
6 Germany Europe 2007 NA 79.4 82400996

R> d %>% spread(key = variable, value = value, fill = "-")

# A tibble: 6 x 6
country continent year density lifeExp pop
<chr> <chr> <dbl> <chr> <chr> <chr>
1 Belgium Europe 2002 - 78.32 10311970
2 Belgium Europe 2007 - 79.441 10392226
3 France Europe 2002 94 79.59 59925035
4 France Europe 2007 - 80.657 61083916
5 Germany Europe 2002 - 78.67 82350671
6 Germany Europe 2007 - 79.406 82400996

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 :

– 280 –
Réorganiser ses données avec tidyr

R> df %>% separate(note, c("note", "note_sur"))

# A tibble: 3 x 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 :

R> df %>% separate(eleve, c("prenom", "nom"), sep = " ")

# A tibble: 3 x 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

– 281 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 x 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
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 x 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 :

– 282 –
Réorganiser ses données avec tidyr

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 %>% extract(eleve, c("prenom", "nom"), "^(.*) (.*)$")

On passe donc à extract trois arguments : la colonne d’où on doit extraire les valeurs, un vecteur
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 %>% 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

– 283 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 :

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é.

– 284 –
Réorganiser ses données avec tidyr

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 : http://tidyr.tidyverse.org/ et contient une liste des
fonctions et les pages d’aide associées.

– 285 –
Scraping
Les sources de l’exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
Les blogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Les mots-clés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Récupération des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
Récupération d’éléments HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 290
Récupération de plusieurs pages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Utilisation de la syntaxe XPath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Combinaison des résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294

Une grande partie des données que l’on trouve sur Internet n’y sont pas présentées sous la forme d’un jeu
de données : dans de très nombreux cas de figure, ces données peuvent être présentées, par exemple, sous
la forme d’un tableau, ou d’une série de pages Web. Ce chapitre explique comment récupérer ces données,
de manière à en permettre la manipulation dans R.

La récupération de données numériques, que l’on va illustrer à partir de trois sites Internet consacrés aux
théories du complot circulant en France, est plus connue sous le nom de scraping ou de Web scraping. Il
s’agit d’un ensemble de techniques, dont on présentera ici que les principaux aspects, appliqués à un cas
d’étude précis.

Les sources de l’exemple


Ce chapitre s’intéresse à trois sites Internet consacrés aux théories du complot et à leurs diffuseurs,
les « conspirationnistes ». Le site de Rudy Reichstadt, Conspiracy Watch, qui va devenir notre principale
source de données, propose une définition de ce terme. La seconde source utilisée, le site Confusionnisme
d’Ornella Guyet, utilise une définition différente, qui recoupe largement la première du point de vue des
individus et des groupes qu’elle identifie. Notre troisième source, le site anonyme Conspis hors de nos
vi[ll]es, ne propose pas de définition précise pour sa part, mais fournit quelques éléments supplémentaires
de description.

Les termes de « théorie du complot » et de « conspirationnisme » étant difficiles à saisir en seulement


quelques phrases, on renverra le lecteur à la note publiée par Rudy Reichstadt pour l’Observatoire des

– 287 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

radicalités politiques de la Fondation Jean Jaurès. Cette note donne un bon aperçu des différents groupes
impliqués dans la diffusion de ces « théories » en France, que l’on retrouve dans une cartographie en
réseau de leurs sites Internet, réalisée par Joël Gombin en juillet 2014. Les données récupérées dans ce
chapitre recoupent les informations fournies dans ces deux sources.

Les blogs
Les sites Internet auxquels on s’intéresse sont tous les trois publiés sous la forme de blogs. Ce détail
est important, car pour en récupérer les informations publiées par ces sites, il va falloir comprendre la
structure sous-jacente de ces blogs, c’est-à-dire la syntaxe HTML de leurs pages. Les sites Confusionnisme
et Conspis hors de nos vi[ll]es sont les plus simples à comprendre. En effet, ils sont tous les deux publiés
grâce au moteur de blog WordPress, qui permet de parcourir les différentes pages d’un blog en rajoutant
le suffixe /page/n à l’adresse-racine du site, de la manière suivante :

http://confusionnisme.info/page/1
http://confusionnisme.info/page/2
http://confusionnisme.info/page/3
...
http://conspishorsdenosvies.noblogs.org/page/1
http://conspishorsdenosvies.noblogs.org/page/2
http://conspishorsdenosvies.noblogs.org/page/3
...

En navigant ces liens, on s’aperçoit que les deux sites en question n’ont publié qu’un nombre limité de
billets : il n’y a que 4 pages de billets sur le premier, et 5 pages sur le second. Le site Conspiracy Watch
est, en comparaison, beaucoup plus riche : en effet, comme l’indique le compteur visible en bas de chaque
page, le site compte 60 pages de billets, auxquelles le lecteur peut accéder en utilisant un suffixe différent,
lié à l’utilisation d’un moteur de blog différent de WordPress. Dans ce cas de figure, le suffixe ne renvoie
pas à une « page », mais à un « compteur » de billets, où le dernier billet publié est numéroté 0 :

http://www.conspiracywatch.info/?start=0
http://www.conspiracywatch.info/?start=20
http://www.conspiracywatch.info/?start=40
...

Suivant ce schéma de pagination, qui commence à 0 puis augmente de 20 billets par page, la page 60 va
correspondre au suffixe ?start=1180 . On connaît donc désormais le nombres de pages à récupérer sur
chacun des blogs étudiés, en notant bien que c’est le site Conspiracy Watch qui va fournir la très grande
majorité des pages. On aurait pu « découvrir » ces informations de manière programmatique, en écrivant
un peu de code pour ce faire, mais un repérage manuel du nombre de pages sur chacun des blogs est ici
tout aussi rapide, même s’il faudra le mettre à jour lorsque les blogs auront publié de nouvelles pages de
billets.

– 288 –
Scraping

Les mots-clés
Sur chacun des blogs auxquels on s’intéresse, on trouve des billets très détaillés sur tel ou tel groupe
diffusant une ou plusieurs « théories du complot ». Sur les blogs Confusionnisme et Conspiracy Watch,
on trouve par exemple deux articles sur un groupuscule ayant appelé à un « Mouvement du 14 juillet »
2015. Sur le blog Conspis hors de nos vi[ll]es, qui a cessé de publier en mars 2012, le dernier billet évoque
un autre exemple de ces groupes. Ces différents billets sont tous soigneusement catégorisés par de très
nombreux mots-clés, qui incluent notamment les noms propres des individus cités ; ce billet, par exemple,
se termine par les mots-clés suivants :

11 septembre, antiaméricanisme, apollo 11, etat islamique, etats-unis, laurent l


ouis, lune

Ces mots-clés sont destinés à permettre aux lecteurs de naviguer plus facilement à travers les différents
billets du site, ainsi qu’à faciliter l’indexation du blog par les moteurs de recherche. Ce que l’on se propose
de faire ici consiste à récupérer, pour chacun des billets publiés par chacun des trois blogs, l’ensemble
de ces mots-clés, ainsi que les titres, les dates de publication et les adresses Internet – les URL – des
billets auxquels ils correspondent. Ces données permettront par la suite de construire un réseau de
co-occcurrences de ces mots-clés, c’est-à-dire une représentation graphique des associations entre ces
mots-clés sur la base des trois sources utilisées.

Récupération des données


Pour récupérer les données des trois blogs, on va commencer par charger quelques extensions utilisées
dans plusieurs autres chapitres : l’extension dplyr va servir à manipuler les données au fur et à mesure de
leur récupération ; l’extension readr va servir à sauvegarder le résultat final au format CSV ; l’extension
lubridate va servir à convertir les dates de publication des billets vers un même format générique ; et
l’extension stringr va servir à nettoyer le texte récupéré.

R> library(dplyr)
library(readr)
library(lubridate)
library(stringr)

Chargeons à présent l’extension rvest, qui va fournir les fonctions essentielles à la récupération des
données de chacun des blogs. Comme l’explique l’auteur de l’extension, celle-ci est inspirée d’extensions
équivalentes disponibles pour le langage Python. Sa fonctionnalité principale est de permettre à
l’utilisateur, à l’aide d’une syntaxe simplifiée ou à l’aide de la syntaxe XPath, de sélectionner les différents
éléments d’une page Web, à partir des balises HTML et CSS de cette page.1, page 01

– 289 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> library(rvest)

Récupération d’éléments HTML


Commençons par le blog Confusionnisme. Un rapide coup d’oeil au code source de sa page d’accueil
montre que les billets publiés sur ce blog se trouvent dans une suite de structures : l’une d’entre elles,
<div id="scraping_content"> , qui se lit « diviseur à identifiant content », contient tous les billets,
et à l’intérieur de cette structure, tous les titres de billets se trouvent dans un hyperlien <a> à l’intérieur
d’une balise <h1 class="entry-title"> , qui se lit « titre de niveau 1 de classe « entry-title ».

Récupérons désormais le code source de la page d’accueil du blog grâce à la fonction html . Une fois
exécuté le code ci-dessous, affichez le contenu de l’objet h pour réaliser que vous venez de récupérer le
code source HTML de la page d’accueil du blog :

R> h = html("http://confusionnisme.info/")

Sélectionnons, à présent, toutes les balises correspondant aux identifiants notés ci-dessus, grâce à la
fonction html_nodes . Pour gagner de la place, on n’affichera ici que les deux premiers titres de billets
que renvoie cette dernière fonction :

R> html_nodes(h, "#content .entry-title a") %>%


head(2)

Le code ci-dessus signifie : « sélectionner tous les hyperliens <a> , à l’intérieur des éléments identifiés
par la classe entry-title , à l’intérieur de l’élément portant l’identifiant content ». Comme l’on peut
le voir, les identifiants des éléments HTML ( id ), qui sont censés être uniques, sont codés par un dièse
( # ), et les classes de ces mêmes éléments ( class ), qui peuvent se répéter, sont codées par un point ( . ).
Ces codes sont identiques à ceux que l’on utilise pour attribuer des styles particuliers à ces éléments en
langage CSS.

Les éléments HTML que l’on a sélectionnés contiennent aussi bien des balises HTML (telles que <a> et
<i> ) que du texte. Pour ne sélectionner que le texte, on rajoute la fonction html_text au code montré
ci-dessus. Toujours par économie de place, on ne montre que les deux premiers résultats de ce nouvel
enchaînement de fonctions :

1. Si vous ne connaissez rien aux langages HTML et CSS, c’est le moment ou jamais d’en apprendre les bases ! Un
excellent site de référence pour ce faire est W3 Schools.

– 290 –
Scraping

R> html_nodes(h, "#content .entry-title a") %>%


html_text %>%
head(2)

Voilà qui permet donc de récupérer les titres des billets ! Pour récupérer les hyperliens vers ces billets,
rien de plus simple : au lieu de récupérer le texte des titres, il suffit de demander à récupérer l’attribut
href de chaque lien, en utilisant la fonction html_attr . On obtient cette fois-ci les hyperliens complets
vers chaque billet :

R> html_nodes(h, "#content .entry-title a") %>%


html_attr("href") %>%
head(2)

Présentons encore un exemple de sélection d’éléments sur la page d’accueil de ce blog, cette fois-ci en
montrant l’intégralité des éléments récupérés, car ils prennent peu de place à l’écran. Ici, on récupère les
dates de publications des billets, qui se trouvent, toujours selon le code source de la page, dans une balise
<time> qui se trouve dans une balise <header class="entry-meta"> . Le code que l’on donne à la
fonction html_nodes est donc :

R> html_nodes(h, "#content header.entry-header time") %>%


html_text

On voit bien ici que les deux premières dates sont identiques aux dates qui figurent dans les hyperliens
des deux premiers billets, tels que vus plus haut.

R> html_nodes(h, "#content header.entry-header time") %>%


html_text

Terminons, enfin, par un exemple plus compliqué. Comme on l’a déjà écrit, chacun des billets du blog
est accompagné de plusieurs mots-clés. Après inspection du code source, on voit que ces mots-clés se
trouvent regroupés dans un élément appelé <span class="tag-links"> . Visionnons les deux
premiers éléments en question, toujours à l’aide de la même syntaxe de sélection :

R> html_nodes(h, ".tag-links") %>%


head(2)

Pour pouvoir stocker tous les mots-clés d’un billet sur la même ligne d’un fichier CSV, qui contiendra
aussi le titre du billet, son hyperlien et sa date de publication, il va falloir regroupr ces mots-clés. On va
donc, à l’intérieur de chacun des éléments de la liste d’éléments <span> , extraire le texte des mots-clés,
contenus dans les éléments <a> , et les “coller” ensemble grâce à la fonction paste0 et à son argument
collapse :

– 291 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> html_nodes(h, ".tag-links") %>%


sapply(function(x) html_nodes(x, "a") %>%
html_text %>%
paste0(collapse = ";")) %>%
head(2)

L’astuce se trouve ici dans l’utilisation de la fonction sapply , qui permet de travailler sur chacun des
éléments <span class="tag-links"> de manière séparée. L’utilisation de la fonction pipe %>% a par
ailleurs permis de travailler de manière cumulative, par essai-erreur, tout en produisant un code final
plutôt lisible.

Récupération de plusieurs pages


On sait désormais comment récupérer les informations que l’on veut collecter. Le blog Confusionnisme
n’ayant que 4 pages, il va être très simple de les récupérer à l’aide d’une petite boucle qui récupère chaque
page, en extrait les données inspectées ci-dessus, et les rajoute à un jeu de données initialement vide,
nommé d1 , grâce à la fonction rbind :

R> d1 = data_frame()

for(i in 1:4) {

h = html(paste0("http://confusionnisme.info/page/", i))

d1 = rbind(d1, data_frame(
url = html_nodes(h, "#content .entry-title a") %>% html_attr("href"),
title = html_nodes(h, "#content .entry-title a") %>% html_text,
date = html_nodes(h, "#content header.entry-header time") %>% html_text,
tags = html_nodes(h, ".tag-links") %>%
sapply(function(x) html_nodes(x, "a") %>%
html_text %>%
paste0(collapse = ";"))
))

À la date de publication de ce blog, ce petit bout de code récupère les 36 billets étalés sur les 4 pages
du site Confusionnisme. Comme le montre l’inspection du résultat, le jeu de données que l’on vient de
constituer contient l’adresse, le titre, la date de publication et les mots-clés de ces billets :

R> View(d1)

Il ne reste plus qu’à convertir la variable date vers le format générique yyyy-mm-dd que propose R

– 292 –
Scraping

à travers la fonction as.Date . Pour convertir la variable, on utilise l’extension lubridate, qui peut
facilement interpréter les mois écrits en langue française grâce à l’argument locale spécifié ci-dessous :

R> d1$date = parse_date_time(d1$date, "%d %m %Y", locale = "fr_FR") %>%


as.Date

Utilisation de la syntaxe XPath


L’exemple que l’on vient de voir permet de récupérer les données du blog Confusionnisme. Il se trouve que
ce code fonctionne presque aussi bien pour le blog Conspis hors de nos vi[ll]es : en effet, celui-ci utilisant
aussi le moteur de blog WordPress, la structure de ses pages est quasiment identique à celle que l’on vient
de voir. Voici le code complet pour récupérer les 5 pages de ce blog :

R> d2 = data_frame()

for(i in 1:5) {

h = html(paste0("http://conspishorsdenosvies.noblogs.org/page/", i))

d2 = rbind(d2, data_frame(
url = html_nodes(h, "#content .entry-title a") %>% html_attr("href"),
title = html_nodes(h, "#content .entry-title a") %>% html_text,
date = html_nodes(h, "#content .entry-date") %>% html_text,
tags = html_nodes(h, ".tag-links") %>%
sapply(function(x) html_nodes(x, xpath = "a[@rel='tag']") %>%
html_text %>%
paste0(collapse = ";"))
))

d2$date = parse_date_time(d2$date, "%d/%m/%Y") %>% as.Date

On remarquera que plusieurs petites choses ont changé : par exemple, sur le blog Conspis hors de nos
vi[ll]es, les dates sont affichées dans un format dd/mm/yyyy qui ne nécessite pas de conversion, car
chaque élément de la date est donné sous la forme d’un chiffre. On remarquera aussi que l’emplacement
de la date a changé, car le gabarit graphique du blog diffère de celui de Confusionnisme et place cette
information dans un élément différent du code source de la page.

Le changement le plus important ici concerne l’utilisation de la syntaxe XPath : en effet, pour récupérer
les mots-clés, il nous a fallu limiter ceux-ci à ceux se trouvant dans des hyperliens ( <a> ) dont la propriété
rel est égale à tag , pour ne pas également récupérer les mots-clés correspondant à des catégories du
blog. La syntaxe XPath est un peu plus alambiquée : ici, c’est l’expression a[@rel='tag'] qui accomplit
l’opération souhaitée, à condition d’être bien passée à l’argument xpath de la fonction html_nodes .

– 293 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Combinaison des résultats


Il nous reste un blog à couvrir : Conspiracy Watch. Le code pour celui-ci diffère assez fondamentalement
des blogs précédents du point de vue de la syntaxe de ses pages, qui utilisent un moteur de blog
complètement différent de WordPress. Après lecture de la source, on arrive au code suivant, qui récupère
les mêmes variables que récupérées pour les deux autres blogs :

R> d3 = data_frame()

for(i in seq(0, 1180, 20)) {

h = html(paste0("http://www.conspiracywatch.info/?start=", i))

d3 = rbind(d3, data_frame(
url = html_nodes(h, "#mod_1260437 .titre a") %>% html_attr("href"),
title = html_nodes(h, "#mod_1260437 .titre") %>% html_text %>% str_trim,
date = html_nodes(h, "#mod_1260437 .cel_pied .date") %>% html_text,
tags = html_nodes(h, "#mod_1260437 .cel_pied") %>%
sapply(function(x) html_nodes(x, ".objet-tag a") %>%
html_text %>%
paste0(collapse = ";"))
))

d3$url = paste0("http://www.conspiracywatch.info", d3$url)


d3$date = parse_date_time(d3$date, "%d %m %Y", locale = "fr_FR") %>% as.Date

Il ne reste plus qu’à combiner les différents résultats de nos récupérations, de les ordonner par date de
publication, puis d’harmoniser les mots-clés a minima, en supprimant les traits d’union et en s’assurant
qu’ils ne contiennent pas de lettres majuscules :

R> d = rbind(d1, d2, d3) %>% arrange(date)


d$tags = gsub("-", " ", d$tags) %>% tolower

L’inspection du résultat montre que l’on dispose à présent d’un jeu de données contenant les métadonnées
de 1,268 billets de blogs, dont l’immense majorité proviennent de Conspiracy Watch :

– 294 –
Scraping

R> # nombre de billets récupérés


nrow(d)
# sources des billets
table(substr(d$url, 1, 25))

Il ne reste plus qu’à sauvegarder ce résultat, pour réutilisation future :

R> write_csv(d, "data/conspi.csv")

– 295 –
Export de données
Export de tableaux de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
Exporter des objets spatiaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298
Sauvegarder des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 298

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 write.xlsx de l’extension xlsx.

Pour le format dBase, on peut utiliser write.dbf (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, page 01.

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 https://github.com/wesm/
feather

– 297 –
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 = "fichier.RData")

Pour charger des objets préalablement enregistrés, utiliser load :

R> load("fichier.RData")

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.

– 298 –
Export de données

Type de fichier souhaité Fonction Extension

texte write.table utils

CSV write.csv utils

CSV write_csv readr

Excel write.xlsx xlsx

dBase write.dbf foreign

SPSS write_sav haven

SPSS write.foreign foreign

Stata write.dta foreign

Stata write_dta haven

SAS write.foreign foreign

SPSS write.foreign 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 : http://cran.r-project.org/manuals.html.

– 299 –
Export de graphiques
Via l’interface de RStudio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301
Sauvegarder le fichier en tant qu’image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
Sauvegarder le graphique en PDF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Copier le graphique dans le presse-papier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 305
Export avec les commandes de R . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
Export avec ggplot2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307

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).

– 301 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Sauvegarder le fichier en tant qu’image

Figure 1. Sauvegarder un graphique en tant qu’image avec RStudio

La boîte de dialogue qui s’ouvre propose différentes options d’export :

• le type de fichier désiré ;

– 302 –
Export de graphiques

• 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, page 01). 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, page 02 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, page 03. 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, page 04) 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, page 05 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 http://fr.wikipedia.org/wiki/Image_matricielle.

2. Voir http://fr.wikipedia.org/wiki/Image_vectorielle.

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 https://www.wikiwand.com/fr/Scalable_Vector_Graphics.

5. téléchargeable gratuitement sur https://inkscape.org/fr/.

– 303 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Sauvegarder le graphique en PDF

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.

– 304 –
Export de graphiques

Copier le graphique dans le presse-papier

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.

– 305 –
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
dev.print . 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))
dev.print(device = png, file = "export.png", 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 win.metafile 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 = "out.png", width = 800, height = 700)


plot(rnorm(100))
dev.off()
pdf(file = "out.pdf", width = 9, height = 9, pointsize = 10)
plot(rnorm(150))
dev.off()

Il est nécessaire de faire un appel à la fonction dev.off 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).

– 306 –
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)

– 307 –
Statistique univariée
Variable quantitative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Principaux indicateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 309
Histogramme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Densité et répartition cumulée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Boîtes à moustaches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Variable qualitative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Tris à plat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Représentation graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Exporter les graphiques obtenus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331

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.

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 heures.tv 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) :

– 309 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> mean(d$heures.tv)

[1] NA

R> mean(d$heures.tv, na.rm = TRUE)

[1] 2.246566

R> sd(d$heures.tv, na.rm = TRUE)

[1] 1.775853

R> min(d$heures.tv, na.rm = TRUE)

[1] 0

R> max(d$heures.tv, na.rm = TRUE)

[1] 12

R> range(d$heures.tv, na.rm = 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$heures.tv, na.rm = TRUE)

[1] 2

– 310 –
Statistique univariée

R> quantile(d$heures.tv, na.rm = TRUE)

0% 25% 50% 75% 100%


0 1 2 3 12

R> summary(d$heures.tv)

Min. 1st Qu. Median Mean 3rd Qu. Max. NA’s

0 1 2 2.246566 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 :

– 311 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> hist(d$heures.tv, 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, page 01.

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

– 312 –
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$heures.tv, 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 :


http://www.stat.columbia.edu/~tzheng/files/Rcolor.pdf.

– 313 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> hist(d$heures.tv, 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, page 02 de la distribution du nombre
d’heures consacrées à regarder la télévision. Le paramètre na.rm = 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 https://fr.wikipedia.org/wiki/Estimation_par_noyau

– 314 –
Statistique univariée

R> plot(density(d$heures.tv, na.rm = 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 .

– 315 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> plot(ecdf(d$heures.tv))

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 .

– 316 –
Statistique univariée

R> boxplot(d$heures.tv, 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, page 03.

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 :
http://pbil.univ-lyon1.fr/R/pdf/lang04.pdf.

– 317 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> boxplot(d$heures.tv, col = grey(0.8), main = "Nombre d'heures passées dev


ant la télé par jour",
ylab = "Heures")
abline(h = median(d$heures.tv, na.rm = TRUE), col = "navy", lty = 2)
text(1.35, median(d$heures.tv, na.rm = TRUE) + 0.15, "Médiane",
col = "navy")
Q1 <- quantile(d$heures.tv, probs = 0.25, na.rm = TRUE)
abline(h = Q1, col = "darkred")
text(1.35, Q1 + 0.15, "Q1 : premier quartile", col = "darkred",
lty = 2)
Q3 <- quantile(d$heures.tv, probs = 0.75, na.rm = 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$heures.tv, probs = 0.75, na.rm = TRUE),
x1 = 0.7, y1 = quantile(d$heures.tv, probs = 0.25, na.rm = 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",
lty = 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",
lty = 2)

– 318 –
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 ) :

– 319 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> boxplot(d$heures.tv, main = "Nombre d'heures passées devant la télé par\n


jour",
ylab = "Heures")
rug(d$heures.tv, 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.

– 320 –
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

– 321 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

manquantes dans les données.

On peut donc utiliser :

R> table(d$trav.satisf, 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$trav.satisf)

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, page 04.

R> freq(d$qualif)

n % val%

Ouvrier specialise 203 10.2 12.3

Ouvrier qualifie 292 14.6 17.7

Technicien 86 4.3 5.2

Profession intermediaire 160 8.0 9.7

Cadre 260 13.0 15.7

Employe 594 29.7 35.9

Autre 58 2.9 3.5

NA 347 17.3 NA

La colonne n donne les effectifs bruts, la colonne % la répartition en pourcentages et val% la

4. En l’absence de l’extension questionr, on pourra se rabattre sur la fonction prop.table avec la commande suivante :
prop.table(table(d$qualif)) .

– 322 –
Statistique univariée

répartition en pourcentages, données manquantes exclues. La fonction accepte plusieurs paramètres


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 = NA)

n % %cum

Autre 58 3.51 3.51

Technicien 86 5.20 8.71

Profession intermediaire 160 9.68 18.39

Ouvrier specialise 203 12.28 30.67

Cadre 260 15.73 46.40

Ouvrier qualifie 292 17.66 64.07

Employe 594 35.93 100.00

Total 1653 100.00 100.00

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 105. Ainsi :

R> data(fecondite)
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

– 323 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Total 2000 100.0

R> freq(femmes$region)

n % val%

[1] Nord 707 35.4 35.4

[2] Est 324 16.2 16.2

[3] Sud 407 20.3 20.3

[4] Ouest 562 28.1 28.1

R> freq(femmes$region, levels = "labels")

n % val%

Nord 707 35.4 35.4

Est 324 16.2 16.2

Sud 407 20.3 20.3

Ouest 562 28.1 28.1

R> freq(femmes$region, levels = "values")

n % val%

707 35.4 35.4

324 16.2 16.2

407 20.3 20.3

562 28.1 28.1

Pour plus d’informations sur la fonction freq , consultez sa page d’aide en ligne avec ?freq ou
help("freq") .

– 324 –
Statistique univariée

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, page 05.

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 https://www.data-to-viz.com/caveat/pie.html pour un exemple concret.

– 325 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> plot(table(d$freres.soeurs), 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,
page 06 :

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 as.matrix .

– 326 –
Statistique univariée

R> dotchart(as.matrix(table(d$clso))[, 1], main = "Sentiment d'appartenance


à une classe sociale",
pch = 19)

Figure 10. Exemple de diagramme de Cleveland

– 327 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

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 as.matrix .

R> dotchart(as.matrix(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.

– 328 –
Statistique univariée

R> dotchart(as.matrix(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 as.matrix 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 à as.matrix ). C’est ce qu’on appelle l’indexation, abordée plus en détail dans le chapitre
Listes et tableaux de données, page 85.

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 :

– 329 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> dotchart(as.matrix(sort(table(d$qualif)))[, 1], main = "Niveau de qualifi


cation")

Figure 11. Exemple de diagramme de Cleveland ordonné

– 330 –
Statistique univariée

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).

Exporter les graphiques obtenus


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).

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é,

– 331 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

page 301.

– 332 –
Statistique bivariée
Deux variables quantitatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Trois variables ou plus . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341
Une variable quantitative et une variable qualitative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Représentations graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
Tests statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Deux variables qualitatives . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Tableau croisé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348
Pourcentages en ligne et en colonne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Représentation graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
Tests statistiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356

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 309.

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 :

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

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.

– 333 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> plot(d$age, d$heures.tv)

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
représentation avec des points semi-transparents.

– 334 –
Statistique bivariée

R> plot(d$age, d$heures.tv, 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 complete.cases , estimer la densité locale à l’aide de la
fonction kde2d de l’extension MASS1, page 01 et représenter le tout à l’aide d’une des fonctions image ,
contour ou filled.contour …

1. MASS est installée par défaut avec la version de base de R.

– 335 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> library(MASS)
tmp <- d[, c("age", "heures.tv")]
tmp <- tmp[complete.cases(tmp), ]
filled.contour(kde2d(tmp$age, tmp$heures.tv), color = terrain.colors)

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 .

– 336 –
Statistique bivariée

R> smoothScatter(d[, c("age", "heures.tv")])

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$heures.tv, use = "complete.obs")

[1] 0.1776249

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.

– 337 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> plot(rp99$dipl.sup, 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$dipl.sup, rp99$cadres)

[1] 0.8975282

C’est beaucoup plus proche de 1. On peut alors effectuer une régression linéaire complète en utilisant la
fonction lm :

– 338 –
Statistique bivariée

R> reg <- lm(cadres ~ dipl.sup, data = rp99)


summary(reg)

Call:
lm(formula = cadres ~ dipl.sup, data = rp99)

Residuals:
Min 1Q Median 3Q Max
-9.6905 -1.9010 -0.1823 1.4913 17.0866

Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 1.24088 0.32988 3.762 0.000203 ***
dipl.sup 1.38352 0.03931 35.196 < 2e-16 ***
---
Signif. codes:
0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Residual standard error: 3.281 on 299 degrees of freedom


Multiple R-squared: 0.8056, Adjusted R-squared: 0.8049
F-statistic: 1239 on 1 and 299 DF, p-value: < 2.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 .

– 339 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> plot(rp99$dipl.sup, 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

– 340 –
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 ~ dipl.sup . 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 http://ww2.coastal.edu/kingw/statistics/R-


tutorials/formulae.html.

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 .

– 341 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> plot(rp99$dipl.aucun, rp99$tx.chom, cex = rp99$pop.tot/10^4)

Figure 7. Nuage de points avec taille des points proportionnels à une troisième variable

Lorsque l’on étudie un plus grand nombres de variables quantitatives, il est peut être utile de réaliser une
matrice de nuages de points, qui compare chaque variable deux à deux et qui s’obtient facilement avec la
fonction pairs .

– 342 –
Statistique bivariée

R> pairs(rp99[, c("proprio", "hlm", "locataire", "maison")])

Figure 8. Matrice de nuages de points

Une variable quantitative et une variable


qualitative

Représentations graphiques
Quand on parle de comparaison entre une variable quantitative et une variable qualitative, on veut en
général savoir si la distribution des valeurs de la variable quantitative est la même selon les modalités de
la variable qualitative. En clair : est ce que l’âge de ceux qui écoutent du hard rock est différent de l’âge de
ceux qui n’en écoutent pas ?

Là encore, l’idéal est de commencer par une représentation graphique. Les boîtes à moustaches (boxplot
en anglais) sont parfaitement adaptées pour cela.

– 343 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Si on a construit des sous-populations d’individus écoutant ou non du hard rock, on peut utiliser la
fonction boxplot .

R> d.hard <- subset(d, hard.rock == "Oui")


d.non.hard <- subset(d, hard.rock == "Non")
boxplot(d.hard$age, d.non.hard$age)

Figure 9. Boxplot de la répartition des âges (sous-populations)

Mais construire les sous-populations n’est pas nécessaire. On peut utiliser directement la version de
boxplot prenant une formule en argument.

– 344 –
Statistique bivariée

R> boxplot(age ~ hard.rock, data = d)

Figure 10. Boxplot de la répartition des âges (formule)

À première vue, ô surprise, la population écoutant du hard rock a l’air sensiblement plus jeune. Peut-on le
tester mathématiquement ?

– 345 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

NOTE

Les boîtes à moustache peuvent parfois être trompeuses car ne représentant qu’imparfaitement la
distribution d’une variable quantitative2, page 02.

Les graphique de pirates ou pirateplot sont une visualisation alternative qui combinent :

• un nuage de points représentant les données brutes ;


• une barre verticale représentant la moyenne ;
• un rectangle traduisant une inférence sur cette moyenne ;
• une forme en «haricot» ou «violon» indiquant la distribution.

De tels graphiques peuvent être réalisés avec la fonction pirateplot de l’extension yarr. Par défaut,
les rectangles représentent un intervalle bayésien crédible ou Bayesian Highest Density Intervals ou
HDI de la moyenne. On peut représenter à la place des intervalles de confiance avec
inf.method = "ci" .

2. Voir par exemple The boxplot and its pitfalls sur https://www.data-to-viz.com.

– 346 –
Statistique bivariée

R> library(yarrr)
pirateplot(age ~ hard.rock, data = d, theme = 1, inf.method = "ci",
bar.f.o = 0.1, bar.f.col = "grey10")

Figure 11. Graphique de «pirates»

Tests statistiques
On peut calculer la moyenne d’âge des deux groupes en utilisant la fonction tapply 3, page 03 :

R> tapply(d$age, d$hard.rock, mean)

Non Oui
48.30211 27.57143

3. La fonction tapply est présentée plus en détails dans le chapitre Manipulation de données.

– 347 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Pour un test de comparaison de deux moyennes (test t de Student), on pourra se référer au chapitre dédié
aux test statistiques de comparaison, page 437.

Deux variables qualitatives


La comparaison de deux variables qualitatives s’appelle en général un tableau croisé. C’est sans doute
l’une des analyses les plus fréquentes lors du traitement d’enquêtes en sciences sociales.

Tableau croisé
La manière la plus simple d’obtenir un tableau croisé est d’utiliser la fonction table en lui donnant en
paramètres les deux variables à croiser. En l’occurrence nous allons croiser un recodage du niveau de
qualification regroupé avec le fait de pratiquer un sport.

On commence par calculer la variable recodée et par afficher le tri à plat des deux variables :

R> d$qualif2 <- as.character(d$qualif)


d$qualif2[d$qualif %in% c("Ouvrier specialise", "Ouvrier qualifie")] <- "Ouvri
er"
d$qualif2[d$qualif %in% c("Profession intermediaire", "Technicien")] <- "Inter
mediaire"
table(d$qualif2)

Autre Cadre Employe Intermediaire Ouvrier

58 260 594 246 495


Le tableau croisé des deux variables s’obtient de la manière suivante :

R> table(d$sport, d$qualif2)

Autre Cadre Employe Intermediaire Ouvrier

Non 38 117 401 127 381

Oui 20 143 193 119 114

– 348 –
Statistique bivariée

NOTE

Il est tout à fait possible de croiser trois variables ou plus. Par exemple :

R> table(d$sport, d$cuisine, d$sexe)

Var1 Var2 Var3 Freq

Non Non Femme 358

Homme 401

Oui Femme 389

Homme 129

Oui Non Femme 132

Homme 228

Oui Femme 222

Homme 141

Une alternative à la fonction table est la fonction xtabs . On indiquera à cette dernière le croisement
à effectuer à l’aide d’une formule puis l’objet contenant nos données. Comme il ne s’agit pas d’un modèle
avec une variable à expliquer, toutes les variables seront indiquées à la droite du symbole ~ et séparées
par + .

R> xtabs(~sport, d)

Non Oui

1277 723

R> xtabs(~sport + cuisine, d)

Non Oui

Non 759 518

Oui 360 363

– 349 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> xtabs(~sport + cuisine + sexe, d)

sport cuisine sexe Freq

Non Non Femme 358

Homme 401

Oui Femme 389

Homme 129

Oui Non Femme 132

Homme 228

Oui Femme 222

Homme 141
On remarquera que le rendu par défaut est en général plus lisible car le nom des variables est indiqué,
permettant de savoir quelle variable est affichée en colonnes et laquelle en lignes.

Si l’on utilise des données labellisées, page 105, la fonction xtabs ne prendra pas en compte les
étiquettes de valeur.

R> data(fecondite)
xtabs(~educ + region, femmes)

1 2 3 4

0 387 213 282 256

1 179 53 86 142

2 123 57 37 131

3 18 1 2 33
On pourra alors utiliser la fonction ltabs de l’extension question, qui fonctionne exactement comme
xtabs , à ceci près qu’elle prendra en compte les étiquettes de variable et de valeur quand elles existent.

– 350 –
Statistique bivariée

R> ltabs(~educ + region, femmes)

[1] Nord [2] Est [3] Sud [4] Ouest

[0] aucun 387 213 282 256

[1] primaire 179 53 86 142

[2] secondaire 123 57 37 131

[3] supérieur 18 1 2 33

Pourcentages en ligne et en colonne


On n’a cependant que les effectifs, ce qui rend difficile les comparaisons. L’extension questionr fournit
des fonctions permettant de calculer facilement les pourcentages lignes, colonnes et totaux d’un tableau
croisé.

Les pourcentages lignes s’obtiennent avec la fonction lprop 4, page 04. Celle-ci s’applique au tableau
croisé généré par table ou xtabs :

R> tab <- table(d$sport, d$qualif2)


lprop(tab)

Autre Cadre Employe Intermediaire Ouvrier Total

Non 3.571429 10.99624 37.68797 11.93609 35.80827 100

Oui 3.395586 24.27844 32.76740 20.20374 19.35484 100

Ensemble 3.508772 15.72898 35.93466 14.88203 29.94555 100

R> tab <- xtabs(~sport + qualif2, d)


lprop(tab)

Autre Cadre Employe Intermediaire Ouvrier Total

Non 3.571429 10.99624 37.68797 11.93609 35.80827 100

Oui 3.395586 24.27844 32.76740 20.20374 19.35484 100

Ensemble 3.508772 15.72898 35.93466 14.88203 29.94555 100

4. Il s’agit en fait d’un alias pour les francophones de la fonction rprop .

– 351 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

Les pourcentages ligne ne nous intéressent guère ici. On ne cherche pas à voir quelle est la proportion de
cadres parmi ceux qui pratiquent un sport, mais plutôt quelle est la proportion de sportifs chez les cadres.
Il nous faut donc des pourcentages colonnes, que l’on obtient avec la fonction cprop :

R> cprop(tab)

Autre Cadre Employe Intermediaire Ouvrier Ensemble

Non 65.51724 45 67.50842 51.62602 76.9697 64.36782

Oui 34.48276 55 32.49158 48.37398 23.0303 35.63218

Total 100.00000 100 100.00000 100.00000 100.0000 100.00000


Dans l’ensemble, le pourcentage de personnes ayant pratiqué un sport est de 35,6 %. Mais cette
proportion varie fortement d’une catégorie professionnelle à l’autre : 55,0 % chez les cadres contre 23,0
% chez les ouvriers.

Enfin, les pourcentage totaux s’obtiennent avec la fonction prop :

R> prop(tab)

Autre Cadre Employe Intermediaire Ouvrier Total

Non 2.298851 7.078040 24.25892 7.683001 23.049002 64.36782

Oui 1.209921 8.650938 11.67574 7.199032 6.896552 35.63218

Total 3.508772 15.728978 35.93466 14.882033 29.945553 100.00000


À noter qu’on peut personnaliser l’affichage de ces tableaux de pourcentages à l’aide de différentes
options, dont digits qui règle le nombre de décimales à afficher et percent qui indique si on souhaite
ou non rajouter un symbole % dans chaque case du tableau. Cette personnalisation peut se faire
directement au moment de la génération du tableau et dans ce cas elle sera utilisée par défaut :

R> ctab <- cprop(tab, digits = 2, percent = TRUE)


ctab

Autre Cadre Employe Intermediaire Ouvrier Ensemble

Non 65.51724 45 67.50842 51.62602 76.9697 64.36782

Oui 34.48276 55 32.49158 48.37398 23.0303 35.63218

Total 100.00000 100 100.00000 100.00000 100.0000 100.00000


ou bien ponctuellement en passant les mêmes arguments à la fonction print :

– 352 –
Statistique bivariée

R> ctab <- cprop(tab)


print(ctab, percent = TRUE)

qualif2
sport Autre Cadre Employe Intermediaire Ouvrier
Non 65.5% 45.0% 67.5% 51.6% 77.0%
Oui 34.5% 55.0% 32.5% 48.4% 23.0%
Total 100.0% 100.0% 100.0% 100.0% 100.0%
qualif2
sport Ensemble
Non 64.4%
Oui 35.6%
Total 100.0%

Représentation graphique
On peut obtenir une représentation graphique synthétisant l’ensemble des résultats obtenus sous la
forme d’un graphique en mosaïque grâce à la fonction mosaicplot .

– 353 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> mosaicplot(qualif2 ~ sport, data = d, shade = TRUE, main = "Graphe en mos


aïque")

Figure 12. Exemple de graphe en mosaïque

Comment interpréter ce graphique haut en couleurs5, page 05 ? Chaque rectangle représente une case de
tableau. Sa largeur correspond aux pourcentages en colonnes (il y a beaucoup d’employés et d’ouvriers et
très peu d’« Autre »). Sa hauteur correspond aux pourcentages en lignes : la proportion de sportifs chez
les cadres est plus élevée que chez les employés. Enfin, la couleur de la case correspond au résidu du test
du ² correspondant : les cases en rouge sont sous-représentées, les cases en bleu sur-représentées, et les
cases blanches sont statistiquement proches de l’hypothèse d’indépendance.

5. Sauf s’il est imprimé en noir et blanc…

– 354 –
Statistique bivariée

NOTE

Les graphiques en mosaïque permettent notamment de représenter des tableaux croisés à 3 ou 4


dimensions, voire plus.

L’extension vcd fournie une fonction mosaic fournissant plus d’options pour la création d’un
graphique en mosaïque, permettant par exemple d’indiquer quelles variables doivent être affichées
horizontalement ou verticalement, ou encore de colorier le contenu des rectangles en fonction d’une
variable donnée, …

R> library(vcd)
mosaic(~sport + cuisine + sexe, d, highlighting = "sexe", main = "Exemple d
e graphique en mosaïque à 3 dimensions")

Lorsque l’on s’intéresse principalement aux variations d’une variable selon une autre, par exemple ici à la
pratique du sport selon le niveau de qualification, il peut être intéressant de présenter les pourcentages
en colonne sous la forme de barres cumulées.

– 355 –
analyse-R – Introduction à l’analyse d’enquêtes avec R et RStudio

R> barplot(cprop(tab, total = FALSE), main = "Pratique du sport selon le niv


eau de qualification")

Figure 13. Exemple de barres cumulées

Tests statistiques
Pour un test de comparaison de proportions, un test du Chi² ou encore un test exact de Fisher, on pourra
se référer au chapitre dédié aux test statistiques de comparaison, page 442.

– 356 –
Introduction à ggplot2, la
grammaire des graphiques
Les données de l’exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358
Nettoyage des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359
Recodage d’une variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Visualisation des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361
Visualisation par «petits multiples» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Visualisation en séries temporelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Combinaisons d’éléments graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Composition graphique avec ggplot2 . . . . . . . . . . . . . . . . . . . . . . . .