Débuter avec R

Support de formation

Date de publication

6 décembre 2024

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

library(questionr)

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

valeurs_manquantes<-is.na(FPA$F_DIP)
library(DataExplorer)
plot_intro(FPA)

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 :

plot_missing(FPA[,1:10])

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 
result<-wtd.table(FPA$regionnaisp2_11t, weights=FPA$POIDSI,normwt=T)
prop.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 
tw3=wtd.table(FPA$D_DISCRI,FPA$SEXEE,weights=FPA$POIDSI)
cprop(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

anrencmin<-min(FPA$ap_renc,na.rm = TRUE)

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
FPA$durenc=2008-FPA$ap_renc
# 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:

boxplot(FPA$durenc)

Ajout d’option titre, légende et couleur

boxplot(FPA$durenc, main = "Distribution de la durée de couple",ylab = "Année",col="blue")

Toutes les couleurs en anglais sont acceptées

Boite à moustaches

Pour représenter le croisement entre une variable qualitative et une variable quantitative :

boxplot(FPA$durenc~FPA$SEXEE,ylab="Année",xlab="Sexe")

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

#exemple avec ce jeu de données du package questionr
data("hdv2003")
plot(hdv2003$age,hdv2003$freres.soeurs)

Nuage de point

Pour voir les points en transparence:

plot(hdv2003$age, hdv2003$freres.soeurs, pch = 19, col = rgb(1, 0, 0, 0.1))

Diagramme en baton

Pour représenter une variable qualitative

En vertical:

plot(FPA$D_DISCRI)

En horizontal:

barplot(height=table(FPA$D_DISCRI),horiz=TRUE)

Diagramme de Cleveland

dotchart(table(FPA$regionnaise2_11t))

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

extrait=FPA[1:100, 1:12] 

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)

extrait=FPA[, 3:12] 
#ou on nomme les noms des variables
extrait2= FPA[, c("GROUP1", "SEXEE", "D_DISCRI")]

ou supprimer des variables:

extrait2=FPA[,-c(2:3)] 

Selection d’observations (ou de lignes)

ex : Selection de tous les hommes

dh <- FPA[FPA$SEXEE == "1", ]   

Selection de toutes les lignes sauf les hommes (donc selection des femmes)

df <- FPA[FPA$SEXEE != "1", ]  

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 
FPA$ap_rencfac <- factor(FPA$ap_renc)

#De facteur ou numérique en caractère:
FPA$regionnaisc <- as.character(FPA$regionnaise2_11t)

#Convertir en numérique
test <- as.numeric(as.character(FPA$T_DIPLOM))

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 :

FPA_v2=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  
  
#Supprimer des variables avec -  
FPA_v2=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

Filter: Sélection d’observations

filter() permet de définir une liste d’observations sélectionnées en regard de conditions

Exemples:

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

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:
FPA_v2=arrange(FPA,SEXEE,D_DISCRI)
# decroissant:
FPA_v2=arrange(FPA,desc(SEXEE))

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)
FPA_v2=mutate(FPA,discri=ifelse(D_DISCRI %in% c("1","2"),"1","0"))

#case_when() pour des conditions avec plusieurs modalités
FPA_v2=mutate(FPA_v2,group2=case_when(
  GROUP1 %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"))
#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
FPA_v2<-arrange(select(filter(FPA, SEXEE == "2"),SEXEE, starts_with("D_")))
#ou remettre à chaque fois le nom de la table
tmp <- filter(FPA,  SEXEE == "2")
tmp <- select(tmp,SEXEE, D_DISCRI, D_PQDISC_A, D_PQDISC_B)
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:
hdvf<- FPA %>% 
  filter(SEXEE == "2") %>% 
  select(SEXEE, starts_with("D_")) %>% 
  arrange(D_DISCRI)  

# Autre exemple:
FPA_v2 <- FPA %>%
  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_v3 <- FPA %>% 
  group_by(SEXEE) %>% 
  mutate(moyrenc = mean(durenc, na.rm = TRUE)) %>%
  select(SEXEE,GROUP1,durenc,moyrenc)

# group_by peut aussi être utile avec filter :
FPA_v3 <- FPA %>% 
  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 
result=FPA %>%
  group_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:

teo_fin = bind_rows(teo1,teo2)

# pour voir de quel table viennent les lignes: .id
teo_fin=bind_rows(teo1,teo2, .id = "source")

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 
LOG=read.csv2("./materiel/LOG.csv")

# code de base: pivot_wider
IND= LOG %>% pivot_wider(names_from = Age, values_from = SO_LOG)

# on retire la variable dep_log pour obtenir un seul individu par ligne
IND = LOG %>% 
  select(-DEPT_LOG) %>% 
  pivot_wider(names_from = Age, values_from = SO_LOG)

# on ajoute le suffixe age comme nom de variable
IND = LOG %>% 
  select(-DEPT_LOG) %>%
  mutate(Age=paste0("Age",Age)) %>%
  pivot_wider(names_from = Age, values_from = SO_LOG)

# On garde uniquement les changements de STATUT 
IND2 = LOG %>% 
  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 ?

LOG2 = IND %>% 
  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:

Pop = data.frame( Pays=c("Danemark","Finlande","Norvege","Suede"),
                  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)

PopLong=Pop  %>%
  pivot_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
PopLong=Pop  %>%
  pivot_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  
X = idf1 %>%   
 select(dep,starts_with("pt"),starts_with("na")) %>%  
  group_by(dep) %>%  
  summarise_all(funs(min,max,mean))  

# summarise_at  
X2 = idf1 %>%  
  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