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
A matrix: 3 × 4 of type int
14710
25811
36912

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
A matrix: 3 × 4 of type dbl
0.00000001.3862941.9459102.302585
0.69314721.6094382.0794422.397895
1.09861231.7917592.1972252.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
A matrix: 3 × 1 of type int
22
26
30

Si nous comparerons à la fonction rowSums que nous avons vue;

rowSums(m)
  1. 22
  2. 26
  3. 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)
    1. 3
    2. 10
    3. 2
    4. 8
    5. 6
    1. 5
    2. 4
    3. 6
    4. 8
    5. 1
    6. 2
    1. 5
    2. 3
    3. 9
    4. 1
    5. 4
    6. 7
    7. 10
    1. 3
    2. 8
    3. 2
    4. 7
    5. 9
    6. 1
    7. 6
    8. 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))
    1. 4
    2. 1
    3. 3
    4. 7
    5. 5
    1. 10
    2. 7
    3. 1
    4. 8
    5. 2
    1. 7
    2. 5
    3. 10
    4. 9
    5. 3
sapply(x, sort)
A matrix: 5 × 3 of type int
1 1 3
3 2 5
4 7 7
5 8 9
71010

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.