Textométrie

3) Manipuler des tableaux de données

Lise Vaudor

ISIG, UMR 5600 EVS

2024-10-01

Lecture de tables: trouver son fichier!

Pour lire un tableau de données il faudra indiquer le chemin du fichier…

Si vous travaillez sous forme de projets .Rproj alors le plus simple est d’indiquer le chemin relatif par rapport au dossier racine (celui qui contient le .Rproj).

Notez l’usage des slashs (/) et non d’antislashs, quel que soit votre système d’exploitation.

Par exemple,

path="data/data_brute/supertableau.csv"

Si pour une raison ou une autre vous avez besoin de remonter dans l’arborescence des fichiers (c’est généralement non recommandé mais ça peut arriver), vous pouvez le faire avec “../”.

Par exemple “../../donnees_hydro” vous fait remonter de deux niveaux dans l’arborescence avant de vous faire redescendre dans un dossier “donnees_hydro”.

Lecture de tables: Fonctions read_csv() ou read_delim()

Examinons la commande suivante:

catdata <- readr::read_delim("../../../datasets/catdata.csv",
                             delim=";")
head(catdata,3)  # 3 premieres lignes du tableau
haircolor hairpattern sex weight age foodtype
red solid female 4.6 12 other
black tabby female 5.5 6 dry
white tabby female 5.6 8 wet

Notez que le format csv correspond à des valeurs séparées par une virgule (“csv”= Coma Separated Values).

Pour lire une table qui comprendrait un type de séparateur différent (par exemple, un espace, ou un point-virgule), on peut utiliser la fonction read_delim().

Jeu de données illustratif

Dans la suite de ce document nous allons utiliser un jeu de données catdata comprenant un certain nombre de variables relatives à des chats.

Il s’agit de données fictives, créées de toute pièce dans un but pédagogique…

