Exploiter les fonctions d’application et les opérations vectorisées
Apprenez à exploiter le paradigme de programmation fonctionnelle de R pour écrire un code efficace et concis. Ce tutoriel couvre les principales fonctions d’application, les opérations vectorisées et les meilleures pratiques de la programmation fonctionnelle en R.
La programmation fonctionnelle en R est un paradigme puissant qui se concentre sur le traitement efficace des données par le biais de fonctions. En exploitant les fonctions d’application et les opérations vectorisées intégrées à R, vous pouvez écrire un code plus concis, plus lisible et plus rapide, éliminant souvent le besoin de boucles explicites. Ce tutoriel vous présentera les fonctions clés (lapply() et sapply()) de la famille apply, démontrera les opérations vectorielles et fournira des exemples utilisant `, et fournira des exemples supplémentaires en utilisantapply(),tapply(),mapply(), andvapply()`. Ces techniques vous aideront à écrire un code R élégant et efficace.
La famille Apply
R fournit une variété de fonctions qui vous aident à appliquer des opérations sur des collections de données sans avoir recours à des boucles. Ces fonctions comprennent:
apply(): Appliquer une fonction aux marges d’une matrice.
lapply(): Renvoie une liste en appliquant une fonction sur une liste ou un vecteur.
sapply(): Une version conviviale de lapply() qui simplifie la sortie.
vapply(): Similaire à sapply() mais nécessite de spécifier le type de sortie.
tapply(): Applique une fonction sur des sous-ensembles d’un vecteur, catégorisés par un facteur.
mapply(): Version multivariée de lapply(), appliquant une fonction en parallèle sur un ensemble d’arguments.
Exemple : En utilisant lapply() et sapply()
# Créer une liste de tableaux numériquesnum_list <-list(a =1:5, b =6:10, c =11:15)# Utiliser `lapply` pour calculer la moyenne de chaque vecteur (renvoie une liste)means_list <-lapply(num_list, mean)print(means_list)
$a
[1] 3
$b
[1] 8
$c
[1] 13
# Utiliser `sapply` pour calculer la moyenne (simplifie en un vecteur)means_vector <-sapply(num_list, mean)print(means_vector)
a b c
3 8 13
Opérations vectorisées
Les opérations vectorielles dans R vous permettent d’effectuer des opérations par élément sur des vecteurs ou des matrices entiers sans boucles explicites. Cette approche est généralement plus rapide et plus concise.
Exemple : Arithmétique vectorisée
# Créer un tableau numériquex <-1:10# Multiplier chaque élément par 2 en utilisant la multiplication vectoriséey <- x *2print(y)
[1] 2 4 6 8 10 12 14 16 18 20
# Calcul de la racine carrée de chaque élémentsqrt_values <-sqrt(x)print(sqrt_values)
Exemples supplémentaires de familles d’applications
Pour tirer pleinement parti de la puissance de la famille apply de R, considérez ces fonctions supplémentaires:
Exemple d’utilisation de apply()
La fonction apply() est généralement utilisée avec des matrices ou des tableaux pour appliquer une fonction sur des lignes ou des colonnes.
# Créer une matrice 3x3matrix_data <-matrix(1:9, nrow =3, ncol =3)print(matrix_data)
[,1] [,2] [,3]
[1,] 1 4 7
[2,] 2 5 8
[3,] 3 6 9
# Somme de chaque ligne (`margin = 1`)row_sums <-apply(matrix_data, 1, sum)print(row_sums)
[1] 12 15 18
# Somme de chaque colonne (`margin = 2`)col_sums <-apply(matrix_data, 2, sum)print(col_sums)
[1] 6 15 24
Exemple utilisant tapply()
La fonction tapply() applique une fonction à des sous-ensembles d’un vecteur, définis par un facteur, ce qui est utile pour les opérations groupées.
#|label: tapply-example# Exemple de vecteur d'âges et d'un facteur de regroupementages <-c(23, 35, 27, 45, 31, 29)groups <-factor(c("A", "B", "A", "B", "A", "B"))# Calculer l'âge moyen pour chaque groupemean_ages <-tapply(ages, groups, mean)print(mean_ages)
Résultats:
A B
27.00000 36.33333
Exemple d’utilisation de mapply()
La fonction mapply() est une version multivariée de sapply(), qui applique une fonction en parallèle sur un ensemble d’arguments.
#|label: mapply-example# Définir deux tableaux numériquesv1 <-1:5v2 <-6:10# Utiliser mapply pour additionner les éléments correspondants des deux vecteurssums <-mapply(sum, v1, v2)print(sums)
Résultats:
[1] 7 9 11 13 15
Exemple d’utilisation de vapply()
La fonction 9fe9e69bd101d0011c5c28f42461f0 est similaire à la fonction sapply(), mais elle nécessite de spécifier le type de sortie pour des résultats plus prévisibles.
#|label: vapply-example# Définir une fonction pour calculer la racine carrée d'un nombresqrt_func <-function(x) sqrt(x)# Appliquez la fonction à un vecteur à l'aide de vapply, en spécifiant que la sortie doit être numeric(1)sqrt_values <-vapply(1:5, sqrt_func, FUN.VALUE =numeric(1))print(sqrt_values)
Avantages de la programmation fonctionnelle en R
Concision:
Les constructions fonctionnelles vous permettent d’écrire moins de lignes de code pour les opérations courantes.
Lisibilité:
Le code qui exploite les fonctions d’application et les opérations vectorisées est souvent plus lisible que les boucles imbriquées.
Performances:
Les opérations vectorisées sont implémentées dans un code C optimisé, qui peut être significativement plus rapide que les boucles R équivalentes.
Maintenabilité:
Une approche fonctionnelle peut conduire à un code plus facile à tester et à maintenir, car les fonctions encapsulent des comportements spécifiques.
Bonnes pratiques
Garder les fonctions pures:
Dans la mesure du possible, concevez des fonctions qui n’ont pas d’effets secondaires. Cela facilite les tests et le raisonnement sur votre code.
Utiliser des noms descriptifs:
Nommer clairement vos fonctions et variables pour indiquer leur but.
Exploiter les fonctions intégrées:
Utilisez le riche ensemble de fonctions d’application et d’opérations vectorisées de R avant de recourir à des boucles explicites.
Profilez votre code:
Utilisez des outils de profilage (par exemple, Rprof()) pour identifier les goulets d’étranglement et optimiser les sections critiques en termes de performances.
Conclusion
La programmation fonctionnelle en R vous permet d’écrire un code plus concis, plus efficace et plus facile à maintenir. En utilisant la famille apply et les opérations vectorisées, vous pouvez facilement effectuer des manipulations de données complexes. Expérimentez avec les exemples fournis et intégrez ces techniques dans votre flux de travail pour améliorer vos capacités de traitement des données.