Nous créons une fonction nommée avg pour calculer la moyenne du minimum et du maximum du vecteur. avg <- function(x) { ( min(x) + max(x)) / 2}fcars <- sapply(dt, avg)fcars
Sortie
## speed dist## 14. 5 61. 0
La fonction sapply() est plus efficace que lapply() dans la sortie retournée parce que sapply() stocke les valeurs directement dans un vecteur. Lapply sous roche. Dans l'exemple suivant, nous verrons que ce n'est pas toujours le cas. Nous pouvons résumer la différence entre apply(), sapply() et `lapply() dans le tableau suivant:
lapply
Fonction
Arguments
Objectif. Entrée
apply
apply(x, MARGIN, FUN)
Appliquer une fonction aux lignes ou aux colonnes ou aux deux
Cadre de données ou matrice
vecteur, liste, tableau
lapply(X, FUN)
Appliquer une fonction à tous les éléments de l'entrée
Liste, vecteur ou cadre de données
liste
sappy
sappy(X FUN)
vecteur ou matrice
Trancher un vecteur
Nous pouvons utiliser lapply() ou sapply() de manière interchangeable pour trancher un cadre de données. Nous créons une fonction, below_average(), qui prend un vecteur de valeurs numériques et renvoie un vecteur qui ne contient que les valeurs strictement supérieures à la moyenne.
- Lapply sous roche
- Lapply sous l'oeil
- Lapply sous réserve
Lapply Sous Roche
La fonction apply() permet d'appliquer une fonction (par exemple une moyenne, une somme) à chaque ligne ou chaque colonne d'un tableau de données. Cette fonction prend 3 arguments dans l'ordre suivant: nom du tableau de données
un nombre pour dire si la fonction doit s'appliquer aux lignes (1), aux colonnes (2) ou aux deux (c(1, 2))
le nom de la fonction à appliquer
Voici un exemple. L'objectif est de calculer la somme de chaque ligne ou de chaque colonne d'un tableau:
# On crée d'abord une matrice avec 2 lignes et 3 colonnes
data<-matrix(c(1, 2, 3, 4, 5, 6), nrow=2)
# On donne un nom aux lignes et aux colonnes
colnames(data)=c("C1", "C2", "C3")
rownames(data)=c("L1", "L2")
# On utilise la fonction apply() pour faire la somme de chaque ligne
apply(data, 1, sum)
# Pour faire la somme de chaque colonne, on remplace 1 par 2
apply(data, 2, sum)
Lapply Sous L'oeil
R n'aime pas les boucles: c'est long, parfois ca surtout c'est long:). Une des fonctions qu'il faut absolument maîtriser est apply. Elle permet de réaliser en parallèle la même opération sur toutes les lignes/ toutes les colonnes d'une matrice ou d 'un jeu de données. Pour utiliser apply, il faut
créer une fonction qui prend en paramètre un vecteur et qui nous ressort une transformation de ce vecteur. que ce vecteur soit de la forme qu'une ligne ou qu'une colonne de notre jeu de données (prendre en compte les variables quali, l'ordre des variables.. )
lancer apply sur son jeu de données, en précisant la fonction et s'il faut le prendre en ligne ou en colonne. data(iris) # on va fabriquer une fonction qui, pour chaque ligne, nous donnera la somme de,, et masomme<-function(monvec){ # les vecteurs sont ici de la forme c(5. 1, 3. 5, 1. 4, 0. 2, setosa). Lapply sous l'oeil. Un simple sum(monec) ne fonctionnerait pas à cause de setosa return(sum(meric(monvec[1:4])))# le meric permet de passer outre la transformation en caractères} lasomme<-apply((iris), FUN=masomme, MARGIN=1) head(cbind(iris, lasomme))# on rajoute une colonne avec le résultat et on regarde le début du jeu de données
Cette transformation restera très rapide même avec un très grand nombre de lignes
2011-12-23
Lapply Sous Réserve
La lettre l devant le apply correspond à ` list` Par défaut, les résultats sont également fournis sous forme d'une liste: maliste <- list(E1=rnorm(10), E2=1:10, E3=runif(10))
maliste
## $E1
## [1] -1. 7984349 0. 6276849 0. 7310556 1. 1642278 -1. 0313113 0. 1958217
## [7] -1. 9018991 -1. 8122020 -0. 3482781 -1. 2713203
##
## $E2
## [1] 1 2 3 4 5 6 7 8 9 10
## $E3
## [1] 0. 723830546 0. 838541188 0. 845484439 0. 039995958 0. 615807877 0. 917093245
## [7] 0. 867372951 0. 224336368 0. 001643635 0. 081938347
lapply(maliste, mean)
## [1] -0. 5444656
## [1] 5. 5
## [1] 0. 5156045
Si on utilise une fonction qui nécessite des arguments, il faut les indiquer après la fonction, comme ici avec la fonction quantile() et l'argument probs. lapply(maliste, quantile, probs=c(0. 25, 0. 75))
## 25% 75%
## -1. 6666563 0. Lapply sous réserve. 5197191
## 3. 25 7. 75
## 0. 1175379 0. 8437486 On peut également obtenir les résultats sous la forme d'un vecteur en employant la fonction unlist() en amont: unlist(lapply(maliste, mean))
## E1 E2 E3
## -0.
lapply ( X = iris, function (x) class (x))
## $
## [1] "numeric"
## $Species
## [1] "factor"
lapply ( X = colnames (iris), function (x) summary (iris[, x]))
## [[1]]
## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 4. 300 5. 100 5. 800 5. 843 6. 400 7. 900
## [[2]]
## 2. 000 2. 800 3. 000 3. 057 3. R pour les nuls: La fonction tapply(). 300 4. 400
## [[3]]
## 1. 000 1. 600 4. 350 3. 758 5. 100 6. 900
## [[4]]
## 0. 100 0. 300 1. 199 1. 800 2. 500
## [[5]]
## setosa versicolor virginica
## 50 50 50
Quand on regarde de plus près, on se rend compte, que ces fonctions peuvent jouer le même rôle qu'une boucle. lapply ( X = colnames (iris), function (x) x)
## [1] ""
## [1] "Species"
Fonction sapply
La fonction sapply est similaire à la fonction lapply sauf qu'elle ne retourne pas de liste mais un vecteur ou une matrice. sapply ( X = iris, function (x) class (x))
## "numeric" "numeric" "numeric" "numeric" "factor"
Fonction tapply
La fonction tapply adopte la même approche que la fonction aggregate. Elle permet d'agréger des données. Les arguments de la fonction d'agrégation sont renseignés dans la fonction tapply et non dans la fonction d'agrégation.