catdata <- readr::read_delim("../../../datasets/catdata.csv", delim=";")
catdata
haircolor hairpattern sex weight age foodtype
red solid female 4.6 12 other
black tabby female 5.5 6 dry
white tabby female 5.6 8 wet
red tabby female 6.1 5 dry
brown solid female 5.3 7 dry
black tabby male 6.9 5 wet
brown solid male 6.3 5 dry
black colorpoint female 5.5 4 wet
white tortoise male 4.3 5 wet
red solid female 2.3 3 dry
black tabby male 3.6 8 wet
black solid female 6.7 5 dry
brown tipped male 5.2 7 dry
brown tabby male 4.6 5 wet
black solid male 5.1 6 dry
black tipped male 5.5 6 dry
black tipped male 6.3 4 dry
white tabby male 4.1 8 wet
red colorpoint female 3.9 8 dry
red tabby female 4.6 7 dry
black solid male 4.0 5 wet
white colorpoint male 3.5 6 dry
brown colorpoint female 4.4 6 other
brown colorpoint male 5.6 4 dry
red tortoise female 5.9 8 wet
black solid male 5.9 6 wet
black tabby female 4.1 7 wet
white tipped male 6.2 7 dry
brown tabby male 5.7 8 dry
black tabby male 5.6 4 dry
black tabby male 5.5 6 wet
brown tipped female 6.1 3 dry
black colorpoint female 5.5 5 dry
white solid female 6.0 5 dry
black tipped male 7.5 4 dry
black colorpoint female 5.4 12 other
black solid female 3.9 10 wet
brown tabby female 3.8 6 dry
black tabby male 3.5 3 dry
black colorpoint male 4.5 8 dry
black tortoise female 5.1 8 dry
red tabby female 5.6 8 dry
black tabby female 4.7 7 dry
black solid male 5.9 11 dry
red colorpoint male 5.9 17 wet
black solid male 5.6 6 dry
black tabby male 6.1 5 dry
red colorpoint female 5.5 5 dry
black tabby male 6.4 5 dry
black tabby male 5.2 5 dry
black solid female 2.8 11 dry
white solid female 3.2 4 other
black tortoise male 4.7 6 dry
red solid male 5.5 6 dry
black tabby female 4.3 10 wet
white tipped male 5.6 5 wet
white tabby male 3.5 5 dry
brown solid female 5.4 5 other
black tabby female 1.9 17 dry
black colorpoint male 4.4 6 dry
black colorpoint male 5.0 4 dry
black tortoise female 4.2 7 wet
black tabby female 3.4 6 wet
black tabby male 4.4 6 dry
black solid female 5.3 10 dry
red tabby female 4.6 3 dry
black tabby female 4.3 4 dry
white tabby female 4.3 6 dry
black colorpoint male 7.1 5 wet
black tortoise female 3.8 8 dry
black tipped male 4.0 3 wet
white colorpoint male 4.6 4 wet
red tipped male 4.5 3 dry
black tabby female 5.1 6 dry
brown tipped male 4.8 3 dry
black colorpoint male 3.7 3 wet
red solid male 4.1 5 wet
brown tabby female 4.1 4 dry
black solid female 4.8 6 dry
black tortoise female 3.7 4 wet
brown tabby male 5.0 8 dry
red tortoise female 3.4 13 wet
black tipped female 3.8 4 dry
black tabby male 5.7 11 dry
black tortoise male 5.1 7 dry
black tabby male 5.8 4 dry
black solid male 5.5 4 dry
white tabby female 4.8 6 wet
brown solid female 5.9 8 dry
red tabby male 6.1 7 dry
black tipped male 5.4 5 wet
black tabby female 7.0 5 wet
black solid female 3.5 4 dry
red tabby female 4.5 3 dry
white tipped male 4.6 7 dry
black tabby male 5.2 5 dry
brown tabby male 4.2 8 dry
brown tipped female 4.4 3 dry
black solid female 5.4 5 dry
black solid male 5.2 6 dry
brown tipped male 5.0 8 dry
black tipped female 6.7 3 dry
black tabby male 5.1 4 wet
red solid male 4.7 9 wet
black tabby male 6.3 7 dry
black solid male 4.2 7 wet
brown tipped female 2.9 8 dry
white tabby male 4.8 9 wet
red tabby female 6.6 7 dry
red tabby female 3.3 7 wet
black tortoise female 4.9 7 wet
black tortoise female 4.8 5 dry
black tortoise male 5.4 4 dry
black tipped male 4.9 6 dry
red tortoise female 4.8 7 dry
black solid female 5.3 3 dry
red tabby male 4.0 4 other
black solid male 7.1 5 wet
black tortoise male 5.0 8 dry
white tipped female 5.8 5 dry
black tabby female 3.9 6 other
brown solid male 5.9 4 dry
red tipped female 3.8 4 dry
black tabby male 4.4 7 dry
white tortoise male 5.3 4 dry
black tipped female 3.1 7 dry
black tipped female 5.7 4 dry
white solid male 2.5 3 wet
brown tabby female 5.1 9 wet
black tabby male 5.7 5 dry
white tabby male 4.0 4 dry
red tabby female 6.5 9 dry
red tortoise female 3.5 7 other
black tabby male 5.9 11 dry
white solid female 4.8 7 dry
white tabby male 5.1 2 dry
black solid female 6.2 17 dry
red tabby female 4.4 5 dry
red solid female 4.5 5 wet
red tortoise male 4.8 9 dry
black colorpoint male 3.8 4 dry
white solid female 4.7 9 dry
white colorpoint male 4.5 5 dry
red tabby female 5.1 3 dry
white tortoise male 6.4 4 wet
black tabby female 2.6 10 dry
black colorpoint male 4.5 4 dry
black tabby female 4.1 3 wet
brown tabby female 6.3 3 dry
black tabby female 5.2 5 wet
brown tabby female 4.3 3 other
red tabby male 3.8 4 wet
black tortoise male 4.2 6 dry

Les variables de ce jeu de données sont les suivantes:

  • haircolor: la couleur du poil (catégoriel)
  • hairpattern: le “pattern” coloré du poil (catégoriel)
  • sex: le sexe du chat (catégoriel)
  • weight: son poids (quantitatif)
  • age: son âge (quantitatif)
  • foodtype: le type d’alimentation (catégoriel)

Nettoyer ses données

Attention, utilisateurs de tableurs, cette diapo est pour vous…

Si vous avez des difficultés à lire votre tableau des données, c’est sans doute parce que celui-ci n’est pas un tableau de données brutes.

Pour lire un tableau de données sous R, il convient d’abord de nettoyer ce tableau:

  • Vérifier que les noms de colonnes ne contiennent pas de caractères spéciaux ou des espaces, avoir des noms de variables courts mais explicites
  • Vérifier si certains champs correspondent en fait à des commentaires, si votre tableur contient des graphiques, etc..

Ceci n’est pas de la donnée brute!

Tidy data

illustration: Allison Horst

Tidy data

illustration: Allison Horst

Lecture de tables: en passant par RStudio

On peut également utiliser les fonctionnalités de RStudio pour afficher et modifier la table.

Structure et dimensions d’une table

colnames(catdata) # nom des colonnes
[1] "haircolor"   "hairpattern" "sex"         "weight"     
[5] "age"         "foodtype"   
dim(catdata) # dimensions
[1] 153   6
nrow(catdata) # nombre de lignes
[1] 153
ncol(catdata) #nombre de colonnes
[1] 6

Pour afficher les premières lignes du tableau:

head(catdata)
haircolor hairpattern sex weight age foodtype
red solid female 4.6 12 other
black tabby female 5.5 6 dry
white tabby female 5.6 8 wet
red tabby female 6.1 5 dry
brown solid female 5.3 7 dry
black tabby male 6.9 5 wet

