library(questionr)
Débuter avec R
Support de formation
Présentation de R et Rstudio
Logiciel R créé dans les années 1990 par Robert Gentleman & Ross Ihaka. Développé depuis 1997 par la “R-core team”
Dernière Version 4
Logiciel libre et gratuit permettant de faire des traitements de données statistiques
Ouvert : tout utilisateur peut ajouter ses fonctions personnelles
Transparent : l’utilisateur a accès au code source des fonctions
Multiplateforme : Windows, Linux, Mac
En constante évolution
Interface de base R
Interface R de base pour coder. On peut l’utiliser comme calculatrice.
Installation obligatoire (https://cran.r-project.org/bin/windows/base/) avant de pouvoir installer l’interface Rstudio (https://rstudio.com/products/rstudio/download/), plus conviviale que nous allons utiliser.
Interface R Studio
Syntaxe R
- R est sensible à la casse
- Ctrl entrée (Windows) ou Cmd entrée (Mac) pour soumettre le code ou bouton Run
- Commentaire: #commentaires
- Pour les chemins il faut inverser les antislash par des slash: “D:/R/Formation_R”
- Les valeurs manquantes: NA, is.na
- Opérateurs permis : ==, <, >, !=, %in%
- Opérateurs logiques : &, |, !
Syntaxe R
- F1 sur une fonction R afin d’être dirigé directement vers l’aide ou soumettre ?nomdelafonction
- script R : où vous écrivez votre code, enregistré sous .R (s’ouvre avec n’importe quel éditeur de texte)
- Rmarkdown ou Quarto: pour mettre en forme des documents contenant à la fois du texte, des instructions R et le résultat fourni par R.
Créer son répertoire de travail
On peut dire au logiciel où se trouve nos fichiers
setwd("D:/formation/R")
Il est conseillé de créer un nouveau projet (File: New project) lorsque vous commencez un nouveau traitement, tous vos objets R seront sauvegardés (programmes, images, sorties) au même endroit.
La commande getwd indique le répertoire sur lequel vous travaillez:
getwd()
Informer en début ou fin de programme quelles versions de R et de packages on utilise:
sessionInfo()
Installer et activer des packages
En clic bouton: cliquer dans la fenêtre en bas à droite de R Studio sur l’onglet Packages, cliquer sur Install et écrire le nom du package
En code :
install.packages("questionr")
Ne pas oublier les guillemets entre le nom du package.
Attention ne pas oublier qu’à chaque fois que vous ouvrez R, et après avoir installer les packages, il faut les charger avec la commande library
Ou cocher les packages en bas à droite de votre Rstudio dans l’onglet “Packages”
Importer des données
Vous pouvez importer en clic bouton un fichier texte, excel, SPSS, SAS ou Stata (menu File: Import Dataset).
Importer un fichier Excel: cliquer sur le bouton browse et selectionner son fichier:
Importer des données
Recupérer le code avec un copier-coller:
library(questionr)
library(readxl)
idf <- read_excel("idf.xlsx")
Importer un fichier texte: En clic bouton: File : Import Dataset : From Text(base)
En code: temperature <-read.table("temperature.txt",header=TRUE, sep="\t", na.strings="NA", dec=",")
header : intitules des variables sep : séparateur de colonnes dec : séparateur de décimal
Ou un fichier CSV:
smp<- read.csv2("smp1.csv")
Décrire ses données
Nous allons utiliser le fichier d’exemple TEO
load("./materiel/FPA_TEO1_v4.RData")
Le tableau individus x variables est un dataframe dans R
Tapez le nom du tableau de données puis entrée : affiche le tableau de données ou cliquer dans l’interface graphique sur l’icone tableau à droite:
Contenu d’une table et type des variables
Plusieurs types de variables : “numeric”, “integer”, “character” ou “factor”
Description de toutes les variables selon leur type
summary(FPA)
ID POIDSI SEXEE SEXEE_clair
Min. : 1000 Min. : 13.19 1:10281 Masculin:10281
1st Qu.:10973 1st Qu.: 255.86 2:11480 Féminin :11480
Median :20723 Median : 394.96
Mean :20630 Mean : 1594.55
3rd Qu.:30390 3rd Qu.: 674.58
Max. :40000 Max. :59700.82
age_tranches taille poids poids_rec S_ETAT
Length:21761 Min. :145.3 Min. : 47.81 Min. :47.81 1:8656
Class :character 1st Qu.:161.7 1st Qu.: 62.01 1st Qu.:62.01 2:9453
Mode :character Median :167.6 Median : 67.59 Median :67.59 3:2995
Mean :168.1 Mean : 69.96 Mean :68.90 4: 523
3rd Qu.:174.7 3rd Qu.: 75.90 3rd Qu.:75.90 5: 113
Max. :189.7 Max. :999.00 Max. :93.47 9: 21
S_ETAT_clair F_DIP F_DIP_clair SITUAE
Très Bon :8656 4 :4369 CAP_BEP :4369 1:14387
Bon :9453 8 :3846 Sup_Bac+2 :3846 2: 197
Moyen :2995 1 :3559 Aucun :3559 3: 2335
Mauvais : 523 7 :2335 Bac+2 :2335 4: 2284
Très Mauvais: 113 6 :2273 Bac_général:2273 5: 319
NSP : 21 (Other):4998 (Other) :4998 6: 1709
NA's : 381 NA's : 381 7: 530
SITUAE_clair P_NSTPTC P_SATPTC cs_act_6T
Emploi :14387 1 : 1159 1 :11073 5 :4842
Apprentissage: 197 2 : 119 2 : 2202 6 :3707
Etudes : 2335 NA's:20483 NA's: 8486 4 :3332
Chômage : 2284 3 :2130
Retraite : 319 2 : 874
AuFoyer : 1709 (Other): 95
Autre : 530 NA's :6781
cs_act_6T_clair GROUP1 GROUP1_clair INATUE
Employés :4842 1:8456 Immigré :8456 1:16852
Ouvriers :3707 2: 712 Natif DOM : 712 2: 1542
ProfInter :3332 3:8161 Descendant Immigré-s:8161 3: 3367
Cadres :2130 4: 651 Descendant DOM : 651
Arti_Comm_Chef: 874 5:3781 Autres résid. Fr. :3781
(Other) : 95
NA's :6781
INATUE_clair regionnaise2_11t L_AUJC
Française :16852 Length:21761 1 : 3124
UE : 1542 Class :character 2 : 1872
Etrangère (hors UE): 3367 Mode :character 3 : 742
4 : 37
9 : 1
NA's:15985
L_AUJC_clair L_AUJE L_AUJE_clair L_AUJL
Très Bien : 3124 1 : 2043 Très Bien : 2043 1 : 2674
Bien : 1872 2 : 1367 Bien : 1367 2 : 1577
Un peu : 742 3 : 1609 Un peu : 1609 3 : 1099
Pas du tout: 37 4 : 757 Pas du tout: 757 4 : 426
NSP : 1 NA's:15985 NA's :15985 NA's:15985
NA's :15985
L_AUJL_clair L_AUJP L_AUJP_clair FRAUJ
Très Bien : 2674 1 : 2908 Très Bien : 2908 0 : 28
Bien : 1577 2 : 1963 Bien : 1963 1 : 2992
Un peu : 1099 3 : 851 Un peu : 851 2 : 801
Pas du tout: 426 4 : 54 Pas du tout: 54 3 : 1955
NA's :15985 NA's:15985 NA's :15985 NA's:15985
FRAUJ_clair A_PERMIS D_DISCRI D_DISCRI_clair
Pas du tout : 28 1:16086 1: 1028 Souvent: 1028
Autres cas : 2992 2: 5675 2: 3849 Parfois: 3849
Très bien parlé et compris: 801 3:16784 Jamais :16784
Que des très bien : 1955 8: 7 Refus : 7
NA's :15985 9: 93 NSP : 93
D_PQDISC_A D_PQDISC_B D_PQDISC_C D_PQDISC_D D_PQDISC_E D_PQDISC_F D_PQDISC_G
0:21323 0:21339 0:21608 0:19859 0:18969 0:21334 0:21342
1: 438 1: 422 1: 153 1: 1902 1: 2792 1: 427 1: 419
D_PQDISC_H D_PQDISC_I D_PQDISC_J D_PQDISC_K D_PQDISC_L D_PQDISC_FLAG P_DRECH
0:21600 0:21725 0:21372 0:21450 0:21277 -1: 67 1: 2307
1: 161 1: 36 1: 389 1: 311 1: 484 -2: 1 2:19235
0:16884 9: 219
1: 4809
P_DISPQ_A P_DISPQ_B P_DISPQ_C P_DISPQ_D P_DISPQ_E P_DISPQ_F P_DISPQ_G
0:21502 0:21586 0:21203 0:20587 0:21646 0:21363 0:20178
1: 259 1: 175 1: 558 1: 1174 1: 115 1: 398 1: 1583
P_DISPQ_FLAG T_VIOLEN demarches T_DIPLOM T_DIPLOM_clair
-1: 259 1: 784 1 : 401 1 :10784 Aucun :10784
-2: 4 2:20930 2 : 4476 2 : 2640 CEP : 2640
0:17998 9: 47 NA's:16884 4 : 1836 CAP_BEP: 1836
1: 3500 99 : 1507 NSP : 1507
3 : 1324 Brevet : 1324
(Other): 3661 (Other): 3661
NA's : 9 NA's : 9
T_DIPLOP T_DIPLOP_clair cs_mere_6T cs_mere_6T_clair
1 :9172 Aucun :9172 5 :6388 Employés :6388
4 :2604 CAP_BEP :2604 6 :2583 Ouvriers :2583
99 :2416 NSP :2416 4 :1969 ProfInter :1969
2 :2372 CEP :2372 2 :1251 Arti_Comm_Chef:1251
8 :2195 Sup_Bac+2:2195 1 : 729 Agriculteurs : 729
(Other):2905 (Other) :2905 (Other): 909 (Other) : 909
NA's : 97 NA's : 97 NA's :7932 NA's :7932
cs_pere_6T cs_pere_6T_clair regionnaism2_11t regionnaisp2_11t
6 :10155 Ouvriers :10155 Length:21761 Length:21761
2 : 2873 Arti_Comm_Chef: 2873 Class :character Class :character
4 : 2376 ProfInter : 2376 Mode :character Mode :character
5 : 2188 Employés : 2188
3 : 2029 Cadres : 2029
(Other): 1928 (Other) : 1928
NA's : 212 NA's : 212
TYPM5_MEN TYPM5_MEN_clair MATRIE MATRIE_clair GROUP1CA
1: 2857 Personne seule : 2857 1: 9757 Celibataire: 9757 1 :5305
2: 2310 Fam.Monoparentale : 2310 2:10471 Marié.e :10471 2 : 335
3: 2997 Couple sans enfant: 2997 3: 249 Veuf.ve : 249 3 :1822
4:12348 Couple avec enfant:12348 4: 1284 Divorcé.e : 1284 4 : 131
5: 1249 Autre type : 1249 5 :8179
9 : 3
NA's:5986
GROUP1CA_clair ap_renc ap_m_civ ap_m_relig
Immigré :5305 Min. :1955 Min. :1960 Min. :1962
Natif DOM : 335 1st Qu.:1981 1st Qu.:1984 1st Qu.:1989
Descendant Immigré-s:1822 Median :1990 Median :1994 Median :1998
Descendant DOM : 131 Mean :1989 Mean :1992 Mean :1995
Autres résid. Fr. :8179 3rd Qu.:1998 3rd Qu.:2001 3rd Qu.:2003
NSP : 3 Max. :2010 Max. :2010 Max. :2010
NA's :5986 NA's :10644 NA's :10893 NA's :20024
C_RCTLIC_A C_RCTLIC_B C_RCTLIC_C C_RCTLIC_D C_RCTLIC_E C_RCTLIC_F C_RCTLIC_G
0:19215 0:19128 0:19288 0:20319 0:21123 0:20619 0:20716
1: 2546 1: 2633 1: 2473 1: 1442 1: 638 1: 1142 1: 1045
C_RCTLIC_H C_RCTLIC_I C_RCTLIC_J C_RCTLIC_K C_RCTLIC_L C_RCTLIC_M C_RCTLIC_N
0:21337 0:21409 0:21565 0:21592 0:21530 0:21584 0:21736
1: 424 1: 352 1: 196 1: 169 1: 231 1: 177 1: 25
C_RCTLIC_O C_RCTLIC_FLAG nbunions_t ma_force
0:21378 -1: 68 0 : 5451 1 : 1234
1: 383 0: 8088 plus de 1:16310 2 : 518
1:13605 3 : 325
8 : 1
9 : 40
NA's:19643
ma_force_clair ma_init ma_init_clair
Oui à ce moment : 1234 3 : 8259 Ensemble : 8259
Oui mais plus tard : 518 2 : 1160 Votre conjoint.e : 1160
Non pression famille: 325 1 : 897 Vous-même : 897
Refus : 1 4 : 875 Parents/Beaux-parents: 875
NSP : 40 5 : 51 Autre pers. famille : 51
NA's :19643 (Other): 56 (Other) : 56
NA's :10463 NA's :10463
Description de la variable sexe
summary(FPA$SEXEE)
1 2
10281 11480
Attention on doit toujours mettre nom de la table$nom de la variable, et pas le nom de la variable seule.
DataExplorer
Voir les valeurs manquantes
La fonction suivante permet d’avoir une représentation graphique de la part des valeurs manquantes, par variable. Ainsi, si on se base sur les 10 premières variables du dataframe FPA, on obtient la représentation ci dessous :
Tris à plat: distribution des valeurs
table(FPA$regionnaisp2_11t)
9999 Afrique subsaharienne Algérie
53 2188 2343
Asie Autres pays DOM
1246 1780 1180
Espagne/Italie France métro Maroc/Tunisie
1783 4665 2376
Portugal Turquie UE27
1688 1283 1079
# Affichage des valeurs manquantes
table(FPA$regionnaisp2_11t, useNA = "ifany")
9999 Afrique subsaharienne Algérie
53 2188 2343
Asie Autres pays DOM
1246 1780 1180
Espagne/Italie France métro Maroc/Tunisie
1783 4665 2376
Portugal Turquie UE27
1688 1283 1079
<NA>
97
Tris à plat: distribution des valeurs
# avec des pourcentages (package questionr)
freq(FPA$regionnaisp2_11t)
n % val%
9999 53 0.2 0.2
Afrique subsaharienne 2188 10.1 10.1
Algérie 2343 10.8 10.8
Asie 1246 5.7 5.8
Autres pays 1780 8.2 8.2
DOM 1180 5.4 5.4
Espagne/Italie 1783 8.2 8.2
France métro 4665 21.4 21.5
Maroc/Tunisie 2376 10.9 11.0
Portugal 1688 7.8 7.8
Turquie 1283 5.9 5.9
UE27 1079 5.0 5.0
NA 97 0.4 NA
#Tris à plat avec pondération
<-wtd.table(FPA$regionnaisp2_11t, weights=FPA$POIDSI,normwt=T)
resultprop.table(result)*100
9999 Afrique subsaharienne Algérie
0.2563999 1.5133015 5.2188465
Asie Autres pays DOM
0.5587221 3.0115168 1.2953399
Espagne/Italie France métro Maroc/Tunisie
2.9744202 75.6531928 4.2796721
Portugal Turquie UE27
2.3169533 0.8576965 2.0639385
Tris croisés
table(FPA$D_DISCRI, FPA$SEXEE)
1 2
1 557 471
2 1931 1918
3 7740 9044
8 5 2
9 48 45
# avec pondération
=wtd.table(FPA$D_DISCRI,FPA$SEXEE,weights=FPA$POIDSI)
tw3cprop(tw3)
1 2 Ensemble
1 2.4 2.1 2.2
2 9.2 10.8 10.0
3 88.3 86.8 87.6
8 0.0 0.0 0.0
9 0.1 0.3 0.2
Total 100.0 100.0 100.0
lprop(tw3)
1 2 Total
1 51.9 48.1 100.0
2 45.2 54.8 100.0
3 49.6 50.4 100.0
8 71.8 28.2 100.0
9 27.2 72.8 100.0
Ensemble 49.2 50.8 100.0
Résumer une variable numérique
Pour chaque calcul, ajouter l’option na.rm=TRUE car R ne calcule pas s’il y a des manquants (NA):
min(FPA$ap_renc,na.rm = TRUE)
[1] 1955
max(FPA$ap_renc,na.rm = TRUE)
[1] 2010
On peut le stocker dans un objet R comme valeur réutilisable
<-min(FPA$ap_renc,na.rm = TRUE) anrencmin
Calcul d’une variable numérique
On va calculer depuis combien d’année les personnes sont ensembles
#annee d'enquete (2008) - annee de rencontre
$durenc=2008-FPA$ap_renc
FPA# on regarde la moyenne
mean(FPA$durenc,na.rm = TRUE)
[1] 19.20671
# ou directement le résumé avec
summary(FPA$durenc)
Min. 1st Qu. Median Mean 3rd Qu. Max. NA's
-2.00 10.00 18.00 19.21 27.00 53.00 10644
Graphiques
Rappel: on selectionne le type de graphique selon le type des variables.
Plus d’infos sur https://www.data-to-viz.com/)
Boite à moustaches
Pour décrire une variable numérique continue:
Ajout d’option titre, légende et couleur
Toutes les couleurs en anglais sont acceptées
Boite à moustaches
Pour représenter le croisement entre une variable qualitative et une variable quantitative :
Cliquez sur Zoom pour voir tous les labels lorsque vous avez beaucoup de valeurs
Nuage de point
Pour représenter le croisement entre deux variables quantitatives
Nuage de point
Pour voir les points en transparence:
Diagramme en baton
Pour représenter une variable qualitative
En vertical:
En horizontal:
Diagramme de Cleveland
Esquisse: faire des graphiques sans coder
Telecharger une seule fois le package:
install.packages("esquisse")
Cliquer sur le menu Addins: ggplot2 builder
Importer des données: soit dejà dans R: donc on selectionne “Environment” et on choisi la table R (ici FPA), Soit par un fichier exterieur (“External file”). On vérifie si les variables sont au bon format (numerique ou factor) dans l’onglet “Update”.
Si c’est ok on clique sur “Import data”.
On arrive dans le menu avec toutes nos variables, selectionner dans X et Fill pour 2 variables qualitatives (en orange), ou X et Y pour 2 variables quantitatives (en bleu).
Esquisse
On peut facilement changer les couleurs, le type de graphique et récupérer le code (ggplot2)
Manipulation des données avec R de base
Selection de variables et d’observation
Entre crochet on a la selection de ligne , selection de colonne
=FPA[1:100, 1:12] extrait
Nouvelle base extrait qui contient les 100 premières lignes et la 1ère à la 12ème variables (ou colonnes) de la base FPA.
Selection de variables (ou colonnes)
=FPA[, 3:12]
extrait#ou on nomme les noms des variables
= FPA[, c("GROUP1", "SEXEE", "D_DISCRI")] extrait2
ou supprimer des variables:
=FPA[,-c(2:3)] extrait2
Selection d’observations (ou de lignes)
ex : Selection de tous les hommes
<- FPA[FPA$SEXEE == "1", ] dh
Selection de toutes les lignes sauf les hommes (donc selection des femmes)
<- FPA[FPA$SEXEE != "1", ] df
Nous verrons qu’avec le package dplyr, la selection de variable ou d’observation et tout autre manipulation sur les données sera facilitées.
Convertir des données
#De numérique ou caractère à facteur
$ap_rencfac <- factor(FPA$ap_renc)
FPA
#De facteur ou numérique en caractère:
$regionnaisc <- as.character(FPA$regionnaise2_11t)
FPA
#Convertir en numérique
<- as.numeric(as.character(FPA$T_DIPLOM)) test
Recodage et création de variables
La commande levels donne les résultats suivants :
levels(FPA$D_DISCRI)
[1] "1" "2" "3" "8" "9"
#On recode
levels(FPA$D_DISCRI)<-c("Souvent" ,"Parfois" , "Jamais","Refuse de répondre","Ne sait pas")
levels(FPA$D_DISCRI)
[1] "Souvent" "Parfois" "Jamais"
[4] "Refuse de répondre" "Ne sait pas"
Recodage et création de variables
En clic bouton vous pouvez utiliser iorder, icut et irec (du package questionr) et récupérer le code:
pour réordonner des valeur:
iorder(FPA$D_DISCRI)
pour classer des variables numériques (ex: classe d’âge):
icut(hdv2003)
pour créer et recoder plus facilement:
irec(FPA$D_DISCRI)
N’oubliez pas de faire executer le code généré.
Organiser et traiter plus facilement ses données avec le package dplyr
Package dplyr
Package développé par Hadley Wickham,(R Studio) qui a aussi développé ggplot2 et fait partie du tidyverse (ensemble de packages qui fonctionne ensemble). Utilisation d’une grammaire {dplyr}, composée essentiellement de 5 verbes qui vont indiquer des opérations courantes sur les lignes et les colonnes d’une structure de données.
Installer et activer le package avant de commencer:
library(dplyr)
# ou installer tidyverse qui contient tous les packages utiles par la suite
library(tidyverse)
Les 5 verbes (ou fonction) de base de dplyr
Se poser les questions:
- Sur quel data frame je travaille ?
- Que dois je faire avec ?
select(): Sélection de colonnes (variables)
filter(): Sélection de lignes (observations)
arrange(): Ordonne les lignes du dataframe (ou table)
mutate(): Ajout de colonnes (création de variables)
summarise(): Production de statistiques résumées
Select: Sélection de variables
select()
permet de définir une liste de variables à sélectionner dans le data frame résultant.
Syntaxe : select(dataframe,liste_de_variables)
Liste de variables séparées par des “,” ou :
Facilités d’écriture pour éviter d’écrire de nombreuses variables:
starts_with()
: commence par
ends_with()
: fini par
contains()
: contient
one_of()
: contient un ensemble d’éléments
everything()
: toutes les variables
Exemples :
=select(FPA,D_DISCRI,SEXEE,regionnaise2_11t,GROUP1) # ouvrir la table a pour voir le résultat à chaque fois
FPA_v2=select(FPA,GROUP1:D_DISCRI) # on selectionne les variables GROUP1 à D_DISCRI
FPA_v2=select(FPA,GROUP1,starts_with("D_")) # on selectionne les variables GROUP1 et toutes celles commençant par "D_" (variables de discrimminations)
FPA_v2=select(FPA,contains("GROUP")) # on selectionne les variables qui contiennent le mot "GROUP" dans le nom de la variable
FPA_v2
#Supprimer des variables avec -
=select(FPA,-starts_with("C_")) # on supprime les variables qui commencent par "C_"
FPA_v2=select(FPA,-ends_with("_E")) # on supprime les variables qui finissent par "_E"
FPA_v2=select(FPA,-contains("_")) # on supprime les variable qui contiennent un _ (trait souligné)
FPA_v2=select(FPA, -GROUP1CA, -nbunions_t) # on supprime les variables GROUP1CA et nbunions_t FPA_v2
Filter: Sélection d’observations
filter()
permet de définir une liste d’observations sélectionnées en regard de conditions
Exemples:
= filter(FPA,GROUP1==1)
FPA_v2= filter(FPA, GROUP1==1 & D_DISCRI %in% c("Souvent","Parfois"))
FPA_v2= filter(FPA,is.na(F_DIP)) # selection des manquants FPA_v2
On utlise %in%
lorsqu’on selectionne plusieurs valeurs, si on en selectionne une seule valeur c’est ==
.
Selection des valeurs qui contiennent tel mot (equivalent contains
) avec grepl
ex: selection des valeurs qui contiennent le mot Etudiant
test=filter(FPA, grepl('Couple',TYPM5_MEN))
Arrange: Trier les observations
arrange()
permet de réordonner les observations en fonction de clés de tris. Une option desc permet de trier par valeurs décroissantes. Il est possible d’indiquer plusieurs clés d’ordonnancement.
Exemples:
# croissant:
=arrange(FPA,SEXEE,D_DISCRI)
FPA_v2# decroissant:
=arrange(FPA,desc(SEXEE)) FPA_v2
Mutate: Création de variables
mutate()
permet de créer une variable en fonction de variables existantes.
Exemples:
#ifelse pour creer une variable avec 2 valeurs (equivalent de =SI() dans Excel)
=mutate(FPA,discri=ifelse(D_DISCRI %in% c("1","2"),"1","0"))
FPA_v2
#case_when() pour des conditions avec plusieurs modalités
=mutate(FPA_v2,group2=case_when(
FPA_v2%in% c("1","2") ~ "Immigrés (ou natif DOM)",
GROUP1 == "5" ~ "Groupe majoritaire",
GROUP1 %in% c("3","4") & (regionnaism2_11t =="France métro" | regionnaisp2_11t =="France métro") ~ "Descendant d'un immigré",
GROUP1 %in% c("3","4") & (regionnaism2_11t !="France métro" & regionnaisp2_11t !="France métro") ~ "Descendant 2 immigrés",
GROUP1 %in% c("3","4") & (is.na(regionnaism2_11t) | is.na(regionnaisp2_11t)) ~ "Descendant 2 immigrés"))
GROUP1 #l'ordre de ces conditions est important : Il faut aller du plus spécifique au plus général.
#verifier
table(FPA_v2$discri,FPA_v2$D_DISCRI)
Souvent Parfois Jamais Refuse de répondre Ne sait pas
0 1028 3849 16784 7 93
table(FPA_v2$group2,FPA_v2$GROUP1)
1 2 3 4 5
Descendant 2 immigrés 0 0 5090 346 0
Descendant d'un immigré 0 0 3071 305 0
Groupe majoritaire 0 0 0 0 3781
Immigrés (ou natif DOM) 8456 712 0 0 0
Chainage des opérations avec le “pipe” %>%
Une fois qu’on connait ces premiers élements l’interêt est de pouvoir les combiner.
Par exemple :
#peu lisible
<-arrange(select(filter(FPA, SEXEE == "2"),SEXEE, starts_with("D_")))
FPA_v2#ou remettre à chaque fois le nom de la table
<- filter(FPA, SEXEE == "2")
tmp <- select(tmp,SEXEE, D_DISCRI, D_PQDISC_A, D_PQDISC_B)
tmp arrange(tmp, D_DISCRI)
# A tibble: 11,480 × 4
SEXEE D_DISCRI D_PQDISC_A D_PQDISC_B
<fct> <fct> <fct> <fct>
1 2 Souvent 0 0
2 2 Souvent 0 1
3 2 Souvent 0 0
4 2 Souvent 0 0
5 2 Souvent 0 0
6 2 Souvent 1 1
7 2 Souvent 0 0
8 2 Souvent 1 0
9 2 Souvent 1 0
10 2 Souvent 0 0
# ℹ 11,470 more rows
#Avec dplyr et le %\>% on obtient:
<- FPA %>%
hdvffilter(SEXEE == "2") %>%
select(SEXEE, starts_with("D_")) %>%
arrange(D_DISCRI)
# Autre exemple:
<- FPA %>%
FPA_v2 filter(GROUP1 %in% c("1","2")) %>%
mutate(discri=ifelse(D_DISCRI %in% c("1","2"),"1","0"))
La fonction group_by
La fonction group_by s’utilise avec les %>% et permet de définir des groupes de lignes à partir des valeurs d’une ou plusieurs colonnes
Exemples :
# creation de variable avec group by:
<- FPA %>%
FPA_v3 group_by(SEXEE) %>%
mutate(moyrenc = mean(durenc, na.rm = TRUE)) %>%
select(SEXEE,GROUP1,durenc,moyrenc)
# group_by peut aussi être utile avec filter :
<- FPA %>%
FPA_v3 group_by(SEXEE) %>%
filter(durenc == max(durenc, na.rm = TRUE))
La fonction summarise
summarise()
permet de produire des statistiques à un niveau agrégé. Il faut indiquer le(s) critère(s) d’agrégation et la (les) statistique(s) à calculer.
Une instruction group_by est indispensable pour specifier en amont les critères d’agregation
Quelques exemples de fonctions : count, mean, sum, max
Il est possible de préciser des conditions dans les calculs (exemple sum(x>10))
La fonction summarise
Le résultat peut être stocké au niveau individuel (mutate) ou agrégé (summarise)
Une option na.rm=T permet d’éliminer les observations pour lesquelles figure une valeur manquante.
Une instruction ungroup() peut être necessaire pour réinitaliser le calcul de variables individuelles.
Exemple:
%>%
FPA summarise(minanneer = min(ap_renc, na.rm=TRUE),
maxanneer = max(ap_renc, na.rm=TRUE))
# A tibble: 1 × 2
minanneer maxanneer
<dbl> <dbl>
1 1955 2010
# avec group by
%>%
FPA group_by(SEXEE) %>%
summarise(minanneer = min(ap_renc, na.rm=TRUE),
maxanneer = max(ap_renc, na.rm=TRUE),
Nbpers = n())
# A tibble: 2 × 4
SEXEE minanneer maxanneer Nbpers
<fct> <dbl> <dbl> <int>
1 1 1960 2009 10281
2 2 1955 2010 11480
# Le resultat peut aussi etre stocké à un niveau individuel
=FPA %>%
resultgroup_by(SEXEE) %>%
summarise(minanneer = min(ap_renc, na.rm=TRUE),
maxanneer = max(ap_renc, na.rm=TRUE),
Nbpers = n())
Calculer un rang
= FPA %>%
FPA # group_by(SEXEE) %>%
mutate(rang=row_number())
Les jointures et empilements
Syntaxe générale:
Type_de_jointure(dataframes, by="cle")
Les clés de jointure peuvent être de noms différents.
Plusieurs types de jointure dans dplyr (équivalent du code sql):
Inner join: Selection des observations communes entre les 2 tables.
Exemple: teo3 = inner_join(teo1,teo2,by="id")
Les jointures
Full join: Selection de toutes les observations
Exemple si l’identifiant n’a pas le même nom:
teo3=full_join(teo1,teo2, by = c("id" = "id2"))
Left join: Selection des observations présentes dans la première table
Right join: Selection des observations présentes dans la deuxième table
Une “cheat sheet” de R Studio sur les jointures résume bien ce que ça fait:
Les jointures
- Semi join: garde que les lignes et colonnes de table1 presente aussi dans table2
- Anti join: garde que les lignes et colonnes dans table1 et pas dans table2
Les jointures
Il faut que les variables soient communes entre les 2 tables jointes pour utiliser les fonctions ci-dessous (pas besoin de clé de jointure):
Les empilements
Lorsque les variables sont les memes entre 2 tables et que les individus sont différents :
bind_rows()
Exemple:
= bind_rows(teo1,teo2)
teo_fin
# pour voir de quel table viennent les lignes: .id
=bind_rows(teo1,teo2, .id = "source") teo_fin
Limites des jointures
Variables de même nom conservées dans le dataframe de sortie (avec suffixe .x et .y par défaut)
Pas de possibilité de lier directement 3 dataframes via dplyr
Transformation des données
Tidy datas : Par définition, une donnée est représentée par une valeur sur une ligne (observation) pour une mesure (variable). Sinon, il faut transformer les données.
library(tidyr)
C’est notamment très utilisé si on souhaite passer d’une base individus à une base ménage ou inversement.
Pivot_wider : de long en large
Permet de restructurer un dataframe par information (1 ligne = 1 information, et non un individu)
Ici nous allons voir comment passer d’une observation niveau logement à une observation niveau individu ?
Avec le code de base puis en améliorant le code au fur et à mesure
# Fichier en entree
=read.csv2("./materiel/LOG.csv")
LOG
# code de base: pivot_wider
= LOG %>% pivot_wider(names_from = Age, values_from = SO_LOG)
IND
# on retire la variable dep_log pour obtenir un seul individu par ligne
= LOG %>%
IND select(-DEPT_LOG) %>%
pivot_wider(names_from = Age, values_from = SO_LOG)
# on ajoute le suffixe age comme nom de variable
= LOG %>%
IND select(-DEPT_LOG) %>%
mutate(Age=paste0("Age",Age)) %>%
pivot_wider(names_from = Age, values_from = SO_LOG)
# On garde uniquement les changements de STATUT
= LOG %>%
IND2 arrange(IDENT,Age) %>%
group_by(IDENT) %>%
filter(SO_LOG!=lag(SO_LOG) | row_number()==1) %>%
mutate(Rang=paste0("STA_",row_number())) %>%
select(-DEPT_LOG,-Age) %>%
pivot_wider(names_from = Rang, values_from = SO_LOG)
# resultat
head(IND2)
# A tibble: 6 × 6
# Groups: IDENT [6]
IDENT STA_1 STA_2 STA_3 STA_4 STA_5
<int> <chr> <chr> <chr> <chr> <chr>
1 101 Parents "Propri�taire" <NA> <NA> <NA>
2 102 Parents "Locataire priv�" Propri�taire <NA> <NA>
3 103 Parents "Autre" Propri�taire <NA> <NA>
4 104 Parents "" HLM Propri�taire <NA>
5 105 Parents "" Parents Locataire priv� <NA>
6 106 Parents "HLM" Propri�taire <NA> <NA>
Pivot_longer : de large en long
Exemple : Comment passer d’une observation niveau individu (vecteur de positions résidentielles) à une observation niveau logement ?
= IND %>%
LOG2 pivot_longer(starts_with("Age"), names_to = "Age", values_to = "SO_LOG") %>%
filter (SO_LOG != is.na(SO_LOG)) %>% # on retire si c'est manquant
arrange(IDENT)
#On revient au fichier d'origine
Autre exemple:
= data.frame( Pays=c("Danemark","Finlande","Norvege","Suede"),
Pop Pop1980=c(5120,4771,4079,8303),
Pop1990=c(5135,4974,4233,8527),
Pop2000=c(5330,5171,4478,8861),
Pop2010=c(5535,5351,4855,9341))
View(Pop)
=Pop %>%
PopLongpivot_longer(c(Pop1980, Pop1990, Pop2000,Pop2010), names_to = "Var", values_to = "Valeur")
# même chose avec stats_with pour ne pas écrire toutes les variables
=Pop %>%
PopLongpivot_longer(starts_with("Pop"), names_to = "Var", values_to = "Valeur")
# La transformation de cette table nous permet maintenant de réaliser le graphique suivant:
%>%
PopLong mutate(annee=as.numeric(substr(Var,4,7))) %>%
ggplot(aes(x = annee, y = Valeur, color = Pays)) +
geom_line()
Traitements massifs et opérations sur les métadonnées
L’objectif est de pouvoir appliquer plusieurs fonctions à plusieurs variables.
A partir d’un fichier contenant des caractéristiques démographiques de communes d’Ile de France de 1954 à 1990, on cherche à déterminer quelles sont les populations minimales, moyennes et maximales des populations 1968 à 1990, par département ?
# Intégration des données
load("./materiel/idf1.RData")
# summarise_all
= idf1 %>%
X select(dep,starts_with("pt"),starts_with("na")) %>%
group_by(dep) %>%
summarise_all(funs(min,max,mean))
# summarise_at
= idf1 %>%
X2 group_by(dep) %>%
summarise_at(vars(starts_with("pt")),funs(min,max,mean))
Traitements massifs et opérations sur les métadonnées
Transformer toutes les variables de type facteur en variable de type caractère h2 = FPA %>% mutate_if(is.factor,as.character)
Renommer une série de variables:
rename_at
Recodification automatique:
mutate_at
Changement de type:
mutate_if
Sauvegarder son travail et recharger ses données
Les programmes R sont enregistrés avec l’extension .R, on peut l’ouvrir avec bloc note ou word.
Sauvegarder son dataframe:
save(FPA_v2, file = "teo_fin.RData")
Sauvegarder son projet ou son environnement R Studio:
save.image("travail_teo.RData")
Recharger ses données R:
load("teo_fin.RData")
Exporter dans un fichier excel
library("writexl")
write_xlsx(FPA,"./materiel/teo.xlsx")
Références
Rzine, pour la diffusion et le partage de ressources sur la pratique de R en Sciences Humaines et Sociales:
https://rzine.fr/Tidyverse :
https://www.tidyverse.org/Documentation de Julien Barnier :
https://juba.github.io/tidyverse/02-prise_en_main.htmlDocumentation de Joseph Larmarange :
http://larmarange.github.io/analyse-R/presentation-et-philosophie.htmlWickham, Hadley. «Tidy Data». Journal of Statistical Software; Vol 1, Issue 10 (2014) :
https://www.jstatsoft.org/v059/i10Cheat sheets :
https://www.rstudio.com/resources/cheatsheets/Séminaire RUSS :
https://russ.site.ined.fr/