Opérations sur les matrices#
apply#
Nous avons vu qu’il était possible de faire des opérations sur les matrices en ligne ou en colonne. Toutefois, ce n’est pas toutes les fonctions statistiques qui sont applicables sur des colonnes et/ou lignes comme colMeans
. Pour appliquer d’utres sortes de fonctions, nous devons utiliser la fonction apply
.
On peut alors utiliser apply
lorsqu’on veut appliquer un calcule ou une fonction quelconque (FUN) sur des colonnes ou des lignes d’une matrice (incluant les matrices plus que 2D)
Soit une matrice de 12 premiers entiers;
m<-matrix(1:12, nrow=3)
m
1 | 4 | 7 | 10 |
2 | 5 | 8 | 11 |
3 | 6 | 9 | 12 |
Calculons le logarithme naturel de chaque élément de cette matrice:
h<-apply(m, c(1,2), log) #c(1,2) ça veut dire sur ligne et colonne
h
0.0000000 | 1.386294 | 1.945910 | 2.302585 |
0.6931472 | 1.609438 | 2.079442 | 2.397895 |
1.0986123 | 1.791759 | 2.197225 | 2.484907 |
Créons une matrice 3 x 1
qui nous retourne le résultat de la somme de chaque ligne;
h<-matrix(apply(m, 1, sum))
h
22 |
26 |
30 |
Si nous comparerons à la fonction rowSums
que nous avons vue;
rowSums(m)
- 22
- 26
- 30
lapply#
La fonction lapply applique une fonction quelconque (FUN) à tous les éléments d’un vecteur ou d’une liste X et retourne le résultat sous forme de liste.
Dans l’exemple suivant, nous avons une liste de trois vecteurs {vecteur_1, vecteur_2, vecteur_3} de taille différente, on voudrait savoir quelle est la taille de chaque élément, on voudrait la réponse dans une liste;
x <- list(vecteur_1 = 1, vecteur_2 = 1:17, vecteur_3 = 55:97)
lapply(x, FUN = length)
- $vecteur_1
- 1
- $vecteur_2
- 17
- $vecteur_3
- 43
Dans le résultat ci-haut, la fonction lapply
nous a retourné une liste de trois éléments avec la taille de chaque vecteur.
Regardons un autre exemple où nous cherchons à créer quatre échantillons aléatoires de taille {5, 6, 7, 8} tirés du vecteur x= 1 2 3 4 5 6 7 8 9 10
set.seed(123)
lapply(5:8, sample, x = 1:10)
-
- 3
- 10
- 2
- 8
- 6
-
- 5
- 4
- 6
- 8
- 1
- 2
-
- 5
- 3
- 9
- 1
- 4
- 7
- 10
-
- 3
- 8
- 2
- 7
- 9
- 1
- 6
- 10
sapply#
Dans certains cas, on voudrait appliquer une fonction quelconque sur une liste, mais on ne veut pas que R
nous retourne une une liste, on désire plutôt que R
nous retourne un vecteur. La fonction sapply
fait exactement cela. Le résultat est donc simplifiée par rapport à celui de lapply
, d’où le nom de la fonction.
La taille de chaque élément de notre liste;
sapply(x, FUN = length)
- vecteur_1
- 1
- vecteur_2
- 17
- vecteur_3
- 43
ou la somme de chaque élément de notre liste x
sapply(x, FUN = sum)
- vecteur_1
- 1
- vecteur_2
- 153
- vecteur_3
- 3268
Si le résultat de chaque application de la fonction est un vecteur et que les vecteurs sont tous de la même longueur, alors sapply retourne une matrice, remplie comme toujours par colonne :
(x <- lapply(rep(5, 3), sample, x = 1:10))
-
- 4
- 1
- 3
- 7
- 5
-
- 10
- 7
- 1
- 8
- 2
-
- 7
- 5
- 10
- 9
- 3
sapply(x, sort)
1 | 1 | 3 |
3 | 2 | 5 |
4 | 7 | 7 |
5 | 8 | 9 |
7 | 10 | 10 |
autre#
Il existe d’autres façons de manipuler les matrices, listes, vecteurs …etc. Dans ce cours nous avons couvert les trois principaux, toutefois, on peut avoir besoin dans certains cas d’utiliser vapply
, mapply
, Map
, rapply
ou même tapply
qui s’apparentent tous aux trois fonctions que nous avons couverts avec plus d’options ou format différent du résultat obtenu.