dplyr: Introduction()

dplyr est un package qui permet de faire simplement diverses opérations sur les tableaux de données:

  • select() permet de sélectionner des variables (colonnes)
  • filter() permet de filtrer les individus (lignes)
  • arrange() permet de réarranger le tableau selon l’ordre des variables
  • mutate() permet de créer et ajouter de nouvelles variables (colonnes)
  • summarise() permet de résumer plusieurs valeurs en une seule

dplyr: select()

select() permet de sélectionner des variables

Par exemple, on peut sélectionner des variables de la table air

head(catdata)
haircolor hairpattern sex weight age foodtype
red solid female 4.6 12 other
black tabby female 5.5 6 dry
white tabby female 5.6 8 wet
red tabby female 6.1 5 dry
brown solid female 5.3 7 dry
black tabby male 6.9 5 wet
  • en spécifiant les noms ou numéros des variables à conserver
data <- select(catdata,weight, age)
head(data,2)
weight age
4.6 12
5.5 6
data <- select(catdata,4,5)
head(data,2)
weight age
4.6 12
5.5 6
  • en spécifiant le nom ou les numéros des variables à écarter avec le signe -
data <- select(catdata,-hairpattern,-haircolor)
head(data,2)
sex weight age foodtype
female 4.6 12 other
female 5.5 6 dry

dplyr: select()

select() permet de sélectionner de multiples variables, en passant par la notation var_1:var_n

head(catdata)
haircolor hairpattern sex weight age foodtype
red solid female 4.6 12 other
black tabby female 5.5 6 dry
white tabby female 5.6 8 wet
red tabby female 6.1 5 dry
brown solid female 5.3 7 dry
black tabby male 6.9 5 wet
data <- select(catdata,sex:foodtype)
head(data)
sex weight age foodtype
female 4.6 12 other
female 5.5 6 dry
female 5.6 8 wet
female 6.1 5 dry
female 5.3 7 dry
male 6.9 5 wet

ou encore en passant par des fonctions auxiliaires. On peut citer par exemple:

  • starts_with pour les variables qui commencent par un texte donné
  • ends_with pour les variables qui terminent par un texte donné
  • contains pour les variables qui contiennent un texte donné
  • etc.

Par exemple:

data <- select(catdata,starts_with("hair"))
head(data)
haircolor hairpattern
red solid
black tabby
white tabby
red tabby
brown solid
black tabby

dplyr: filter()

filter() permet de filtrer les lignes du tableau en fonction des valeurs de telle ou telle variable.

Ici, par exemple, on cherche toutes les lignes qui correspondent au mois de juillet:

data <- filter(catdata,haircolor=="red")
nrow(data)
[1] 29
head(data)
haircolor hairpattern sex weight age foodtype
red solid female 4.6 12 other
red tabby female 6.1 5 dry
red solid female 2.3 3 dry
red colorpoint female 3.9 8 dry
red tabby female 4.6 7 dry
red tortoise female 5.9 8 wet

On peut combiner plusieurs conditions logiques (ET logique, par une virgule ou un &, OU logique, par l’opérateur |).

Par exemple,

  • pour ne conserver que les lignes qui telles que age>10 et weight>5:
data <- filter(catdata, age>10, weight>5)
data
haircolor hairpattern sex weight age foodtype
black colorpoint female 5.4 12 other
black solid male 5.9 11 dry
red colorpoint male 5.9 17 wet
black tabby male 5.7 11 dry
black tabby male 5.9 11 dry
black solid female 6.2 17 dry
  • pour ne conserver que les lignes telles que haircolor soit “red” ou “black”:
data <- filter(catdata, haircolor=="red"|haircolor=="black")
nrow(data)
[1] 108

Vous pouvez également utiliser l’opérateur %in%:

data <- filter(catdata, haircolor %in% c("red","black"))
nrow(data)
[1] 108

dplyr: arrange()

Pour réarranger un tableau selon l’ordre d’une variable, on peut faire appel à la fonction arrange (ici, par exemple on réordonne catdata selon l’ordre croissant de age et weight):

data <- arrange(catdata,age, weight)
head(data)
haircolor hairpattern sex weight age foodtype
white tabby male 5.1 2 dry
red solid female 2.3 3 dry
white solid male 2.5 3 wet
black tabby male 3.5 3 dry
black colorpoint male 3.7 3 wet
black tipped male 4.0 3 wet

et pour ordonner par ordre décroissant, on utilise desc():

data <- arrange(catdata,desc(age))
head(data)
haircolor hairpattern sex weight age foodtype
red colorpoint male 5.9 17 wet
black tabby female 1.9 17 dry
black solid female 6.2 17 dry
red tortoise female 3.4 13 wet
red solid female 4.6 12 other
black colorpoint female 5.4 12 other

