4  Tableaux de données

Les tableaux de données, ou data frame en anglais, est un type d’objets essentiel pour les données d’enquêtes.

4.1 Propriétés et création

Dans R, les tableaux de données sont tout simplement des listes (voir Chapitre 3) avec quelques propriétés spécifiques :

  • les tableaux de données ne peuvent contenir que des vecteurs ;
  • tous les vecteurs d’un tableau de données ont la même longueur ;
  • tous les éléments d’un tableau de données sont nommés et ont chacun un nom unique.

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

On peut créer un tableau de données avec la fonction data.frame() :

df <- data.frame(
  sexe =  c("f", "f", "h", "h"), 
  age = c(52, 31, 29, 35), 
  blond = c(FALSE, TRUE, TRUE, FALSE)
)
df
  sexe age blond
1    f  52 FALSE
2    f  31  TRUE
3    h  29  TRUE
4    h  35 FALSE
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 :

length(df)
[1] 3
names(df)
[1] "sexe"  "age"   "blond"

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

nrow(df)
[1] 4
ncol(df)
[1] 3
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() :

row.names(df) <- c("Anna", "Mary-Ann", "Michael", "John")
df
         sexe age blond
Anna        f  52 FALSE
Mary-Ann    f  31  TRUE
Michael     h  29  TRUE
John        h  35 FALSE

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

df[1]
         sexe
Anna        f
Mary-Ann    f
Michael     h
John        h
df[[1]]
[1] "f" "f" "h" "h"
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 :

df
         sexe age blond
Anna        f  52 FALSE
Mary-Ann    f  31  TRUE
Michael     h  29  TRUE
John        h  35 FALSE
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.

df["Michael", "age"]
[1] 29
df[c(F, F, T, F), c(F, T, F)]
[1] 29
df[3, "age"]
[1] 29
df["Michael", 2]
[1] 29

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

df[1:2,]
         sexe age blond
Anna        f  52 FALSE
Mary-Ann    f  31  TRUE
df[,c("sexe", "blond")]
         sexe blond
Anna        f FALSE
Mary-Ann    f  TRUE
Michael     h  TRUE
John        h FALSE

Il a suffi de laisser un espace vide avant ou après la virgule.

Avertissement

ATTENTION ! Il est cependant impératif de laisser la virgule pour indiquer à R qu’on souhaite effectuer une indexation à deux dimensions. Si on oublie la virgule, cela nous ramène au mode de fonctionnement des listes. Et le résultat n’est pas forcément le même :

df[2, ]
         sexe age blond
Mary-Ann    f  31  TRUE
df[, 2]
[1] 52 31 29 35
df[2]
         age
Anna      52
Mary-Ann  31
Michael   29
John      35
Note

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

str(df[2, ])
'data.frame':   1 obs. of  3 variables:
 $ sexe : chr "f"
 $ age  : num 31
 $ blond: logi TRUE
str(df[, 2])
 num [1:4] 52 31 29 35
str(df[2])
'data.frame':   4 obs. of  1 variable:
 $ age: num  52 31 29 35
str(df[[2]])
 num [1:4] 52 31 29 35

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

4.3 Afficher les données

Prenons un tableau de données un peu plus conséquent, en l’occurrence le jeu de données ?questionr::hdv2003 disponible dans l’extension questionr et correspondant à un extrait de l’enquête Histoire de vie réalisée par l’INSEE en 2003. Il contient 2000 individus et 20 variables.

library(questionr)
data(hdv2003)

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

View(hdv2003)
Figure 4.1: Interface View() de R RStudio

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 :

head(hdv2003)
  id age  sexe                                              nivetud    poids
1  1  28 Femme Enseignement superieur y compris technique superieur 2634.398
2  2  23 Femme                                                 <NA> 9738.396
3  3  59 Homme                    Derniere annee d'etudes primaires 3994.102
4  4  34 Homme Enseignement superieur y compris technique superieur 5731.662
5  5  71 Femme                    Derniere annee d'etudes primaires 4329.094
6  6  35 Femme        Enseignement technique ou professionnel court 8674.699
                  occup     qualif freres.soeurs clso
1 Exerce une profession    Employe             8  Oui
2       Etudiant, eleve       <NA>             2  Oui
3 Exerce une profession Technicien             2  Non
4 Exerce une profession Technicien             1  Non
5              Retraite    Employe             0  Oui
6 Exerce une profession    Employe             5  Non
                        relig                     trav.imp    trav.satisf
1 Ni croyance ni appartenance                Peu important Insatisfaction
2 Ni croyance ni appartenance                         <NA>           <NA>
3 Ni croyance ni appartenance Aussi important que le reste      Equilibre
4  Appartenance sans pratique Moins important que le reste   Satisfaction
5         Pratiquant regulier                         <NA>           <NA>
6 Ni croyance ni appartenance            Le plus important      Equilibre
  hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
