Aggregate-een krachtige Tool voor data Frame in R

dit bericht geeft een kort overzicht van de geaggregeerde functie zoals gebruikt voor gegevens.frames en presenteert een aantal interessante toepassingen: van de triviale maar handige tot de meest ingewikkelde problemen die ik heb opgelost met aggregate.

Aggregate is een functie in basis R die, zoals de naam al doet vermoeden, de ingevoerde data.frame d.f kan samenvoegen door een functie toe te passen die is gespecificeerd door de FUN parameter op elke kolom met subgegevens.frames gedefinieerd door de by invoerparameter.

de parameter by moet een listzijn. Aangezien data.frame ‘ s echter worden behandeld als (benoemde) lijsten van kolommen, kunnen een of meer kolommen van een data.frame ook worden doorgegeven als de parameter by. Interessant is dat als deze kolommen van dezelfde data.frame zijn als de kolom die is ingevoerd als x, deze kolommen niet worden doorgegeven aan de functie FUN.

de toe te passen functie moet een vector kunnen accepteren (omdat deze wordt aangeroepen met delen van een kolom van een data.frame als invoer).

de subgegevens.frames gedefinieerd door de inputparameter by kunnen worden beschouwd als logische indexering:

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

en doe dit voor elke i tussen 1 en length(unique(by)). Merk op dat de variabele by niet hoeft overeen te komen met één (of meer) kolom van de data.frame, maar dat het om het even wat kan zijn. Daarom kan men de functie aggregate reproduceren door een cyclus for waarin de cyclusvariabele wordt uitgevoerd over de unieke waarden van de variabele die wordt doorgegeven als by en een sapply waarbij de functie die wordt doorgegeven als FUN wordt toegepast op elke kolom van de sub data.frame.gegevens.frame. Een dergelijke oplossing zou echter zeer moeilijk te documenteren zijn, omdat het onduidelijk zou zijn wat (en waarom) deze code eigenlijk doet.

Aggregate geeft als resultaat altijd een data.frame terug. Deze data.frame bevat de (Nu unieke) waarden van de invoerparameter by als de eerste kolom en vervolgens kolommen met de resultaten van de aanroep naar de functie in de FUN parameter toegepast op de delen van de kolommen van de ingevoerde data.frame. Het is interessant om op te merken dat als de functie FUN meerdere waarden retourneert, de klasse van de kolommen van het resultaat data.frame list zal zijn of iets waar een list naar kan worden gegoten (zie het laatste voorbeeld hieronder).

het is belangrijk op te merken dat de functie-aanroep wordt toegepast op naamloze vectoren in plaats van benoemde kolommen van een data.frame en dat het dus niet werkt om naar de namen van de data.frame te verwijzen, noch zullen kolomverwijzingen zoals s.d.fwerken.

basisvoorbeelden

de meest basale toepassingen van aggregaat omvatten basisfuncties zoals mean en sd. Het is inderdaad een van de meest voorkomende toepassingen van aggregate om de gemiddelde of andere eigenschappen van de steekproefgroepen te vergelijken.

onlangs heb ik berekeningen gereproduceerd uit een Excel sheet. De meeste formules waren subtotalen en grote totalen. Het Excel-blad was niet erg comfortabel georganiseerd voor dit doel: sommen over rijen, kolommen en totalen van die sommen werden gebruikt. In R heb ik de gegevens veranderd in een ster schema representatie (als alle metadata rij-wise worden weergegeven en elke waarde krijgt zijn eigen rij) met behulp van reshape2 pakket en melt vervolgens gebruikt aggregate langs verschillende variabelen om de verschillende totalen te krijgen. Hoe minder variabelen u gebruikt in by , hoe meer geaggregeerd het eindresultaat: het totaal van een dimensie is gewoon met behulp van die dimensie als “door”, terwijl subtotalen kunnen worden bereikt met behulp van meerdere variabelen als by. De FUN was in dit geval natuurlijk sum.

een handig gebruik van aggregaat en een basisfunctie is het krijgen van het aantal verschijningen van de verschillende waarden:

mijn favoriete gebruik van aggregaat met een basisfunctie is het krijgen van de laatste dag van elke maand in een reeks van datums. Om dit te doen, kan men de volgende code gebruiken (ervan uitgaande dat uw datums worden opgeslagen in een “JJJJ-MM-DD” formaat als strings of als Date):

dit kwam erg handig bij het werken met bankinformatie waar de laatste dag van de maand afhankelijk was van bankvakanties en weekends.

geavanceerd gebruik

meer geavanceerd gebruik van aggregate hangt af van het schrijven van uw eigen function, bijvoorbeeld anonieme functies die worden doorgegeven als de FUN parameter. Om dit te doen, kan men de syntaxis

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

gebruiken de mogelijke toepassingen variëren van het aanroepen van complexe portefeuillerisicometrics voor de homogene risicogroepen van een portefeuille via het aanpassen van een distributie aan categorieën van samples om alles wat je kunt image, echt.

hier is een voorbeeld met een” complexe ” maatstaf voor het portefeuillerisico (blootstelling aan verschillende tegenpartijen in verschillende activaklassen):

hier is het gebruik van de functie aggregate().

Next up: een Gaussiaanse verdeling aanpassen aan waarnemingen per categorie:

hieronder gebruiken we de functie aggregate() om het gemiddelde en de standaardafwijking per categorie te vinden.

dit laatste voorbeeld toont een aantal interessante eigenschappen. Ten eerste hoeven de variabelen data.frame tot aggregate en de lijst van by niet hetzelfde te zijn. Hoewel dit wordt geïmpliceerd in andere plaatsen van de post, Dit is een expliciet voorbeeld van een dergelijke setup. Ten tweede is de functie die als FUN wordt doorgegeven niet alleen een anonieme functie, maar wordt deze gecurried vanuit een functie met meer dan één invoerparameter. Een functie van een enkele invoervariabele observations is gemaakt van de twee-invoervariabele functie fitdistr: een van de invoervariabelen repareren door densfun = "normal"in te stellen. Ten derde, in plaats van de volledige retourwaarde van de functie fitdistr te retourneren, wordt de retourwaarde beperkt tot het element estimate van de retourwaarde. En last but not least, de return waarde van de anonieme functie doorgegeven aan FUN bestaat uit twee variabelen en niet slechts één. Interessant is dat aggregate de retourwaarde van list naar A matrix werpt en de elementen voor ons benoemt. Deze namen kunnen echter niet worden gebruikt om te verwijzen naar de kolommen van de matrix. U kunt ze echter als volgt verwijzen:

distr.estimate$observation] 3.016988

slotwoorden

ik hoop dat u het bovenstaande nuttig hebt gevonden. Nu u meer vertrouwd bent met aggregate, is het tijd voor de waarheid: alles hierboven en nog veel meer kan worden gedaan met data.table, en met een veel snellere prestatie. data.table heeft echter een complexe syntaxis en men moet echt begrijpen hoe dingen onder de motorkap werken, terwijl aggregate eenvoudig en inzichtelijk is. Totdat u vertrouwd bent met zowel de logica van aggregatie als de syntaxis van data.table, is het een waardige investering om eerst de code te schrijven met aggregate en deze vervolgens te optimaliseren door deze te herschrijven met data.table.

voor degenen onder u die geïnteresseerd zijn, komt er een speciale post waar het bovenstaande wordt vernieuwd met data.table, samen met enkele extra use cases specifiek voor data.table.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.