Slovník | Vyhledávání | Mapa webu
 
Základy informatiky pro biologyAnalýza dat v R Úprava a transformace dat v R Agregace

Logo Matematická biologie

Agregace

Agregace dat se v analýze využívá:

  • pro úpravy dat (sjednocování řádků nebo sloupců v případě opakovaných měření)
  • pro generování sumárních statistik a frekvenčních tabulek (sumarizace)

Funkce pro agregaci v R se dají rozdělit podle typu objektu:

  • Pro seznamy, matice a pole: apply(), mapply(), sweep(), sapply(), lapply()
  • Pro datové tabulky: aggregate(), by(), table()

Výběr agregační funkce se tedy provádí jednak podle typu objektu, ale také podle toho jestli jsou skupiny definovány jednou nebo více proměnnými:

  • Skupiny jsou definovány jako prvky seznamu (list): sapply(), lapply()
  • Skupiny jsou definovány řádky nebo sloupci matice: apply()
  • Skupiny definované jednou nebo více proměnnými: aggregate(), tapply()

Pro podrobnější informace o použití funkcí skupiny apply()si prostudujte výukovou jednotku:Skupiny funkcí apply() předmětu Výpočetní matematické systémy.

Funkce aggregate() - shrnuje hodnoty ve skupinách do popisných statistik a vrací výsledek v nejvhodnější formě. Ukážeme si na příkladu dat kosatců:
> data (iris)

Vypočteme průměrné hodnoty čtyř charakteristik květů kosatců  (šířka a délka okvětních a kališních lístků) na základě příslušnosti ke druhu kosatce :
> data(iris)
> aggregate(x=iris[,-5], by=iris[5], FUN = mean)

     Species Sepal.Length Sepal.Width Petal.Length Petal.Width
1     setosa        5.006       3.428        1.462       0.246
2 versicolor        5.936       2.770        4.260       1.326
3  virginica        6.588       2.974        5.552       2.026

Skupinová proměnná musí být definována jako seznam. Protože iris je datová tabulka, nejjednodušší způsob je odvolat se na skupinovou proměnnou pomocí iris[5].

Další způsob agregace dat je použít nástroje knihovny reshape, kterou jsme si představili již v kapitole Reorganizace datových tabulek při tvorbě dlouhé (funkce melt) a široké (funkce cast) datové tabulky.

Funkce cast() dokáže nejen vytvořit širokou verzi tabulky, ale také sumarizovat hodnoty podle zadané funkce.

Principem použití je tedy nejdříve vytvořit dlouhou verzi datového souboru pomocí funkce melt(), kterou potom přeformujeme pomocí funkce cast().

Připomínáme, že melt() je funkce, která uspořádá všechny proměnné, které měříme, do dvou sloupců: sloupec variable obsahující název proměnné a sloupec value obsahující hodnoty.
Při jejím použití je nutné rozlišovat identifikátorové proměnné a proměnné, které měříme - které chceme agregovat. Defaultní nastavení je, že proměnné typu faktor a character jsou identifikátorové, jinak je třeba definovat proměnné pomocí argumentů id.var = a measure.var =.

Pro příklad použijeme znovu datovou tabulku state.fin:

> data(state)

> library(reshape)

> state.fin <- data.frame(state.x77, state=row.names(state.x77), region=state.region, division = state.division, row.names=1:50)

> head(state.fin)
  Population Income Illiteracy Life.Exp Murder HS.Grad Frost   Area      state region
1       3615   3624        2.1    69.05   15.1    41.3    20  50708    Alabama  South
2        365   6315        1.5    69.31   11.3    66.7   152 566432     Alaska   West
3       2212   4530        1.8    70.55    7.8    58.1    15 113417    Arizona   West
4       2110   3378        1.9    70.66   10.1    39.9    65  51945   Arkansas  South
5      21198   5114        1.1    71.71   10.3    62.6    20 156361 California   West
6       2541   4884        0.7    72.06    6.8    63.9   166 103766   Colorado   West
            division
1 East South Central
2            Pacific
3           Mountain
4 West South Central
5            Pacific
6           Mountain

Pro jednotlivé regiony chceme vypočítat průměrnou velikost populace, příjmu, procenta analfabetů, věku dožití, podílu vražd na 100 tis. obyvatel, procento lidí se střední školou a průměrný počet dnů v roce s minimální teplotou pod 0.