1       Non        Non          Non     Oui    Non    Non   Non         0
2       Non        Non          Non     Non    Non    Oui   Oui         1
3       Non        Non          Non     Non    Non    Non   Oui         0
4       Non        Non          Non     Oui    Oui    Oui   Oui         2
5       Non        Non          Non     Non    Non    Non   Non         3
6       Non        Non          Non     Non    Non    Oui   Oui         2
tail(hdv2003, 2)
       id age  sexe                                       nivetud     poids
1999 1999  24 Femme Enseignement technique ou professionnel court 13740.810
2000 2000  66 Femme  Enseignement technique ou professionnel long  7709.513
                     occup  qualif freres.soeurs clso
1999 Exerce une profession Employe             2  Non
2000              Au foyer Employe             3  Non
                          relig                     trav.imp trav.satisf
1999 Appartenance sans pratique Moins important que le reste   Equilibre
2000 Appartenance sans pratique                         <NA>        <NA>
     hard.rock lecture.bd peche.chasse cuisine bricol cinema sport heures.tv
1999       Non        Non          Non     Non    Non    Oui   Non       0.3
2000       Non        Oui          Non     Oui    Non    Non   Non       0.0

L’extension dplyr propose une fonction dplyr::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.

library(dplyr)
glimpse(hdv2003)
Rows: 2,000
Columns: 20
$ id            <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1…
$ age           <int> 28, 23, 59, 34, 71, 35, 60, 47, 20, 28, 65, 47, 63, 67, …
$ sexe          <fct> Femme, Femme, Homme, Homme, Femme, Femme, Femme, Homme, …
$ nivetud       <fct> "Enseignement superieur y compris technique superieur", …
$ poids         <dbl> 2634.3982, 9738.3958, 3994.1025, 5731.6615, 4329.0940, 8…
$ occup         <fct> "Exerce une profession", "Etudiant, eleve", "Exerce une …
$ qualif        <fct> Employe, NA, Technicien, Technicien, Employe, Employe, O…
$ freres.soeurs <int> 8, 2, 2, 1, 0, 5, 1, 5, 4, 2, 3, 4, 1, 5, 2, 3, 4, 0, 2,…
$ clso          <fct> Oui, Oui, Non, Non, Oui, Non, Oui, Non, Oui, Non, Oui, O…
$ relig         <fct> Ni croyance ni appartenance, Ni croyance ni appartenance…
$ trav.imp      <fct> Peu important, NA, Aussi important que le reste, Moins i…
$ trav.satisf   <fct> Insatisfaction, NA, Equilibre, Satisfaction, NA, Equilib…
$ hard.rock     <fct> Non, Non, Non, Non, Non, Non, Non, Non, Non, Non, Non, N…
$ lecture.bd    <fct> Non, Non, Non, Non, Non, Non, Non, Non, Non, Non, Non, N…
$ peche.chasse  <fct> Non, Non, Non, Non, Non, Non, Oui, Oui, Non, Non, Non, N…
$ cuisine       <fct> Oui, Non, Non, Oui, Non, Non, Oui, Oui, Non, Non, Oui, N…
$ bricol        <fct> Non, Non, Non, Oui, Non, Non, Non, Oui, Non, Non, Oui, O…
$ cinema        <fct> Non, Oui, Non, Oui, Non, Oui, Non, Non, Oui, Oui, Oui, N…
$ sport         <fct> Non, Oui, Oui, Oui, Non, Oui, Non, Non, Non, Oui, Non, O…
$ heures.tv     <dbl> 0.0, 1.0, 0.0, 2.0, 3.0, 2.0, 2.9, 1.0, 2.0, 2.0, 1.0, 0…

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

