Chapter 16 La famille des fonctions apply().

R dispose de la famille de fonctions apply(), qui consiste en des fonctions itératives qui visent à minimiser votre besoin de créer explicitement des boucles.

16.1 apply()

Considérons que nous avons une matrice height contenant la hauteur (en mètres) qui a été prise sur cinq individus (en lignes) à quatre moments différents (en colonnes).

(height <- matrix(runif(20, 1.5, 2), nrow = 5, ncol = 4))
##          [,1]     [,2]
## [1,] 1.678401 1.767051
## [2,] 1.995152 1.831650
## [3,] 1.597731 1.500258
## [4,] 1.760200 1.973591
## [5,] 1.574786 1.675590
##          [,3]     [,4]
## [1,] 1.570455 1.721713
## [2,] 1.736305 1.536088
## [3,] 1.631592 1.728510
## [4,] 1.977070 1.624321
## [5,] 1.980734 1.833997

Nous aimerions obtenir la hauteur moyenne à chaque pas de temps.

Une option consiste à utiliser une boucle for() {} pour itérer de la colonne 1 à 4, utiliser la fonction mean() pour calculer la moyenne des valeurs, et stocker séquentiellement la valeur de sortie dans un vecteur.

On peut aussi utiliser la fonction apply() pour qu’elle applique la fonction mean() à chaque colonne de la matrice height. Voir l’exemple ci-dessous :

apply(X = height, MARGIN = 2, FUN = mean)
## [1] 1.721254 1.749628 1.779231
## [4] 1.688926

La fonction apply() commence avec trois arguments principaux : X, qui prendra une matrice ou un cadre de données ; FUN, qui peut être n’importe quelle fonction qui sera appliquée aux MARGINs de X ; et MARGIN qui prendra 1 pour les calculs en ligne, ou 2 pour les calculs en colonne.

16.2 lapply()

lapply() applique une fonction à chaque élément d’une liste (list).

La sortie retournée est aussi une liste (ce qui explique le “l” de lapply) et a le même nombre d’éléments que l’objet qui lui est passé.

SimulatedData <- list(SimpleSequence = 1:4, Norm10 = rnorm(10),
    Norm20 = rnorm(20, 1), Norm100 = rnorm(100, 5))
# Apply mean to each element of the list

lapply(X = SimulatedData, FUN = mean)
## $SimpleSequence
## [1] 2.5
## 
## $Norm10
## [1] -0.3236717
## 
## $Norm20
## [1] 0.9114632
## 
## $Norm100
## [1] 5.046767

Les opérations lapply() effectuées dans des objets différents d’une list seront converties en list via base::as.list().

16.3 sapply()

sapply() est une fonction ‘enveloppante’ pour lapply(), mais retourne une sortie simplifiée sous forme de vecteur (vector), au lieu d’une liste (list).

SimulatedData <- list(SimpleSequence = 1:4, Norm10 = rnorm(10),
    Norm20 = rnorm(20, 1), Norm100 = rnorm(100, 5))

# Apply mean to each element of the list
sapply(SimulatedData, mean)
## SimpleSequence         Norm10 
##      2.5000000     -0.2745324 
##         Norm20        Norm100 
##      1.2050524      5.2401935

16.4 mapply()

mapply() fonctionne comme une version multivariée de sapply().

Il appliquera une fonction donnée au premier élément de chaque argument d’abord, puis au deuxième élément, et ainsi de suite. Par exemple :

lilySeeds <- c(80, 65, 89, 23, 21)
poppySeeds <- c(20, 35, 11, 77, 79)

# Output
mapply(sum, lilySeeds, poppySeeds)
## [1] 100 100 100 100 100

16.5 tapply()

tapply() est utilisé pour appliquer une fonction sur des sous-ensembles d’un vecteur.

Elle est principalement utilisée lorsque l’ensemble de données contient des groupes différents (i.e. niveaux/facteurs) et que nous voulons appliquer une fonction à chacun de ces groupes.

head(mtcars)
##                    mpg cyl
## Mazda RX4         21.0   6
## Mazda RX4 Wag     21.0   6
## Datsun 710        22.8   4
## Hornet 4 Drive    21.4   6
## Hornet Sportabout 18.7   8
## Valiant           18.1   6
##                   disp  hp
## Mazda RX4          160 110
## Mazda RX4 Wag      160 110
## Datsun 710         108  93
## Hornet 4 Drive     258 110
## Hornet Sportabout  360 175
## Valiant            225 105
##                   drat    wt
## Mazda RX4         3.90 2.620
## Mazda RX4 Wag     3.90 2.875
## Datsun 710        3.85 2.320
## Hornet 4 Drive    3.08 3.215
## Hornet Sportabout 3.15 3.440
## Valiant           2.76 3.460
##                    qsec vs am
## Mazda RX4         16.46  0  1
## Mazda RX4 Wag     17.02  0  1
## Datsun 710        18.61  1  1
## Hornet 4 Drive    19.44  1  0
## Hornet Sportabout 17.02  0  0
## Valiant           20.22  1  0
##                   gear carb
## Mazda RX4            4    4
## Mazda RX4 Wag        4    4
## Datsun 710           4    1
## Hornet 4 Drive       3    1
## Hornet Sportabout    3    2
## Valiant              3    1
# get the mean hp by cylinder groups
tapply(mtcars$hp, mtcars$cyl, FUN = mean)
##         4         6         8 
##  82.63636 122.28571 209.21429