3.4 Les matrices
Dans ce chapitre, nous allons voir notre seconde structure de données avancée : les matrices. Une matrice en R correspond à son équivalent mathématique : il s'agit d'une sorte de "tableau" qui contient généralement des nombres, et qui est organisé en ligne et en colonnes.
Créer une matrice
Pour déclarer une matrice en R, il suffit d'utiliser la fonction matrix()
et de lui spécifier au moins deux éléments parmis trois :
- Le nombre de lignes de la matrice avec l'argument
nrow
. - Le nombre de colonnes de la matrice avec l'argument
ncol
. - Des données pour remplir la matrice avec l'argument
data
.
Commencons par créer une matrice vide, de taille 2*2 :
matrix(nrow = 2, ncol = 2)
Le résultat que l'on obtient est une matrice deux par deux, remplie de NA
:
Il est également possible de fourni un vecteur en données, et alors il n'est utile que de préciser une seule dimension de la matrice. Si nous donnons un vecteur de 4 nombres et deux colonnes, alors R saura que la matrice finale sera une matrice 2*2.
matrix(data = c(1, 2, 3, 4), nrow = 2)
Remarque : Si vous fournissez un vecteur trop grand, alors les élements en trop par rapport aux dimensions de la matrice ne seront pas utilisées. A l'inverse si il manque des éléments, ceux du vecteur seront "recyclés" jusqu'a remplir la matrice.
Modifier le sens de remplissage
Par défaut, le remplissage de la matrice se fait en colonne . Si vous voulez la remplir par les lignes, il faut utiliser le paramétre byrow
et lui spéficier la valeur TRUE
:
matrix(data = c(1, 2, 3, 4), nrow = 2, byrow = TRUE)
Créer une matrice d'autres élements que des nombres
Nous avons pour le moment crée des matrices uniquement composées de nombres, car cela correspond à leur usage mathématique. Mais R permet de créer des matrices composées de n'importe quel type de donnée.
Nous pouvons par exemple créer une matrice de chaines de caractères :
matrix(data = c("Washington", "Adams", "Jefferson", "Madison"), nrow = 2)
Tous les types atomiques integer
, double
, complex
, character
et logical
peuvent être utilisés pour créer une matrice.
Il est aussi possible de créer une matrice à partir d'autres types de données, comme une list
:
matrix(data = list(1, 67, "George", "Washington"), nrow = 2)
En pratique, on utilise principalement les types atomiques pour créer des matrices, et rarement d'autres types comme list
ou closure
, car cela a peu de sens.
La notion de class et de structure de données
Les matrices en R ne sont pas un type de données, mais une structure de données. C'est à dire qu'elles permettent de décrire comment organiser et manipuler les données, quelle que soit la nature de ces données en question. Si on regarde le type de données d'une matrice de nombres, on obtient ainsi le type correspondant aux données passées en argument data
:
ma_matrice = matrix(data = c(1, 2, 3, 4), nrow = 2)
typeof(ma_matrice)
Voici ce qu'affiche la console :
Nous voyons bien que le type de notre variable est double
, car nous avons passé en argument data
un vecteur de type double
. Notre matrice est bien une matrice de nombres, qui représente fondementalement des nombres de type double
.
Si vous passer en argument data
un vecteur de booléen, le type de la matrice sera logical
. Le type d'une matrice correspond ainsi toujours à la nature des données fondementales contenues dan la matrice.
La class et structure des données
La structure des données en R est représentée par la classe d'un objet/variable, qui est donnée par la fonction class()
:
ma_matrice = matrix(data = c(1, 2, 3, 4), nrow = 2)
class(ma_matrice)
Nous pouvons voir ici que notre variable ma_matrice
est bien de classe matrix
.
Cette classe représente comment les données sont structurées, et comment elles peuvent être manipuler par l'utilisateur. Une structure de donnée complexe est ainsi toujours composées de données d'un des types de bases, et par une classe qui indique la façon dont ces données sont organisées.
Nous pouvons voir les types de données comme des petite briques, et les structures avancées comme les matrices comme des constructions particuliéres réalisée à partir de ces données.
Il est fondementale de bien faire la différence entre la class et de type d'un objet et bien comprendre à chaque fois de quoi l'on parle.
Remarque : Tous les éléments ont une classe. Les objets qui représentent la nature des données (les vecteurs, listes, fonctions etc) ont alors une classe qui est identique à leur type. Par exemple la classe du vecteur c("Washington")
sera character
, comme son type. De même une liste aura la class type
car sa structure de données correspond à son type.
A retenir :
- On peut créer une matrice à l'aide de la fonction
matrix()
et en indiquant des données a l'aide du paramétredata
ainsi qu'en spécifiant les dimensions à l'aide denrow
etncol
. - Si on créer une matrice vide (sans spécifier l'argument
data
) alors elle sera remplie deNA
. - On peut créer une matrice avec n'importe quel type de données : types atomiques, listes.
- Une matrice représente une structure de données, qui correspond à la class
matrix
. - La classe d'un objet indique la structure de données qu'il représente, alors que son type indique la nature des données qu'il contient.
- Les types de bases ont une classe identique à leur type.