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 FUN
zastosowanym 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
. FUN
w 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
.