Agregat-potężne narzędzie do ramki danych w R

ten post daje krótki przegląd funkcji agregacji, jak używane do danych.ramki i prezentuje kilka ciekawych zastosowań: od banalnych, ale poręcznych do najbardziej skomplikowanych problemów, które rozwiązałem z agregatem.

Aggregate jest funkcją w bazie R, która może, jak sama nazwa wskazuje, agregować wprowadzone data.frame d.F poprzez zastosowanie funkcji określonej przez parametr FUN do każdej kolumny danych podrzędnych.ramki zdefiniowane przez parametr wejściowy by.

parametr by musi być parametrem list. Ponieważ jednak data.frame są obsługiwane jako (nazwane) listy kolumn, jedna lub więcej kolumn data.frame może być również przekazywana jako parametr by. Co ciekawe, jeśli te kolumny są tej samej data.frame co ta wprowadzona jako x, kolumny te nie są przekazywane do funkcji FUN.

funkcja do zastosowania musi być w stanie zaakceptować vector (ponieważ zostanie wywołana z częściami kolumny data.frame jako wejście).

Pod-dane.ramki zdefiniowane przez parametr wejściowy by można traktować jako logiczne indeksowanie:

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

i zrób to dla każdego i między 1 A length(unique(by)). Zauważ, że zmienna by nie musi zgadzać się z jedną (lub więcej) kolumną data.frame, ale może być cokolwiek. W związku z tym można odtworzyć funkcjonalność aggregate poprzez cykl for uruchamiający zmienną cycle nad unikalnymi wartościami zmiennej przekazanej jako by i sapply stosując funkcję przekazaną jako FUN do każdej kolumny podmodułu data.frame.data.ramka. Takie obejście byłoby jednak bardzo trudne do udokumentowania, ponieważ nie byłoby jasne, co (i dlaczego) ten kod faktycznie robi.

Aggregate zawsze zwraca wynik data.frame. Ta data.frame będzie zawierać (teraz unikalne) wartości z parametru wejściowego by jako pierwsza kolumna, a następnie kolumny zawierające wyniki wywołania funkcji w parametrze FUNzastosowanym do części kolumn wprowadzonego data.frame. Warto zauważyć, że jeśli funkcja FUN zwraca wiele wartości, Klasa kolumn wyniku data.frame będzie wynosić list lub coś, do czego można użyć list (patrz ostatni przykład poniżej).

ważne jest, aby pamiętać, że wywołanie funkcji jest stosowane do bezimiennych wektorów, a nie nazwanych kolumn data.frame i dlatego odwoływanie się do nazw data.frame nie będzie działać, ani odwołania do kolumn, takie jak s.d.f.

podstawowe przykłady

najbardziej podstawowe zastosowania agregatu obejmują funkcje podstawowe, takie jak mean i sd. Jest to rzeczywiście jeden z najczęstszych zastosowań aggregate do porównania średnich lub innych właściwości grup próbek.

ostatnio odtworzyłem obliczenia z arkusza Excela. Większość formuł była sumami ogólnymi i wielkimi sumami. Arkusz Excela nie był zbyt komfortowo zorganizowany w tym celu: wykorzystano sumy nad wierszami, kolumnami i sumy tych sum. W R zmieniłem dane na reprezentację schematu Gwiazdy (gdy wszystkie metadane są reprezentowane wierszem, a każda wartość ma swój własny wiersz)używając reshape2 package i melt następnie użyłem aggregate wzdłuż różnych zmiennych, aby uzyskać różne sumy. Im mniej zmiennych używasz w by, tym bardziej zagregowany wynik końcowy: całkowita suma wzdłuż wymiaru jest po prostu przy użyciu tego wymiaru jako „by”, podczas gdy sumy cząstkowe można osiągnąć przy użyciu wielu zmiennych jako by. FUNw tym przypadku było oczywiście sum.

jednym z przydatnych zastosowań agregatu i funkcji bazowej jest uzyskiwanie liczby wystąpień różnych wartości:

moim ulubionym zastosowaniem agregatu z funkcją bazową jest otrzymywanie ostatniego dnia każdego miesiąca w serii dat. Aby to zrobić, można użyć następującego kodu (zakładając, że daty są przechowywane w formacie „RRRR-MM-DD” jako ciągi znaków lub jako Date):

przydało się to bardzo podczas pracy z informacjami bankowymi, gdzie ostatni dzień miesiąca zależał od świąt bankowych, a także weekendów.

zaawansowane zastosowania

bardziej zaawansowane zastosowania aggregate zależą od zapisu własnego function, np. funkcji anonimowych przekazywanych jako parametr FUN. Aby to zrobić, można użyć składni

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

możliwe zastosowania wahają się od wywołania złożonych wskaźników ryzyka portfela dla jednorodnych grup ryzyka portfela poprzez dopasowanie dystrybucji do kategorii próbek do wszystkiego, co można obrazować, naprawdę.

oto przykład z” złożoną ” metryką ryzyka portfela (ekspozycja wobec różnych kontrahentów w różnych klasach aktywów):

oto użycie funkcji aggregate().

Następna w górę: dopasowanie rozkładu Gaussa do obserwacji według kategorii:

poniżej używamy funkcji aggregate(), aby znaleźć średnią i odchylenie standardowe według kategorii.

ten ostatni przykład prezentuje kilka interesujących właściwości. Po pierwsze, zmienne data.frame do aggregate i lista zmiennych by nie muszą być takie same. Chociaż jest to sugerowane w innych miejscach postu, jest to wyraźny przykład takiej konfiguracji. Po drugie, funkcja przekazana jako FUN nie jest tylko funkcją anonimową, jest ona curry z funkcji z więcej niż jednym parametrem wejściowym. Funkcja pojedynczej zmiennej wejściowej observations została utworzona z funkcji zmiennej wejściowej fitdistr: ustalenie jednej ze zmiennych wejściowych przez ustawienie densfun = "normal". Po trzecie, zamiast zwracać pełną wartość zwracaną funkcji fitdistr, wartość zwracana jest ograniczona do elementu estimate z wartości zwracanej. I wreszcie, wartość zwracana funkcji anonimowej przekazana do FUN składa się z dwóch zmiennych i nie tylko jednej. Co ciekawe, agregat rzuca wartość zwrotną z list do matrix i nazywa elementy dla nas. Jednak nazwy te nie mogą być użyte do odniesienia się do kolumn macierzy. Możesz jednak odnieść się do nich w następujący sposób:

distr.estimate$observation] 3.016988

słowa zamykające

mam nadzieję, że powyższe okazały się przydatne. Teraz, gdy jesteś bardziej zaznajomiony z aggregate, nadszedł czas na prawdę: wszystko powyżej i wiele więcej można zrobić z data.table i ze znacznie szybszą wydajnością. Jednak data.table ma złożoną składnię i naprawdę trzeba zrozumieć, jak rzeczy działają pod maską, podczas gdy aggregate jest prosty i wnikliwy. Dopóki nie będziesz zadowolony zarówno z logiki agregacji, jak i składni data.table, warto najpierw napisać kod za pomocą aggregate, a następnie zoptymalizować go, przepisując go za pomocą data.table.

dla tych z Was, którzy są zainteresowani, nadchodzi dedykowany post, w którym powyższe zostanie zmienione za pomocą data.table, wraz z dodatkowymi przypadkami użycia specyficznymi dla data.table.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.