Datovou tabulku state.fin můžeme v tomto smyslu považovat za široká data. Pomocí funkce melt() vytvoříme "dlouhou" verzi dat. Protože state a region jsou faktory, jsou defaultně považovány za identifikátorové proměnné:

> mstates <- melt(state.fin)
Using state, region, division as id variables

> head(mstates)
       state region           division   variable value
1    Alabama  South East South Central Population  3615
2     Alaska   West            Pacific Population   365
3    Arizona   West           Mountain Population  2212
4   Arkansas  South West South Central Population  2110
5 California   West            Pacific Population 21198
6   Colorado   West           Mountain Population  2541

Nyní pomocí funkce cast() provedeme agregaci hodnot ve čtyřech US regionech a vypočteme průměr:

> cast(data=mstates, formula=region~variable, fun.aggregate=mean)
         region Population   Income Illiteracy Life.Exp    Murder  HS.Grad    Frost      Area
1     Northeast   5495.111 4570.222   1.000000 71.26444  4.722222 53.96667 132.7778  18141.00
2         South   4208.125 4011.938   1.737500 69.70625 10.581250 44.34375  64.6250  54605.12
3 North Central   4803.000 4611.083   0.700000 71.76667  5.275000 54.51667 138.8333  62652.00
4          West   2915.308 4702.615   1.023077 71.23462  7.215385 62.00000 102.1538 134463.00

Argument formula= funkce cast() určuje způsob agregace dat, zatímco argument fun.aggregate= zas funkci, kterou se data agregují. Vyměníme-li ve formuli region a variable, dostaneme stejný výsledek, ale transponovanou tabulku:

> cast(mstates, variable~region, mean)
    variable    Northeast       South North Central         West
1 Population  5495.111111  4208.12500    4803.00000 2.915308e+03
2     Income  4570.222222  4011.93750    4611.08333 4.702615e+03
3 Illiteracy     1.000000     1.73750       0.70000 1.023077e+00
4   Life.Exp    71.264444    69.70625      71.76667 7.123462e+01
5     Murder     4.722222    10.58125       5.27500 7.215385e+00
6    HS.Grad    53.966667    44.34375      54.51667 6.200000e+01
7      Frost   132.777778    64.62500     138.83333 1.021538e+02
8       Area 18141.000000 54605.12500   62652.00000 1.344630e+05

Na rozdíl od funkce aggregate(), funkce cast() akceptuje i funkce, jejichž výstupem jsou vektory, popřípadě akceptuje i seznam více funkcí.

použití .~variable vypočítá průměry proměnných pro celý soubor:

> cast(mstates,. ~ variable, mean)
  value Population Income Illiteracy Life.Exp Murder HS.Grad  Frost     Area
1 (all)    4246.42 4435.8       1.17  70.8786  7.378  53.108 104.46 70735.88

variable ~. | region uspořádá výsledky do seznamu:

> cast(mstates, variable ~. | region, mean)
$Northeast
    variable        (all)
1 Population  5495.111111
2     Income  4570.222222
3 Illiteracy     1.000000
4   Life.Exp    71.264444
5     Murder     4.722222
6    HS.Grad    53.966667
7      Frost   132.777778
8       Area 18141.000000

$South
    variable       (all)
1 Population  4208.12500
2     Income  4011.93750
3 Illiteracy     1.73750
4   Life.Exp    69.70625
5     Murder    10.58125
6    HS.Grad    44.34375
7      Frost    64.62500
8       Area 54605.12500

$`North Central`
    variable       (all)
1 Population  4803.00000
2     Income  4611.08333
3 Illiteracy     0.70000
4   Life.Exp    71.76667
5     Murder     5.27500
6    HS.Grad    54.51667
7      Frost   138.83333
8       Area 62652.00000

$West
    variable        (all)
1 Population 2.915308e+03
2     Income 4.702615e+03
3 Illiteracy 1.023077e+00
4   Life.Exp 7.123462e+01
5     Murder 7.215385e+00
6    HS.Grad 6.200000e+01
7      Frost 1.021538e+02
8       Area 1.344630e+05

 
vytvořil Institut biostatistiky a analýz Lékařské fakulty Masarykovy univerzity