Aggregat – Et Kraftig Verktøy For Dataramme I R

dette innlegget gir en kort gjennomgang av aggregatfunksjonen som brukes til data.rammer og presenterer noen interessante bruksområder: fra det trivielle, men praktiske til de mest kompliserte problemene jeg har løst med aggregat.

Aggregate er en funksjon i base R som, som navnet antyder, kan aggregere den innlagte data.frame d.f ved å bruke en funksjon spesifisert av parameteren FUN til hver kolonne av deldata.rammer definert av inngangsparameteren by.

parameteren by må være list. Men siden data.frame ‘ s håndteres som (navngitte) lister over kolonner, kan en eller flere kolonner med en data.frame også sendes som parameteren by. Interessant, hvis disse kolonnene er av samme data.frame som den som er skrevet inn som x, blir disse kolonnene ikke sendt videre til FUN – funksjonen.

funksjonen for å søke må kunne godta en vector(siden den vil bli kalt med deler av en kolonne med en data.frame som inngang).

deldataene.rammer definert av inngangsparameteren by kan betraktes 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 gjør dette for hver i mellom 1 og length(unique(by)). Merk at by variabelen ikke trenger å være enig med en (eller flere) kolonne i data.frame, men kan være noe. Derfor kan man gjengi aggregate – funksjonaliteten med en for – syklus som kjører syklusvariabelen over de unike verdiene til variabelen som er passert som by og en sapply som bruker funksjonen som FUN til hver kolonne i data.frame – delen.data.ramme. En slik løsning ville imidlertid være svært vanskelig å dokumentere, da det ville være uklart hva (og hvorfor) denne koden faktisk gjør.

Aggregate returnerer alltid en data.frame som et resultat. Denne data.frame vil inneholde (nå unike) verdiene fra inngangsparameteren by som den første kolonnen og deretter kolonner som inneholder resultatene av anropet til funksjonen i parameteren FUN som brukes på delene av kolonnene til den inntastede data.frame. Det er interessant å merke seg at hvis funksjonen FUN returnerer flere verdier, vil klassen av kolonnene i resultatet data.frame være list eller noe a list kan kastes til (se siste eksempel nedenfor).

det er viktig å merke seg at funksjonskallet brukes på navnløse vektorer i stedet for navngitte kolonner av en data.frame og dermed refererer til navnene på data.frame vil ikke fungere, heller ikke vil kolonnereferanser som s.d.f.

Grunnleggende Eksempler

den mest grunnleggende bruken av aggregat involverer basefunksjoner som mean og sd. Det er faktisk en av de vanligste bruken av aggregate for å sammenligne gjennomsnittet eller andre egenskaper av utvalgsgrupper.

nylig reproduserte jeg beregninger fra Et Excel-ark. De fleste formlene var delsummer og totalsummer. Excel-arket var ikke veldig komfortabelt organisert for dette formålet: summer over rader, kolonner og totaler av disse summene ble brukt. I R har jeg endret dataene til en stjerneskjemarepresentasjon (når alle metadata er representert radvis og hver verdi får sin egen rad) ved hjelp av reshape2 pakke og melt deretter brukt aggregate langs forskjellige variabler for å få de forskjellige totalene. Jo mindre variabler du bruker i by jo mer aggregert sluttresultatet: totalsummen langs en dimensjon bruker ganske enkelt denne dimensjonen som «av», mens delsummer kan oppnås ved å bruke flere variabler som by. FUN i dette tilfellet var selvfølgelig sum.

en praktisk bruk av aggregat og en basefunksjon er å få antall opptredener av de ulike verdiene:

min favorittbruk av aggregat med en basefunksjon er å få den siste dagen i hver måned i en rekke datoer. Å gjøre slik, man kan bruke følgende kode (forutsatt at datoene er lagret i en» ÅÅÅÅ-MM-DD » format som strenger eller som Date):

Dette kom i svært nyttig når du arbeider med bankinformasjon der den siste dagen i måneden avhengig av bank helligdager samt helger.

Avansert Bruk

mer avansert bruk av aggregate avhenger av at du skriver dine egne function, f. eks. anonyme funksjoner videreføres som parameteren FUN. For å gjøre dette kan man bruke 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 bruksområdene spenner fra å ringe komplekse porteføljerisikomålinger for de homogene risikogruppene i en portefølje via å tilpasse en distribusjon til kategorier av prøver til alt du kan bilde, egentlig.

her er et eksempel med en» kompleks » porteføljerisikomåling (eksponering mot ulike motparter i ulike aktivaklasser):

Her er bruken av aggregate() – funksjonen.

Neste opp: montering Av En Gaussisk fordeling til observasjoner etter kategorier:

Nedenfor bruker vi aggregate() – funksjonen for å finne gjennomsnitt og standardavvik etter kategorier.

Dette siste eksemplet viser flere interessante egenskaper. Først må data.frame til aggregate og listen over by variabler ikke være det samme. Selv om dette er underforstått på andre steder i innlegget, er dette et eksplisitt eksempel på et slikt oppsett. For det andre er funksjonen passert som FUN ikke bare en anonym funksjon, den er curried fra en funksjon med mer enn en inngangsparameter. En funksjon av en enkelt inngangsvariabel observations er opprettet fra to-inngangsvariabelfunksjonen fitdistr: fikse en av inngangsvariablene ved å sette densfun = "normal". For det tredje, i stedet for å returnere full returverdi for funksjonen fitdistr, er returverdien begrenset til elementet estimate fra returverdien. Og sist men ikke minst består returverdien av den anonyme funksjonen til FUN av to variabler og ikke bare en. Interessant, aggregat kaster returverdien fra list til en matrix og navngir elementene for oss. Disse navnene kan imidlertid ikke brukes til å referere til kolonnene i matrisen. Du kan imidlertid referere dem som følger:

distr.estimate$observation] 3.016988

Avsluttende Ord

jeg håper at du har funnet ovenstående nyttig. Nå som du er mer kjent med aggregate, er det tid for sannheten: alt over og mye mer kan gjøres med data.table, og med en mye raskere ytelse. Men data.table har en kompleks syntaks, og man må virkelig forstå hvordan ting fungerer under hetten, mens aggregate er enkelt og innsiktsfullt. Inntil du er komfortabel med både aggregeringslogikken og syntaksen til data.table, er det en verdig investering å først skrive koden med aggregate og deretter optimalisere den ved å skrive den om med data.table.

for de av dere som er interessert, kommer et dedikert innlegg der ovennevnte er redone med data.table, sammen med noen ekstra brukstilfeller som er spesifikke for data.table.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert.