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
.