dplyr: mutate()

Pour créer de nouvelles variables et les ajouter au tableau de données on peut utiliser la fonction mutate().

Voici par exemple comment procéder si je souhaite créer une nouvelle variable, age_humain, à partir de age:

data=mutate(catdata,
            age_humain=age*7)
head(data)
haircolor hairpattern sex weight age foodtype age_humain
red solid female 4.6 12 other 84
black tabby female 5.5 6 dry 42
white tabby female 5.6 8 wet 56
red tabby female 6.1 5 dry 35
brown solid female 5.3 7 dry 49
black tabby male 6.9 5 wet 35

Je peux créer une nouvelle variable hair en collant haircolor et hairpattern

data <- mutate(catdata,
               hair=paste(haircolor,"-",hairpattern,sep=""))
head(data)
haircolor hairpattern sex weight age foodtype hair
red solid female 4.6 12 other red-solid
black tabby female 5.5 6 dry black-tabby
white tabby female 5.6 8 wet white-tabby
red tabby female 6.1 5 dry red-tabby
brown solid female 5.3 7 dry brown-solid
black tabby male 6.9 5 wet black-tabby

Si je réutilise un nom de colonne déjà présent dans la table, la colonne est “écrasée”:

data <- mutate(catdata,
               age=age*7)
head(data)
haircolor hairpattern sex weight age foodtype
red solid female 4.6 84 other
black tabby female 5.5 42 dry
white tabby female 5.6 56 wet
red tabby female 6.1 35 dry
brown solid female 5.3 49 dry
black tabby male 6.9 35 wet

dplyr: summarise()

Si l’on souhaite calculer quelques statistiques un peu basiques sur un jeu de données, on peut utiliser la fonction summarise().

Par exemple:

data <- summarise(catdata,
                  mean_age=mean(age),
                  nb_patterns=n_distinct(hairpattern),
                  nb_Mesures=n())
data
mean_age nb_patterns nb_Mesures
6.124183 5 153

Et surtout, si je souhaite calculer une statistique pour différents groupes (définis ici, par exemple, par la variable Month), je vais le spécifier dans l’argument spécifiant la table de données, à l’aide de group_by():

data <- summarise(group_by(catdata,foodtype),
                  mean_age=mean(age),
                  nb_Mesures=n())
data
foodtype mean_age nb_Mesures
dry 6.019608 102
other 6.555556 9
wet 6.285714 42

dplyr: Chaînage

Vous avez vu que les fonctions de dplyr permettaient de faire toutes sortes d’opérations sur les tableaux de données. Il est bien entendu possible de les combiner pour réaliser des opérations complexes…

Imaginons par exemple que l’on souhaite répondre à une question telle que

“Quelle est le poids moyen des chats de plus de 10 ans en fonction de leur type de nourriture

Pour répondre à cette question, je pourrais par exemple (il y a en fait plusieurs possibilités):

  • filtrer pour ne garder que les chats de plus de 10 ans
  • grouper par type de nourriture
  • résumer l’information en moyenne de poids

dplyr: Chaînage

Classiquement, pour coder cette chaîne d’opérations sous R, on procéderait de la manière suivante:

data1 <- filter(catdata, age>10)
data2 <- group_by(data1, foodtype)
data3 <- summarise(data2,
                   mean_weight=mean(weight),
                   .groups="drop") 

dplyr: Chaînage

Si je souhaitais réaliser cet enchaînement de commandes en une seule opération, et ainsi éviter la création d’objets intermédiaires data1, data2, etc., voici (classiquement) comment il faudrait procéder:

data <-summarise(group_by(filter(catdata,
                          age>10),
                 foodtype),
          mean_weight=mean(weight),
          .groups="drop")
data
foodtype mean_weight
dry 4.733333
other 5.000000
wet 4.650000

dplyr: Chaînage

dplyr permet d’inverser l’ordre de cette syntaxe en permettant d’utiliser un opérateur (l’opérateur “pipe”) qui s’écrit de la manière suivante : %>% et que l’on pourrait (en gros) traduire par “et puis”

Voyez plutôt comment le code ci-dessus peut être simplifié par l’usage de cet opérateur:

data <- catdata %>%
  filter(age>10) %>% 
  group_by(foodtype) %>% 
  summarise(mean_age=mean(age))

On récapitule!

On a parlé de quoi, déjà?
  • chemins, répertoires de travail
  • lecture/écriture de tables (nature du séparateur de colonnes, du séparateur décimal)
  • description sommaire & affichage de tables
  • manipulation de tables avec dplyr
    • sélection de variables (select)
    • filtre des lignes (filter)
    • tri des lignes (arrange)
    • transformation des colonnes (mutate)
    • agrégation de l’information (summarise)
  • chaînage des instructions avec le pipe : %>%