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).
<- matrix(runif(20, 1.5, 2), nrow = 5, ncol = 4)) (height
## [,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 auxMARGIN
s deX
; etMARGIN
qui prendra1
pour les calculs en ligne, ou2
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é.
<- list(SimpleSequence = 1:4, Norm10 = rnorm(10),
SimulatedData 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’unelist
seront converties enlist
viabase::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
).
<- list(SimpleSequence = 1:4, Norm10 = rnorm(10),
SimulatedData 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 :
<- c(80, 65, 89, 23, 21)
lilySeeds <- c(20, 35, 11, 77, 79)
poppySeeds
# 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