Agrégat – Un Outil Puissant pour la trame de données en R

Cet article donne un bref aperçu de la fonction d’agrégat utilisée pour les données.encadre et présente quelques utilisations intéressantes: des problèmes triviaux mais pratiques aux problèmes les plus compliqués que j’ai résolus avec aggregate.

Aggregate est une fonction en base R qui peut, comme son nom l’indique, agréger le data.frame d.f entré en appliquant une fonction spécifiée par le paramètre FUN à chaque colonne de sous-données.trames définies par le paramètre d’entrée by.

Le paramètre by doit être un list. Cependant, comme les data.frame sont gérées comme des listes de colonnes (nommées), une ou plusieurs colonnes d’un data.frame peuvent également être passées en tant que paramètre by. Fait intéressant, si ces colonnes sont de la même data.frame que celle entrée en tant que x, ces colonnes ne sont pas transmises à la fonction FUN.

La fonction à appliquer doit pouvoir accepter un vector (car elle sera appelée avec des parties d’une colonne de a data.frame en entrée).

Les sous-données.les trames définies par le paramètre d’entrée by peuvent être considérées comme une indexation logique:

d.f <- data.frame(rating = c("AAA", "A", "A", "AAA", "BB", "BB", "AAA", "A"))i <- 1by <- d.f$ratingsub.data.frame <- d.f, ]

et faites-le pour chaque i entre 1 et length(unique(by)). Notez que la variable by n’a pas à être d’accord avec une (ou plusieurs) colonne de la data.frame mais peut être n’importe quoi. Par conséquent, on peut reproduire la fonctionnalité aggregate par un cycle for exécutant la variable de cycle sur les valeurs uniques de la variable passée en tant que by et un sapply appliquant la fonction passée en tant que FUN à chaque colonne du sous-groupe data.frame.données.cadre. Une telle solution de contournement serait cependant très difficile à documenter, car il serait difficile de savoir ce que (et pourquoi) ce code fait réellement.

Aggregate renvoie toujours un data.frame en conséquence. Ce data.frame contiendra les valeurs (désormais uniques) du paramètre d’entrée by comme première colonne, puis des colonnes contenant les résultats de l’appel à la fonction dans le paramètre FUN appliqué aux parties des colonnes du data.frame entré. Il est intéressant de noter que si la fonction FUN renvoie plusieurs valeurs, la classe des colonnes du résultat data.frame sera list ou quelque chose de list peut être converti (voir le dernier exemple ci-dessous).

Il est important de noter que l’appel de fonction est appliqué à des vecteurs sans nom plutôt qu’à des colonnes nommées d’un data.frame et donc se référer aux noms du data.frame ne fonctionnera pas, pas plus que les références de colonnes telles que s.d.f.

Exemples de base

Les utilisations les plus élémentaires de l’agrégat impliquent des fonctions de base telles que mean et sd. C’est en effet l’une des utilisations les plus courantes de aggregate pour comparer la moyenne ou d’autres propriétés des groupes d’échantillons.

Récemment, j’ai reproduit des calculs à partir d’une feuille Excel. La plupart des formules étaient des sous-totaux et des totaux généraux. La feuille Excel n’était pas très confortablement organisée à cet effet: des sommes sur des lignes, des colonnes et des totaux de ces sommes ont été utilisés. Dans R, j’ai changé les données en une représentation de schéma en étoile (lorsque toutes les métadonnées sont représentées en ligne et chaque valeur obtient sa propre ligne) en utilisant le package reshape2 et melt puis utilisé aggregate le long de différentes variables pour obtenir les différents totaux. Moins vous utilisez de variables dans by, plus le résultat final est agrégé: le total général le long d’une dimension utilise simplement cette dimension comme « par », tandis que les sous-totaux peuvent être obtenus en utilisant plusieurs variables comme by. Le FUN dans ce cas était bien sûr sum.

Une utilisation pratique de l’agrégat et d’une fonction de base consiste à obtenir le nombre d’apparitions des différentes valeurs:

Mon utilisation préférée de l’agrégat avec une fonction de base est d’obtenir le dernier jour de chaque mois dans une série de dates. Pour ce faire, on peut utiliser le code suivant (en supposant que vos dates sont stockées dans un format « AAAA-MM-JJ » sous forme de chaînes ou comme Date):

Cela s’est avéré très utile lorsque vous travaillez avec des informations bancaires où le dernier jour du mois dépendait des jours fériés ainsi que des week-ends.

Utilisations avancées

Les utilisations plus avancées de aggregate dépendent de l’écriture de vos propres function, par exemple des fonctions anonymes transmises en tant que paramètre FUN. Pour ce faire, on peut utiliser la syntaxe

# do not run the syntaxaggregate(x = d.f, by = by.list, FUN = function(s.d.f){y <- s.d.f; return(y)}

Les utilisations possibles vont de l’appel de métriques de risque de portefeuille complexes pour les groupes de risque homogènes d’un portefeuille en ajustant une distribution à des catégories d’échantillons à tout ce que vous pouvez imaginer, vraiment.

Voici un exemple avec une métrique de risque de portefeuille « complexe » (exposition à différentes contreparties dans différentes classes d’actifs):

Voici l’utilisation de la fonction aggregate().

Suivant: ajustement d’une distribution gaussienne aux observations par catégories:

Ci-dessous, nous utilisons la fonction aggregate() pour trouver la moyenne et l’écart-type par catégories.

Ce dernier exemple présente plusieurs propriétés intéressantes. Premièrement, les variables data.frame à aggregate et la liste des variables by ne doivent pas nécessairement être les mêmes. Bien que cela soit implicite à d’autres endroits du message, il s’agit d’un exemple explicite d’une telle configuration. Deuxièmement, la fonction passée sous la forme FUN n’est pas seulement une fonction anonyme, elle est extraite d’une fonction avec plus d’un paramètre d’entrée. Une fonction d’une variable d’entrée unique observations a été créée à partir de la fonction de variable à deux entrées fitdistr : fixation d’une des variables d’entrée en réglant densfun = "normal". Troisièmement, plutôt que de renvoyer la valeur de retour complète de la fonction fitdistr, la valeur de retour est limitée à l’élément estimate de la valeur de retour. Et enfin, la valeur de retour de la fonction anonyme passée à FUN se compose de deux variables et pas seulement d’une. Fait intéressant, aggregate convertit la valeur de retour de list en matrix et nomme les éléments pour nous. Cependant, ces noms ne peuvent pas être utilisés pour référencer les colonnes de la matrice. Vous pouvez cependant les référencer comme suit:

distr.estimate$observation] 3.016988

Mots de clôture

J’espère que vous avez trouvé ce qui précède utile. Maintenant que vous êtes plus familier avec aggregate, il est temps de faire la vérité: tout ce qui précède et bien plus peut être fait avec data.table, et avec des performances beaucoup plus rapides. Cependant, data.table a une syntaxe complexe et il faut vraiment comprendre comment les choses fonctionnent sous le capot, tandis que aggregate est simple et perspicace. Jusqu’à ce que vous soyez à l’aise avec la logique d’agrégation et la syntaxe de data.table, c’est un investissement digne d’écrire d’abord le code en utilisant aggregate, puis de l’optimiser en le réécrivant en utilisant data.table.

Pour ceux d’entre vous qui sont intéressés, un post dédié arrive où ce qui précède est refait avec data.table, ainsi que quelques cas d’utilisation supplémentaires spécifiques à data.table.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.