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

Logo Matematická biologie

Spojování datových tabulek

Nejjednodušší a také nejméně sofistikovaný způsob spojování tabulek je použití funkcí rbind() a cbind(). První funkce spojuje tabulky přes řádky (pod sebe) a vyžaduje stejný počet sloupců, druhá funkce pak spojuje sloupce (vedle sebe) a vyžaduje stejný počet řádků u všech spojovaných tabulek.

Obvykle však chceme spojit datové tabulky, které nemají stejný počet sloupců, ani řádků.

Vytvořme si pro příklad tři datové tabulky. V první je informace o tom, kdo vlastní jaké zvíře. Druhá tabulka obsahuje informaci, jaký druh potravy které zvíře preferuje, třetí zas cenu dané stravy za měsíc na jedno zvíře.

> majiteletab <- data.frame(jmeno=c("Matěj", "Eva", "Petr","Anna", "Jana","Alena","Ivan"),pets=c("kočka", "pes", "kanárek", "pes", "potkan", "potkan", "fretka"))
> stravatab <- data.frame(zvire=c("kočka","pes","kanárek","potkan"), strava = c("mléko","maso","proso","sýr"))
> cenatab <- data.frame(strava = c("mléko","maso","proso","sýr"), cena=c(50,500,130,315))

Chceme-li zjistit, kolik stojí strava pro které zvíře měsíčně, stačí spojit tabulky stravatab a cenatab pomocí cbind(), protože se jedná o stejně seřazené tabulky se stejným počtem řádků:

> zvire.cena <- cbind(stravatab, cena=cenatab[,-1])
> zvire.cena

    zvire    strava  cena
1   kočka     mléko    50
2     pes      maso   500
3 kanárek     proso   130
4  potkan       sýr   315


Chceme-li zjistit, kolik platí za stravu svého miláčka měsíčně každý majitel, musíme tabulku sjednotit pomocí sofistikovanější funkce, například merge(), která spojuje tabulky na základě proměnné se stejným názvem (nezadáte-li funkci jinak):

merge(x, y) # defaultně spojí jen řádky bez chybějících hodnot
merge(x, y, all = TRUE) # spojí všechny řádky
merge(x, y, all.x = TRUE) # spojí všechny řádky první tabulky a pouze ty řádky z druhé, které odpovídají řádkům x
merge (x, y, all.It = TRUE) # spojí všechny řádky druhé tabulky a pouze ty z první, které odpovídají řádkům y

První příkaz teda opravdu spojí přes proměnnou zvire, která je v obou tabulkách. Chybí však údaj o Ivanovi, který má fretku, protože cena stravy fretky není známa.

> merge(majitele, cenatab)
    zvire   jmeno strava   cena
1 kanárek    Petr  proso    130
2   kocka   Matej  mléko     50
3     pes     Eva   maso    500
4     pes    Anna   maso    500
5  potkan    Jana    sýr    315
6  potkan   Alena    sýr    315

Použijeme tedy argument all.x=TRUE, který zařadí všechny řádky první tabulky:

> merge(majitele, cenatab, all.x=TRUE)
    zvire jmeno strava cena
1  fretka  Ivan   <NA>   NA
2 kanárek  Petr  proso  130
3   kocka Matej  mléko   50
4     pes   Eva   maso  500
5     pes  Anna   maso  500
6  potkan  Jana    sýr  315
7  potkan Alena    sýr  315

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