3) Manipuler des tableaux de données
ISIG, UMR 5600 EVS
2024-10-01
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,
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”.
Examinons la commande suivante:
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()
.
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…
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:
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:
On peut également utiliser les fonctionnalités de RStudio pour afficher et modifier la table.
[1] "haircolor" "hairpattern" "sex" "weight"
[5] "age" "foodtype"
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 variablesmutate()
permet de créer et ajouter de nouvelles variables (colonnes)summarise()
permet de résumer plusieurs valeurs en une seuleselect() permet de sélectionner des variables
Par exemple, on peut sélectionner des variables de la table air
weight | age |
---|---|
4.6 | 12 |
5.5 | 6 |
weight | age |
---|---|
4.6 | 12 |
5.5 | 6 |
select() permet de sélectionner de multiples variables, en passant par la notation var_1:var_n
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 |
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é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:
On peut combiner plusieurs conditions logiques (ET logique, par une virgule ou un &, OU logique, par l’opérateur |).
Par exemple,
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 |
Vous pouvez également utiliser l’opérateur %in%
:
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
):
et pour ordonner par ordre décroissant, on utilise desc():
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
:
Je peux créer une nouvelle variable hair
en collant haircolor
et hairpattern
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”:
Si l’on souhaite calculer quelques statistiques un peu basiques sur un jeu de données, on peut utiliser la fonction summarise().
Par exemple:
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():
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):
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:
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: