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 by
skal 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 i
mellem 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 mean
og 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.table
sammen med nogle yderligere brugssager, der er specifikke for data.table
.