Blog ENI : Toute la veille numérique !
-25€ dès 75€ sur les livres en ligne, vidéos... avec le code FUSEE25. J'en profite !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici

Structure des données avec R

Introduction

R est un langage statistique et à ce titre, il permet de manipuler des tableaux multidimensionnels à travers un nombre varié de conteneurs ou de structures de données. Nativement, on distingue cinq types de structures de données R, qu’on peut regrouper en deux catégories :

  • Les structures de données homogènes : il s’agit des vecteurs, des matrices et des tableaux multidimensionnels.

  • Les structures de données hétérogènes : on distingue les data frames, sans doute les plus fameuses de toutes, et les listes.

Ce chapitre sera essentiellement consacré à l’étude individuelle de ces structures de données à travers notamment leur manipulation grâce à des fonctions adéquates.

Les vecteurs

Un vecteur est une simple succession de données homogènes (de même type) ou plus banalement, un tableau unidimensionnel de données ayant le même mode(). Concrètement, on peut l’imaginer comme une colonne ou une ligne du tableur Microsoft Excel. 

1. Création de vecteur

Il existe plusieurs fonctions pour créer un vecteur, et sans doute la plus répandue et connue est c(), qui permet de combiner une suite d’éléments (séparés par des virgules) fournis en arguments pour renvoyer en résultat un vecteur :

images/03EP01.png

Il est impératif que les données que l’on combine pour former un vecteur avec la fonction c() soient de même type, autrement, s’il arrivait qu’il y ait un mélange de types comme dans le cas ci-dessous, R se charge de convertir l’ensemble des données en un seul type de données (et ce n’est peut-être pas l’objectif) :

images/03EP02.png

De plus, R offre une multitude de manières de créer un vecteur. Ainsi, il est possible de déclarer des vecteurs vides avec la fonction vector(), qui peut prendre en arguments : mode, le type des éléments (numeric, logical, character, par défaut vector() est de type logique) et la longueur désignée par length :

images/03EP03.png

Il est parfois intéressant de créer des vecteurs vides comme ci-dessus, surtout lorsque l’on compte les remplir au fur et à mesure du développement des données, ces fonctions peuvent être préférées à la fonction c(). À ce titre, on dispose également des fonctions numeric(), double(), etc. pour créer des vecteurs de types spécifiques.

Il faut noter que c() peut servir aussi pour la création de vecteur vide x <- c().

2. Manipulations d’un vecteur

La fonction c() nous permet de combiner ou de concaténer plusieurs données. Ainsi, comme premier outil de contrôle, il y a la fonction length() qui permet de modifier la longueur d’un vecteur.

images/03EP04.png

Comme on peut l’observer à la sixième ligne du code ci-dessus, la fonction length() permet également de modifier ou de fixer la longueur d’un vecteur. Et à la douzième ligne, on voit comment combiner des vecteurs en un seul avec la fonction c().

Le plus...

Les matrices

Les matrices sont des tableaux à deux dimensions contenant des données homogènes, de même mode(). On peut les voir aussi comme une combinaison de vecteurs de même type.

1. Construction d’une matrice

Comme avec les vecteurs, il existe plusieurs manières d’obtenir un objet de classe matrix. Toutefois, le constructeur direct de matrice est la fonction matrix() :

a. Le constructeur matrix()

Avec R, la fonction ordinaire pour construire des matrices est la fonction matrix(). Cette fonction prend en argument un vecteur, et nrow, le nombre de lignes et/ou ncol, le nombre de colonnes définissant la dimension de la matrice.

images/03EP89.png

Pour terminer, on a également byrow, un argument optionnel qui reçoit un booléen TRUE ou FALSE pour savoir si les données entrées en argument doivent être rangées selon les lignes (TRUE) ou selon les colonnes (FALSE). Par défaut, les données sont rangées selon les colonnes :

images/03EP90.png

Même si les matrices sont bien connues pour être des objets fondamentaux en mathématique, il n’en demeure pas moins qu’on peut créer des matrices autres que de type numérique :

images/03EP91.png

Notons par ailleurs que la spécification des arguments n’est pas nécessaire, seules leurs valeurs le sont, ainsi les lignes de commandes suivantes se valent :

images/03EP92.png

La fonction matrix() peut prendre à la place d’un vecteur une valeur atomique notamment pour former certains types de matrices :

images/03EP93.png

b. Combiner des vecteurs en matrice

Il est possible de créer des matrices à partir de vecteurs avec les fameuses fonctions rbind() et cbind(), où les préfixes "r" et "c" renvoient respectivement à row (ligne) et column (colonne) :

images/03EP94.png

Il faut noter que jusqu’ici on s’est assuré que le nombre de colonnes ou de lignes est un diviseur de la taille du vecteur affecté à la fonction matrix(). Dans le cas de rbind() et cbind(), il est également convenu que les vecteurs à combiner ont la même taille. Cependant, qu’arriverait-il si l’on devait formater un vecteur de taille 5 en une matrice de 2 lignes ? Ou d’une manière générale, qu’adviendrait-il si on essayait de combiner des vecteurs de tailles différentes pour en faire une matrice ?...

Les tableaux multidimensionnels avec array()

Les arrays ou tableaux multidimensionnels sont semblables à une matrice, mais ils ont la propriété de pouvoir aller au-delà de deux dimensions. Ainsi, comme une matrice, un array n’accepte que des données homogènes.

Ceci est typiquement le cas des images trichromiques à synthèse additive RGB (Red Green Blue) comme l’illustre la figure suivante par exemple :

images/03EP156.png

Donc la manipulation d’arrays est entre autres fréquente en traitement d’image.

