Opérations sur matrices avec R
L’analyse des données repose beaucoup sur les matrices, dans leur sens mathématique mais aussi dans une acception plus large, en particulier celle que lui donne R.
Généralités
Une matrice est un tableau d’éléments de même format. C’est donc un objet monotype. Parce que oui, il existe aussi des matrices de chaînes de caractères et des booléennes (non pas avec des zéros et des 1 mais avec des TRUE et des FALSE).
R crée une matrice par la fonction matrix. Celle-ci a besoin d’au moins deux arguments. Sauf cas particuliers (nous en verrons un plus loin), le premier est le vecteur des éléments. D’autres sont le nombre de lignes, obtenu par nrow et le nombre de colonnes, obtenue par ncol. Nous verrons un autre argument plus loin.
On peut ne spécifier que les nombres de lignes et de colonnes (mais la matrice est vide !). Si l’on spécifie les données et le nombre de lignes, R s’arrange pour trouver le nombre de colonnes.
Exemple :
arbres <- matrix(c('sapin', 'platane', 'marronnier', 'chêne', 'pin', 'bouleau'), nrow=3)
arbres
Affichage avec RStudio (nous avons demandé trois lignes et R a compris que deux colonnes étaient nécessaires pour structurer les données) :
Remarquez que l’ordre des éléments est celui d’une lecture en colonnes. Pour les obtenir en lignes, il aurait fallu ajouter l’argument byrow=TRUE.
Voici un autre exemple qui montre un affichage en ligne et une façon d’entrer des nombres sans la forme habituelle d’un vecteur (en l’occurrence les entiers de 1 à 10) mais aussi la curieuse façon que R a de gérer la construction d’une matrice lorsque le nombre d’éléments n’est pas un multiple du nombre de lignes et de colonnes.
numerique <- matrix(1:10, nrow=3, byrow=TRUE)
numerique
Opérations sur les matrices
Explorons à présent les matrices au format numérique.
D’abord, multiplions par 2 la matrice précédente, celle que nous avons appelée numerique.
numerique <- numerique * 2
Tous les éléments sont multipliés par 2.
Si l’on souhaite ajouter 1 à tous les éléments, il suffit d’écrire :
numerique <- numerique + 1
Notez une grosse différence avec les maths ! Si vous ajoutez 1 à une matrice avec votre calculatrice, elle vous enverra promener… Avec R, vous pouvez réaliser des opérations avec les éléments d’une matrice pris isolément et pas seulement avec la matrice elle-même. Rien d’anormal. R est d’abord un langage pour l’analyse de données, donc de tableaux, et accessoirement un outil pour problématiques mathématiques.
Passons aux opérations sur matrices proprement dites. La somme de matrices (de mêmes dimensions, bien sûr) est particulièrement simple.
Nouvel exemple :
n1 <- matrix(c(1,4,5,-4,0,2,6,0,-1), nrow=3, byrow=TRUE)
n2 <- matrix(c(0,2,-1,5,2,4,-7,1,0), nrow=3, byrow=TRUE)
n3 <- n1 + n2
n4 <- n1 - n2
n5 <- n1 * n2
n1
n2
n3
n4
n5
Affichage :
Vous constatez que n3 est la somme de n1 et n2 et que n4 est la différence entre n1 et n2. Pas de commentaire. Mais n5 est une multiplication élément par élément. Ce n’est pas du tout un produit matriciel ! Pour cela, il faudrait écrire le code ainsi :
n6 <- n1%*%n2
On obtient le résultat attendu :
Pour rester dans le calcul matriciel, ajoutons que la matrice unité est créée avec diag(n) (n étant l’ordre de la matrice), le déterminant s’affiche avec la fonction det, la matrice inverse avec solve, la transposée avec t et la diagonalisation avec eigen.
Attention, un vecteur n’est pas une matrice ligne. On transforme une matrice ligne en vecteur avec as.vector et l’inverse est réalisable avec as.matrix.
Bien souvent, les matrices sont juste des tableaux et il est habituel d’indiquer les totaux. En l’occurrence, la somme des éléments par lignes est obtenue avec la fonction rowSums et la somme des éléments par colonne nécessite le fonction colSums. Exemple :
Nous vous laissons vérifier…
De même on obtient les moyennes en lignes et en colonnes avec respectivement rowMeans et colMeans.
Enfin, il est possible de concaténer des matrices, soit l’une à côté de l’autre avec cbind, soit l’une en-dessous de l’autre avec rbind. Exemple :