tento příspěvek poskytuje krátký přehled agregované funkce používané pro data.rámy a představuje několik zajímavých použití: od triviálních, ale praktických až po nejsložitější problémy, které jsem vyřešil agregátem.
Aggregate
je funkce v základní Výzkum, který může, jak už název napovídá, agregátní přivedeného data.frame
d.f použitím funkce stanovené FUN
parametr, aby každý sloupec dílčích údajů.rámce definované vstupním parametrem by
.
parametr by
musí být list
. Nicméně, protože data.frame
‚ s jsou zpracovány jako (pojmenované) seznamy sloupců, jeden nebo více sloupců data.frame
může být také předán jako parametr by
. Je zajímavé, že pokud jsou tyto sloupce stejné data.frame
jako sloupce zadané jako x
, tyto sloupce nejsou předány funkci FUN
.
funkce, která má být použita, musí být schopna přijmout vector
(protože bude volána s částmi sloupce data.frame
jako vstup).
dílčí data.rámce definované vstupním parametrem by
lze považovat za logické indexování:
d.f <- data.frame(rating = c("AAA", "A", "A", "AAA", "BB", "BB", "AAA", "A"))i <- 1by <- d.f$ratingsub.data.frame <- d.f, ]
a to pro každý i
mezi 1 a length(unique(by))
. Všimněte si, že proměnná by
nemusí souhlasit s jedním (nebo více) sloupcem data.frame
, ale může to být cokoli. Proto, jeden může reprodukovat aggregate
funkce for
cyklus běží cyklus proměnné přes jedinečné hodnoty proměnné předána jako by
a FUN
každý sloupec data.frame
sub.datum.snímek. Takové řešení by však bylo velmi obtížné zdokumentovat, protože by nebylo jasné, co (a proč) tento kód skutečně dělá.
Aggregate
vždy vrátí data.frame
jako výsledek. data.frame
bude obsahovat (nyní unikátní) hodnoty ze vstupního parametru by
jako první sloupec a potom sloupce obsahující výsledky volání funkce v FUN
parametr aplikován na části sloupce zadaná data.frame
. Je zajímavé si povšimnout, že pokud funkci FUN
vrací více hodnot, třída sloupce výsledek data.frame
bude list
nebo něco list
může být obsazení (viz poslední příklad níže).
je důležité si uvědomit, že volání funkce se aplikuje na bezejmenné vektorů, spíše než jménem sloupce data.frame
a proto s odkazem na jména data.frame
nebude fungovat, ani odkazy na sloupce jako s.d.f
.
základní příklady
nejzákladnější použití agregátu zahrnuje základní funkce jako mean
a sd
. Je to skutečně jedno z nejběžnějších použití aggregate
k porovnání průměrných nebo jiných vlastností skupin vzorků.
Nedávno jsem reprodukoval výpočty z listu aplikace Excel. Většina vzorců byly mezisoučty a velké součty. List aplikace Excel nebyl pro tento účel příliš pohodlně uspořádán: byly použity částky přes řádky, sloupce a součty těchto částek. V R, změnil jsem data do star schema zastoupení (když všechna metadata jsou zastoupeny řádek-moudrý a každá hodnota má svůj vlastní řádek) pomocí reshape2
balíček melt
pak aggregate
podél různých proměnných získat různé součty. Méně proměnných, použití v by
více agregované do konce-výsledek: celkový součet po rozměr je jednoduše pomocí této dimenze jako „o“, zatímco mezisoučty může být dosaženo pomocí více proměnných by
. FUN
v tomto případě byl samozřejmě sum
.
Jednom praktickém použití kameniva a základní funkce je stále řada vystoupení různých hodnot:
Můj oblíbený použití agregát s základní funkce je stále poslední den každého měsíce v sérii data. K tomu je možné použít následující kód (za předpokladu, že vaše data jsou uložena v „RRRR-MM-DD“ formát jako řetězce nebo jako Date
):
To přišlo velmi vhod při práci s bankovní informace, kde poslední den měsíce závisel na bankovní svátky i víkendy.
Pokročilé Použití
Více pokročilé použití aggregate
záviset na psaní své vlastní function
, např. anonymní funkce předány jako FUN
parametr. Dělat tak, jeden může použít syntaxi
# do not run the syntaxaggregate(x = d.f, by = by.list, FUN = function(s.d.f){y <- s.d.f; return(y)}
možné použití v rozmezí od volání komplexní portfolio rizik, metriky pro homogenní rizikové skupiny z portfolia, přes montáž, rozdělení do kategorií vzorků, aby něco, co můžete obraz, opravdu.
zde je příklad s“ komplexní “ metrikou rizika portfolia (expozice různým protistranám v různých třídách aktiv):
zde je použití funkce aggregate()
.
další: přizpůsobení Gaussova rozdělení pozorování podle kategorií:
níže používáme funkci aggregate()
k nalezení střední a směrodatné odchylky podle kategorií.
tento poslední příklad ukazuje několik zajímavých vlastností. Za prvé, data.frame
až aggregate
a seznam proměnných by
nemusí být stejné. I když je to naznačeno na jiných místech příspěvku, toto je explicitní příklad takového nastavení. Za druhé, funkce předaná jako FUN
není pouze anonymní funkcí, je curried z funkce s více než jedním vstupním parametrem. Funkce jedné vstupní proměnné observations
byl vytvořen ze dvou-vstupní proměnná funkce fitdistr
: stanovení jedné ze vstupních proměnných nastavením densfun = "normal"
. Zatřetí, namísto vrácení plné návratové hodnoty funkce fitdistr
je návratová hodnota omezena na prvek estimate
z návratové hodnoty. A v neposlední řadě návratová hodnota anonymní funkce předaná FUN
se skládá ze dvou proměnných a ne pouze jedné. Zajímavé je, že agregát vrhá návratovou hodnotu z list
na matrix
a pojmenuje prvky pro nás. Tyto názvy však nelze použít k odkazu na sloupce matice. Můžete je však odkazovat následovně:
distr.estimate$observation] 3.016988
závěrečná slova
doufám, že jste našli výše uvedené užitečné. Nyní, když jste více obeznámeni s aggregate
, je čas na pravdu: vše výše a mnohem více lze provést s data.table
as mnohem rychlejším výkonem. Nicméně, data.table
má složitou syntaxi a člověk opravdu musí pochopit, jak věci fungují pod kapotou, zatímco aggregate
je jednoduchý a bystrý. Dokud nebudete spokojeni s logikou agregace i syntaxí data.table
, je hodnou investicí nejprve napsat kód pomocí aggregate
a poté jej optimalizovat přepsáním pomocí data.table
.
pro ty z vás, kteří mají zájem, přichází vyhrazený příspěvek, kde je výše uvedené přepracováno data.table
, spolu s některými dalšími případy použití specifickými pro data.table
.