1. Création d’un tableau multidimensionnel

C’est la fonction array() qui permet la création de tableaux multidimensionnels. Elle prend en argument un vecteur à formater en tableau, un vecteur pour définir les dimensions du tableau avec dim et un autre vecteur pour nommer chaque dimension avec dimnames. Ce dernier argument est optionnel, mais très pratique pour se retrouver lorsque l’on travaille avec plus de deux dimensions :

images/03EP157.png

Il est également possible d’utiliser la fonction dim() pour convertir un simple vecteur en un tableau multidimensionnel :

images/03EP158.png

2. Nommer un tableau multidimensionnel

Nommer un array se fait avec l’argument dimnames à la création, qui prend une liste des noms des dimensions et/ou des lignes et/ou des colonnes par dimension :

images/03EP159.png

On peut au besoin extraire individuellement les noms comme ceci :...

Les facteurs ou variables catégoriels

Un facteur est structurellement un vecteur qui prend en charge les variables ou données catégorielles. Une variable est catégorielle si elle n’admet pour valeur que des modalités bien déterminées.

À titre d’exemple, on peut citer :

  • Le genre est une variable catégorielle, car elle admet des valeurs bien déterminées à savoir Masculin et Féminin.

  • La variable classe sociale peut prendre Riche, Pauvre, etc.

1. Création d’un facteur

Un facteur ne gère que des échelles, des catégories, des classes et des états. Pour construire un facteur, on utilise la fonction factor() qui traite aussi bien des valeurs ou modalités qualitatives que quantitatives. La fonction factor() prend en argument trois principaux arguments dont notamment un vecteur x ( nécessaire).

Dans l’exemple ci-dessous, la variable jours contient les jours de naissance d’un groupe de dix élèves :

images/03EP164.png

Et deux autres arguments optionnels à savoir :

  • levels : prend en valeur un vecteur contenant les modalités possibles, par défaut, si levels n’est pas spécifié, R retient systématiquement une occurrence de chaque élément distinct contenu dans le vecteur x.

images/03EP165.png

La fonction attributes() est une fonction générique qui s’applique à tout objet et renvoie les attributs de ce dernier.

Comme on peut le noter une occurrence seulement de chaque jour de naissance a été retenue. Cependant, il est évident qu’il manque 2 autres jours qui sont des jours possibles de naissance. Ainsi, on peut lors de la création du facteur prévoir toutes les possibilités ou modalités. Dans notre cas...

Les data frame

Un data frame ("trame de donnée" en français) est un tableau à deux dimensions comme une matrice, mais à la différence de cette dernière un data frame admet des colonnes ou vecteurs de types différents (numérique, chaîne de caractères, booléens, etc.), de mêmes tailles. Structurellement, un data frame est une liste de vecteurs de même taille et de types différents.

C’est la structure de donnée la plus répandue étant donnée l’hétérogénéité des types de données que l’on manipule, celles-ci n’étant pas que numériques ou chaînes de caractères ou booléens, mais le plus souvent un mélange de ces types de données.

1. Description d’un data frame

R permet l’accès à un certain nombre de données fournies avec les packages que l’on peut facilement consulter et extraire pour une utilisation voulue, grâce à la fonction data(). C’est un peu comme une base de données interne à R.

La commande suivante affiche la liste de tous les jeux de données disponibles :

images/03EP184.png

Ainsi, parmi les packages de bases que R charge au démarrage, le package datasets offre plusieurs jeux de données dont l’un des plus fameux, le jeu de données iris (qui décrit les caractéristiques de trois espèces de fleurs d’iris) dû à Regan Fisher statisticien et biologiste anglais, qui va servir à titre illustratif pour comprendre les caractéristiques d’un data frame :

images/03EP185.png

La fonction str() permet de visualiser la structure interne d’une structure de donnée, ici celle de ”iris” montre qu’elle est composée de 5 vecteurs ou colonnes ou mieux 5 variables dont 4 sont de type numérique et 1 de type chaîne de caractères, mais formatée en facteur à 3 niveaux ou modalités.

Bien sûr, on pourrait explorer le jeu de données en l’affichant comme tout objet, par son nom ou avec la fonction print().

Toutefois, procéder ainsi n’est pas très commode si l’on dispose d’un data frame dépassant les milliers de lignes ou de colonnes. Ainsi, R offre des fonctions telles...

Les listes

Une liste est une collection d’objets R. De ce fait, c’est structurellement un vecteur capable de contenir d’autres types d’objets ou structures de données comme les collecteurs ou conteneurs dans les autres langages-objets comme Java, C++, C #, etc.

1. Construction d’une liste

Une liste est créée au moyen du constructeur list() qui prend en argument des objets à contenir.

Si on considère les cinq objets de types différents suivants :

images/03EP269.png

On peut créer un objet de type liste qui est simplement une collection de l’ensemble de ces objets :

images/03EP270.png

Comme on a pu le voir avec des objets complexes comme les data frames, il est parfois préférable d’avoir un aperçu de la structure interne d’un objet avec str(), plutôt que d’afficher l’ensemble dans la console :

images/03EP271.png

Tout comme avec les vecteurs, on peut également lire la taille d’une liste avec length() :

images/03EP272.png

Il est aussi possible de nommer les objets contenus dans une liste soit à la création comme ci-dessous :

images/03EP273.png

Soit après avec la fonction names() :

images/03EP274.png

2. Indexation des objets d’une liste

a. Extraction à l’intérieur des crochets ou doubles crochets

Comme avec les autres objets, on peut réaliser des extractions à l’intérieur des crochets avec les listes également. Ainsi, une extraction entre crochets [ ] renvoie...