Appliquer une fonction à plusieurs variables ou par groupes

Il est souvent utile de appliquer le même type d'opérations à toute une série de variables ou le faire pour des groupes d'observations constitués par un facteur. Certaines fonctions fournissents des options pour le faire, mais la plupart n'offrent pas cette possibilité. Prenons ici comme exemple la fonction stem qui produit une BàF (stem and leaf plot) pour une variable, mais sachez que le principe expliqué ici s'applique à la plupart de fonctions.

Produire une BàF pour plusieurs variables

Un appel à la fonction stem ne permet pas de produire un stemleaf pour plusieurs variables.

Supposons que nous voulons obtenir des BàF pour toutes les variables (colonnes) de la matrice pays. La fonction qui permet d'appliquer une autre fonction de façon répétée s'appelle apply(donn,dim,fon)donn correspond à la matrice de données, dim indique la façon de parcourir la matrice, dans notre cas nous mettrons 2, car nous voulons répéter la fonction fon pour chaque colonne de la matrice (une valeur de 1 l'appliquerait à chaque ligne).

La commande apply(pays,2,stem) fait exactement cela.

Note technique

Cette façon de faire ne pose aucun problème du fait que pays ne contient que des colonnes numériques. Si vous effectuez la même opération en utilisant pays1 qui comporte une colonne avec les noms des continents, vous aurez un message d'erreur.

Par contre si vous tapiez apply(pays1[,1:23],2,stem) vous n'auriez pas de problème du fait que les continents se trouvent en colonne 24. D'ailleurs ici vous avez un différence entre S et R; S ignore simplement les variables non-numériques...

Produire une BàF par groupes d'observations

Supposons que nous souhaitons obtenir une BàF de variable urb pour chaque continent. La solution la plus simple consiste à écrire:

by(urb,continents,stem)

il s'agit donc d'exécuter la fonction stem sur chaque groupe définit par la variable continents.

Fonctions graphiques

Si la fonction que vous utilisez dans apply ou by produit un graphique dans une fenêtre comme la fonction hist (ce n'est pas le cas de la fonction stem()) il faut prévoir une fenêtre graphique qui peut recevoir plusieurs graphiques, sinon vous ne verrez que le dernier graphique). [par(mfrow=c(3,3)) crée une fenêtre qui peut recevoir 9 graphiques: 3 lignes, 3 colonnes].

Un example pratique

Admettons que nous cherchons à obtenir la différence entre le médiane et la moyenne comme une simple mesure de symétrie/dissymétrie pour toutes les variables. Comme apply(x,2,fun) attend un nom d'une fonction nous devons la définir: function(x) median(x)-mean(x). Nous pouvons soit l'affecter à un nom:

medmean <- function(x) median(x)-mean(x)
apply(pays,2,medmean)

ou alors la mettre directement dans la fonction apply()

apply(pays,2,function(x) median(x) - mean(x))

Cette solution est très générale et s'applique à des fonctions très complexes; pour calculer la différence entre médiane et moyenne, on pourrait aussi écrire

apply(pays,2,median)-apply(pays,2,mean)