library(labelled)
look_for(hdv2003)
 pos variable      label col_type missing values                              
 1   id            —     int      0                                           
 2   age           —     int      0                                           
 3   sexe          —     fct      0       Homme                               
                                          Femme                               
 4   nivetud       —     fct      112     N'a jamais fait d'etudes            
                                          A arrete ses etudes, avant la derni~
                                          Derniere annee d'etudes primaires   
                                          1er cycle                           
                                          2eme cycle                          
                                          Enseignement technique ou professio~
                                          Enseignement technique ou professio~
                                          Enseignement superieur y compris te~
 5   poids         —     dbl      0                                           
 6   occup         —     fct      0       Exerce une profession               
                                          Chomeur                             
                                          Etudiant, eleve                     
                                          Retraite                            
                                          Retire des affaires                 
                                          Au foyer                            
                                          Autre inactif                       
 7   qualif        —     fct      347     Ouvrier specialise                  
                                          Ouvrier qualifie                    
                                          Technicien                          
                                          Profession intermediaire            
                                          Cadre                               
                                          Employe                             
                                          Autre                               
 8   freres.soeurs —     int      0                                           
 9   clso          —     fct      0       Oui                                 
                                          Non                                 
                                          Ne sait pas                         
 10  relig         —     fct      0       Pratiquant regulier                 
                                          Pratiquant occasionnel              
                                          Appartenance sans pratique          
                                          Ni croyance ni appartenance         
                                          Rejet                               
                                          NSP ou NVPR                         
 11  trav.imp      —     fct      952     Le plus important                   
                                          Aussi important que le reste        
                                          Moins important que le reste        
                                          Peu important                       
 12  trav.satisf   —     fct      952     Satisfaction                        
                                          Insatisfaction                      
                                          Equilibre                           
 13  hard.rock     —     fct      0       Non                                 
                                          Oui                                 
 14  lecture.bd    —     fct      0       Non                                 
                                          Oui                                 
 15  peche.chasse  —     fct      0       Non                                 
                                          Oui                                 
 16  cuisine       —     fct      0       Non                                 
                                          Oui                                 
 17  bricol        —     fct      0       Non                                 
                                          Oui                                 
 18  cinema        —     fct      0       Non                                 
                                          Oui                                 
 19  sport         —     fct      0       Non                                 
                                          Oui                                 
 20  heures.tv     —     dbl      5                                           

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

look_for(hdv2003, "trav")
 pos variable    label col_type missing values                      
 11  trav.imp    —     fct      952     Le plus important           
                                        Aussi important que le reste
                                        Moins important que le reste
                                        Peu important               
 12  trav.satisf —     fct      952     Satisfaction                
                                        Insatisfaction              
                                        Equilibre                   

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

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

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        poids         
 Enseignement technique ou professionnel court       :463   Min.   :   78.08  
 Enseignement superieur y compris technique superieur:441   1st Qu.: 2221.82  
 Derniere annee d'etudes primaires                   :341   Median : 4631.19  
 1er cycle                                           :204   Mean   : 5535.61  
 2eme cycle                                          :183   3rd Qu.: 7626.53  
 (Other)                                             :256   Max.   :31092.14  
 NA's                                                :112                     
                   occup                           qualif    freres.soeurs   
 Exerce une profession:1049   Employe                 :594   Min.   : 0.000  
 Chomeur              : 134   Ouvrier qualifie        :292   1st Qu.: 1.000  
 Etudiant, eleve      :  94   Cadre                   :260   Median : 2.000  
 Retraite             : 392   Ouvrier specialise      :203   Mean   : 3.283  
 Retire des affaires  :  77   Profession intermediaire:160   3rd Qu.: 5.000  
 Au foyer             : 171   (Other)                 :144   Max.   :22.000  
 Autre inactif        :  83   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  hard.rock  lecture.bd
 Le plus important           : 29   Satisfaction  :480   Non:1986   Non:1953  
 Aussi important que le reste:259   Insatisfaction:117   Oui:  14   Oui:  47  
 Moins important que le reste:708   Equilibre     :451                        
 Peu important               : 52   NA's          :952                        
 NA's                        :952                                             
                                                                              
                                                                              
 peche.chasse cuisine    bricol     cinema     sport        heures.tv     
 Non:1776     Non:1119   Non:1147   Non:1174   Non:1277   Min.   : 0.000  
 Oui: 224     Oui: 881   Oui: 853   Oui: 826   Oui: 723   1st Qu.: 1.000  
                                                          Median : 2.000  
                                                          Mean   : 2.247  
                                                          3rd Qu.: 3.000  
                                                          Max.   :12.000  
                                                          NA's   :5       

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

summary(hdv2003$sexe)
Homme Femme 
  899  1101 
summary(hdv2003$age)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  18.00   35.00   48.00   48.16   60.00   97.00 

4.4 En résumé

  • Les tableaux de données sont des listes avec des propriétés particulières :
    1. tous les éléments sont des vecteurs ;
    2. tous les vecteurs ont la même longueur ;
    3. 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 qu’on utilise usuellement dans d’autres logiciels de statistiques : les variables sont représentées en colonnes et les observations en lignes.
  • Ce sont des objets bidimensionnels : ncol() renvoie le nombre de colonnes et nrow() le nombre de lignes.
  • Les doubles crochets ([[]]) et le symbole dollar ($) fonctionnent comme pour les listes et permettent d’accéder aux variables.
  • Il est possible d’utiliser des coordonnées bidimensionnelles avec les crochets simples ([]) en indiquant un critère sur les lignes puis un critère sur les colonnes, séparés par une virgule (,).

4.5 webin-R

On pourra également se référer au webin-R #02 (les bases du langage R) sur YouTube.