Slovník | Vyhledávání | Mapa webu
 
Základy informatiky pro biologyVýpočetní matematické systémy Výuka jazyka R Datové tabulky a seznamy Funkce pro manipulaci s datovými tabulkami a seznamy

Logo Matematická biologie

Slučování a řazení

Slučování

Ke sloučení datových tabulek můžeme použít funkce cbind() nebo rbind(), které je sloučí po sloupcích nebo řádcích. Při použití funkce cbind() musí mít přidávané sloupce stejný počet řádků jako v již existující datové tabulce. Rovněž je vhodné se přesvědčit, že přidávané sloupce mají stejné pořadí řádků. Při použití funkce rbind() je třeba dodržovat stejný počet sloupců a jejich shodné názvy.

Alternativou k funkcím cbind() a rbind() může být funkce
merge(x, y, by, by.x, by.y, all, all.x, all.y)    sloučí datové tabulky x a y

by, by.x, by.y    specifikují ty názvy sloupců, podle kterých mají být tabulky sloučeny. V případě stejného názvu sloupců použijeme argument by. Jsou-li názvy sloupců ke sloučení různé, specifikujeme je pomocí argumentů by.x a by.y. V případě více podmínek na spojení podmínky uvádíme ve formě vektoru typu řetězec.

all, all.x a all.y    specifikace těch řádků, které se mají objevit na výstupu. Implicitní nastavení all=FALSE vrací pouze řádky z průniku obou tabulek, all=TRUE vrací řádky ze sjednocení obou tabulek. all.x=TRUE vrací všechny řádky tabulky x, analogicky je tomu u all.y=TRUE.

Poznámka. Při použití některého z argumentů all=TRUE, all.x=TRUE nebo all.y=TRUE mají „volná“ místa, která vznikla spojením, hodnotu NA.

> (tab1 <- data.frame(auto=c("fiat", "opel", "skoda", "bmw"), barva= c("seda", "cervena",
+ "cerna", "modra"), rok=c(2003, 1999, 2008, 2004)))
 
auto
barva
rok
1
fiat
seda
2003
2
opel
cervena
1993
3
skoda
cerna
2008
4
bmw
modra
2004
> (tab2 <- data.frame(znacka=c("saab", "bmw", "audi"), majitel=c("muz", "zena", "zena")))
 
znacka
majitel
1
saab
muz
2
bmw
zena
3
audi
zena
> merge(tab1, tab2)    protože tabulky neobsahují stejný název sloupce, podle kterého by se sloučení mělo řídit, R vytvoří kartézský součin obou tabulek (tzn. ke každému řádku tab1 se připojí každý řádek tab2)
 
auto
barva
rok
znacka
majitel
1
fiat
seda
2003
saab
muz
2
opel
cervena
1999
saab
muz
3
skoda
cerna
2008
saab
muz
4
bmw
modra
2004
saab
muz
5
fiat
seda
2003
bmw
zena
6
opel
cervena
1999
bmw
zena
7
skoda
cerna
2008
bmw
zena
8
bmw
modra
2004
bmw
zena
9
fiat
seda
2003
audi
zena
10
opel
cervena
1999
audi
zena
11
skoda
cerna
2008
audi
zena
12
bmw
modra
2004
audi
zena
> merge(tab1, tab2, by.x="auto", by.y="znacka")    spojení na základě výskytu bmw v obou sloupcích auto i znacka
 
auto
barva
rok
majitel
1
bmw
modra
2004
zena
> merge(tab1, tab2, by.x="auto", by.y="znacka", all.x=T)    argumentall.x=T zajistil, aby výstup obsahoval všechny hodnoty z tab1
 
auto
barva
rok
majitel
1
bmw
modra
2004
zena
2
fiat
seda
2003
<NA>
3
opel
cervena
1999
<NA>
4
skdoa
cerna
2008
<NA>
 

Řazení

K seřazení tabulek dat se používá funkce order(), která vrací vektor indexů vzestupně (implicitně) nebo sestupně uspořádaných prvků. Pro více informací o funkci order viz odstavec Matematické funkce.

> knihy

 
nazev
autor
pocet
k_dispozici
1
 Dekameron
Boccaccio
3
FALSE
2
Maj
Macha
6
FALSE
3
Temno
Jirasek
4
TRUE
4
Bidnici
Hugo
3
FALSE
5
Babicka
Nemcova
5
TRUE
> knihy[order(knihy$k_dispozici, knihy$nazev),]    seřazuje podle sloupce k_dispozici, v případě vícenásobných hodnot řadí podle sloupce nazev
 
nazev
autor
pocet
k_dispozici
4
 Bidnici
Hugo
3
FALSE
1
Dekameron
Boccaccio
3
FALSE
2
Maj
Macha
6
FALSE
5
Babicka
Nemcova
5
TRUE
3
Temno
Jirasek
4
TRUE
> knihy[order(knihy$k_dispozici, -knihy$pocet),]    pokud některý ze sloupců tabulky tvoří numerický vektor, pro sestupné uspořádání tohoto sloupce můžeme použít operátoru -. Rovněž si můžeme všimnout, že v případě nejednoznačných podmínek na seřazení (řádek č. 1 a 4) dostává přednost řádek s nižším pořadovým číslem, u názvů řádků se postupuje podle abecedního uspořádání.
 
nazev
autor
pocet
k_dispozici
2
Maj
Macha
6
FALSE
1
Dekameron
Boccaccio
3
FALSE
4
Bidnici
Hugo
3
FALSE
5
Babicka
Nemcova
5
TRUE
3
Temno
Jirasek
4
TRUE
 

 

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