Aggregate-et kraftfuldt værktøj til dataramme i R

dette indlæg giver en kort gennemgang af aggregatfunktionen som brugt til data.rammer og præsenterer nogle interessante anvendelser: fra de trivielle, men praktiske til de mest komplicerede problemer, jeg har løst med aggregate.

Aggregate er en funktion i base R, som, som navnet antyder, kan aggregere den indtastede data.frame d.F ved at anvende en funktion specificeret af parameteren FUN til hver kolonne med underdata.rammer defineret af inputparameteren by.

parameteren byskal være en list. Men da data.frame ‘ er håndteres som (navngivne) lister over kolonner, kan en eller flere kolonner af en data.frame også overføres som parameteren by. Interessant nok, hvis disse kolonner er af samme data.frame som den, der er indtastet som x, overføres disse kolonner ikke til FUN – funktionen.

den funktion, der skal anvendes, skal kunne acceptere en vector (da den vil blive kaldt med dele af en kolonne af en data.frame som input).

underdataene.rammer defineret af inputparameteren by kan betragtes som logisk indeksering:

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

og gør dette for hver imellem 1 og length(unique(by)). Bemærk, at variablen by ikke behøver at være enig med en (eller flere) kolonne i data.frame, men kan være noget. Derfor kan man gengive aggregate funktionaliteten ved en for cyklus, der kører cyklusvariablen over de unikke værdier for variablen, der er passeret som by, og en sapply anvendelse af funktionen bestået som FUN til hver kolonne i data.frame sub.data.ramme. En sådan løsning ville dog være meget vanskelig at dokumentere, da det ville være uklart, hvad (og hvorfor) denne kode faktisk gør.

Aggregate returnerer altid en data.frame som et resultat. Denne data.frame vil indeholde de (nu unikke) værdier fra inputparameteren by som den første kolonne og derefter kolonner, der indeholder resultaterne af opkaldet til funktionen i parameteren FUN anvendt på delene af kolonnerne i den indtastede data.frame. Det er interessant at bemærke, at hvis funktionen FUN returnerer flere værdier, vil klassen af kolonnerne i resultatet data.frame være list eller noget a list kan kastes til (se det sidste eksempel nedenfor).

det er vigtigt at bemærke, at funktionsopkaldet anvendes på navnløse vektorer snarere end navngivne kolonner af en data.frame og dermed henviser til navnene på data.frame fungerer ikke, Og heller ikke kolonnereferencer som s.d.f.

grundlæggende eksempler

de mest basale anvendelser af aggregat involverer basisfunktioner som meanog sd. Det er faktisk en af de mest almindelige anvendelser af aggregate for at sammenligne middelværdien eller andre egenskaber for prøvegrupper.

for nylig har jeg gengivet beregninger fra et ark. De fleste formler var subtotaler og totaler. Det var ikke særlig behageligt at organisere dette ark: beløb over rækker, kolonner og totaler af disse beløb blev brugt. I R har jeg ændret dataene til en stjerneskema repræsentation (når alle metadata er repræsenteret rækkevis og hver værdi får sin egen række) ved hjælp af reshape2 pakke og melt derefter brugt aggregate langs forskellige variabler for at få de forskellige totaler. Jo mindre variabler du bruger i by jo mere aggregerede slutresultatet: den samlede sum langs en dimension bruger simpelthen den dimension som “ved”, mens Subtotaler kan opnås ved hjælp af flere variabler som by. FUN i dette tilfælde var selvfølgelig sum.

en praktisk brug af aggregat og en basisfunktion er at få antallet af optrædener af de forskellige værdier:

Min favorit brug af aggregat med en basisfunktion får den sidste dag i hver måned i en række datoer. At gøre det, man kan bruge følgende kode (forudsat at dine datoer er gemt i et” ÅÅÅÅ-MM-DD ” – format som strenge eller som Date):

dette kom meget praktisk, når man arbejdede med bankoplysninger, hvor den sidste dag i måneden var afhængig af bankferier såvel som fridage.

avancerede anvendelser

mere avancerede anvendelser af aggregate afhænger af at skrive din egen function, f.eks. anonyme funktioner videregivet som parameteren FUN. For at gøre det kan man bruge syntaksen

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

de mulige anvendelser spænder fra at kalde komplekse porteføljerisikometrikker for de homogene risikogrupper i en portefølje ved at tilpasse en distribution til kategorier af prøver til alt, hvad du kan billede, virkelig.

her er et eksempel med en” kompleks ” porteføljerisici (eksponering mod forskellige modparter i forskellige aktivklasser):

her er brugen af aggregate() funktion.

næste op: montering af en Gaussisk fordeling til observationer efter kategorier:

nedenfor bruger vi aggregate() funktionen til at finde middel-og standardafvigelsen efter kategorier.

dette sidste eksempel viser flere interessante egenskaber. For det første behøver data.frame til aggregate og listen over by variabler ikke at være de samme. Mens dette er underforstået andre steder i indlægget, er dette et eksplicit eksempel på en sådan opsætning. For det andet er funktionen bestået som FUN ikke kun en anonym funktion, den er curried fra en funktion med mere end en inputparameter. En funktion af en enkelt inputvariabel observations er oprettet ud fra variabelfunktionen med to input fitdistr: fastsættelse af en af inputvariablerne ved at indstille densfun = "normal". For det tredje, i stedet for at returnere den fulde returværdi af funktionen fitdistr, er returværdien begrænset til elementet estimate fra returværdien. Og sidst men ikke mindst består returværdien af den anonyme funktion, der overføres til FUN, af to variabler og ikke kun en. Interessant nok kaster aggregate returværdien fra list til en matrix og navngiver elementerne for os. Disse navne kan dog ikke bruges til at henvise til kolonnerne i matricen. Du kan dog henvise til dem som følger:

distr.estimate$observation] 3.016988

afsluttende ord

jeg håber, at du har fundet ovenstående nyttige. Nu hvor du er mere fortrolig med aggregate, er det tid til sandheden: alt ovenfor og meget mere kan gøres med data.table og med en meget hurtigere ydelse. Imidlertid har data.table en kompleks syntaks, og man skal virkelig forstå, hvordan tingene fungerer under hætten, mens aggregate er enkel og indsigtsfuld. Indtil du er fortrolig med både aggregeringslogikken og syntaksen for data.table, er det en værdig investering at først skrive koden ved hjælp af aggregate og derefter optimere den ved at omskrive den ved hjælp af data.table.

for dem af jer, der er interesserede, kommer et dedikeret indlæg, hvor ovenstående er redone med data.tablesammen med nogle yderligere brugssager, der er specifikke for data.table.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.