
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