Ce tutoriel a pour but de présenter la collection de fonctions apply(). La fonction apply() est la plus basique de toutes les collections. Nous apprendrons également sapply(), lapply() et tapply(). La collection apply peut être considérée comme un substitut de la boucle.
La collection apply() est regroupée avec le paquet r essential si vous installez R avec Anaconda. La fonction apply() peut être alimentée avec de nombreuses fonctions pour effectuer une application redondante sur une collection d’objet (cadre de données, liste, vecteur, etc.). Le but de apply() est principalement d’éviter l’utilisation explicite de constructions en boucle. Elles peuvent être utilisées pour une liste, une matrice ou un tableau en entrée et appliquer une fonction. N’importe quelle fonction peut être passée dans apply().
Dans ce tutoriel, vous apprendrez
- la fonction apply()
- la fonction lapply( )
- la fonction sapply()
- La fonction Slice vector
- . fonction tapply()
fonction apply()
apply() prend en entrée un cadre de données ou une matrice et donne en sortie un vecteur, liste ou tableau. La fonction apply() est principalement utilisée pour éviter les utilisations explicites des constructions de boucle. Elle est la plus basique de toutes les collections peut être utilisée sur une matrice.
Cette fonction prend 3 arguments :
apply(X, MARGIN, FUN)Here:-x: an array or matrix-MARGIN: take a value or range between 1 and 2 to define where to apply the function:-MARGIN=1`: the manipulation is performed on rows-MARGIN=2`: the manipulation is performed on columns-MARGIN=c(1,2)` the manipulation is performed on rows and columns-FUN: tells which function to apply. Built functions like mean, median, sum, min, max and even user-defined functions can be applied>
L’exemple le plus simple est de sommer une matrice sur toutes les colonnes. Le code apply(m1, 2, sum) va appliquer la fonction sum à la matrice 5×6 et retourner la somme de chaque colonne accessible dans le jeu de données.
m1 <- matrix(C<-(1:10),nrow=5, ncol=6)m1a_m1 <- apply(m1, 2, sum)a_m1
Sortie :
Best practice : Stockez les valeurs avant de l’imprimer sur la console.
Fonction lapply()
La fonction lapply() est utile pour effectuer des opérations sur des objets de liste et renvoie un objet de liste de même longueur que l’ensemble d’origine. lappy() renvoie une liste de longueur similaire à l’objet de liste d’entrée, dont chaque élément est le résultat de l’application de FUN à l’élément correspondant de la liste. lapply() prend une liste, un vecteur ou un cadre de données en entrée et donne une sortie en liste.
lapply(X, FUN)Arguments:-X: A vector or an object-FUN: Function applied to each element of x
l dans lapply() représente la liste. La différence entre lapply() et apply() réside dans le retour de sortie. Le retour de lapply() est une liste. lapply() peut être utilisé pour d’autres objets comme les cadres de données et les listes.
La fonction lapply() n’a pas besoin de MARGIN.
Un exemple très simple peut être de changer la valeur de la chaîne de caractères d’une matrice en minuscule avec la fonction tolower. Nous construisons une matrice avec le nom des films célèbres. Le nom est en format majuscule.
movies <- c("SPYDERMAN","BATMAN","VERTIGO","CHINATOWN")movies_lower <-lapply(movies, tolower)str(movies_lower)
Sortie :
## List of 4## $:chr"spyderman"## $:chr"batman"## $:chr"vertigo"## $:chr"chinatown"
Nous pouvons utiliser unlist() pour convertir la liste en vecteur.
movies_lower <-unlist(lapply(movies,tolower))str(movies_lower)
Sortie :
## chr "spyderman" "batman" "vertigo" "chinatown"
Fonction sapply()
La fonction sapply() prend en entrée une liste, un vecteur ou un cadre de données et donne en sortie un vecteur ou une matrice. Elle est utile pour les opérations sur les objets de liste et renvoie un objet de liste de même longueur que l’ensemble original. La fonction sapply() fait le même travail que la fonction lapply() mais renvoie un vecteur.
sapply(X, FUN)Arguments:-X: A vector or an object-FUN: Function applied to each element of x
Nous pouvons mesurer la vitesse minimale et les distances d’arrêt des voitures à partir de l’ensemble de données des voitures.
dt <- carslmn_cars <- lapply(dt, min)smn_cars <- sapply(dt, min)lmn_cars
Sortie :
## $speed## 4## $dist## 2
smn_cars
Sortie :
## speed dist ## 4 2
lmxcars <- lapply(dt, max)smxcars <- sapply(dt, max)lmxcars
Sortie :
## $speed## 25## $dist## 120
smxcars
Sortie :
## speed dist ## 25 120
Nous pouvons utiliser une fonction intégrée par l’utilisateur dans lapply() ou sapply(). 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. 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 :
Fonction |
Arguments |
Objectif. |
Entrée |
Sortie |
---|---|---|---|---|
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) |
Appliquer une fonction à tous les éléments de l’entrée |
Liste, vecteur ou cadre de données |
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. Nous comparons les deux résultats avec la fonction identical().
below_ave <- function(x) { ave <- mean(x) return(x)}dt_s<- sapply(dt, below_ave)dt_l<- lapply(dt, below_ave)identical(dt_s, dt_l)
Sortie :
## TRUE
Fonction tapply()
tapply() calcule une mesure (moyenne, médiane, min, max, etc…) ou une fonction pour chaque variable facteur dans un vecteur. C’est une fonction très utile qui vous permet de créer un sous-ensemble d’un vecteur, puis d’appliquer certaines fonctions à chacun de ce sous-ensemble.
Une partie du travail d’un data scientist ou de chercheurs consiste à calculer des résumés de variables. Par exemple, mesurer la moyenne ou regrouper des données en fonction d’une caractéristique. La plupart des données sont regroupées par ID, ville, pays, etc. Le fait de résumer par groupe révèle des modèles plus intéressants.
Pour comprendre comment cela fonctionne, utilisons le jeu de données de l’iris. Ce dataset est très célèbre dans le monde de l’apprentissage automatique. Le but de ce dataset est de prédire la classe de chacune des trois espèces de fleurs : Sepal, Versicolor, Virginica. Le jeu de données collecte pour chaque espèce des informations sur leur longueur et leur largeur.
En guise de travail préalable, nous pouvons calculer la médiane de la longueur pour chaque espèce. tapply() est un moyen rapide d’effectuer ce calcul.
data(iris)tapply(iris$Sepal.Width, iris$Species, median)
Sortie :
## setosa versicolor virginica ## 3.4 2.8 3.0