User Tools

Site Tools


Sidebar

Vít Syrovátka

Úvod do R


Teorie

Sekce Teorie je (a asi ještě dlouho bude) v průběžné výstavbě.

Software

Objekty v R

Cvičení

Data

Zápočet

Další zdroje

R for Data Science (2017) - excelentní tutorial Hadleyho Wickhama následující filozofii tidyversu
Data Processing with dplyr & tidyr - tutorial na úpravu dataframů pomocí tidyversových balíků dplyr a tidyr

r_intro:cs:theory:sorting

Table of Contents

Řazení dat

Mnohdy potřebujeme data nějak seřadit. Třeba si chceme zběžně prohlédnout rozložení hodnot, hledáme vztahy mezi proměnnými, nebo se chceme blíž podívat na část dat, která je nejvíc nebo nejmíň “něco”. Zde se dozvíte, jak data řadit pomocí základních funkcí.

Ty jsou tři:

  • sort()
  • rank()
  • order()

sort()

Funkce sort() seřadí vlastní hodnoty vektoru podle velikosti, případně podle abecedy. Použijeme ji tehdy, cheme-li seřadit samotné hodnoty jednoho vektoru. Můžeme třeba seřadit výšky studentů z dataframu miry miry.xlsx pro jejich zběžné prohlédnutí. Celý dataframe vypadá takto:

miry
         noha vyska sex
Jitka    25.0   171   z
Marketa  25.6   176   z
Jarda    29.6   192   m
Ondra      NA    NA   m
Dorota     NA   175   z
Lukas      NA   181   m
Vita     31.0   194   m
Jirka    29.0   194   m
Klara    23.0   159   z
Karolina 25.5   168   z
Lenka    27.0   175   z
Dominik  27.0   178   m

A seřazené výšky:

sort(miry$vyska)
 [1] 159 168 171 175 175 176 178 181 192 194 194

Všimněte si, že neznámá hodnota (v dataframu u Ondry) v seřazených výškách chybí. Funkce sort() implicitně NA hodnoty nevrací. Vynechání NA hodnot můžeme zabránit nastavením argumentu na.last= na TRUE nebo FALSE (potom NA hodnoty budou přidány na konci nebo na začátku).

sort(miry$vyska, na.last= T)
 [1] 159 168 171 175 175 176 178 181 192 194 194  NA
sort(miry$vyska, na.last= F)
 [1]  NA 159 168 171 175 175 176 178 181 192 194 194

Seřazení hodnot od nejvyšších po nejnižší dosáhneme pomocí argumentu decreasing= :

sort(miry$vyska, decreasing= T)
 [1] 194 194 192 181 178 176 175 175 171 168 159

Někdy se chceme podívat jen na pár nejnižších a nejvyšších hodnot. Potom můžeme jejich seřazení spojit s podvýběrem. Například 3 nejnižší a 3 nejvyšší hodnoty zobrazíme takto:

sort(miry$vyska)[1:3]
[1] 159 168 171
sort(miry$vyska, decreasing= T)[1:3]
[1] 194 194 192

order()

Chceme-li podle hodnot v jednom vektoru seřadit hodnoty druhého vektoru, nebo třeba řádky či sloupce tabulkového objektu, použijeme funkci order() . Ta totiž vrátí pořadí hodnot prvního vektoru, v jakém mají být, aby byly seřazené. A použijeme-li toto pořadí jako subscript pro podvýběr ze druhého objektu, dosáhneme jeho seřazení podle toho prvního. Například, seřadíme měřené jedince (řádky) dataframu miry podle výšek:

miry[order(miry$vyska), ]
         noha vyska sex
Klara    23.0   159   z
Karolina 25.5   168   z
Jitka    25.0   171   z
Dorota     NA   175   z
Lenka    27.0   175   z
Marketa  25.6   176   z
Dominik  27.0   178   m
Lukas      NA   181   m
Jarda    29.6   192   m
Vita     31.0   194   m
Jirka    29.0   194   m
Ondra      NA    NA   m

Jak to funguje

Zde je původní vektor:

miry$vyska
 [1] 171 176 192  NA 175 181 194 194 159 168 175 178

a zde výsledek funkce order() :

order(miry$vyska)
 [1]  9 10  1  5 11  2 12  6  3  7  8  4

Order říká: “Aby vektor výšek byl seřazený podle velikosti, dej na první místo devátou hodnotu, na druhé místo desátou, pak první, pátou, … a nakonec čtvrtou”. Vrací nám tedy subscript, který hodnoty seřadí podle velikosti. A protože je to subscript, můžeme podle výšky seřadit i jiný objekt (pokud pořadí měřených případů v obou objektech odpovídá).

Řazení můžeme provést i podle více proměnných. Například nejprve podle pohlaví a uvnitř každé úrovně pohlaví podle velikosti nohy:

miry[order(miry$sex, miry$noha), ]
         noha vyska sex
Dominik  27.0   178   m
Jirka    29.0   194   m
Jarda    29.6   192   m
Vita     31.0   194   m
Ondra      NA    NA   m
Lukas      NA   181   m
Klara    23.0   159   z
Jitka    25.0   171   z
Karolina 25.5   168   z
Marketa  25.6   176   z
Lenka    27.0   175   z
Dorota     NA   175   z

A samozřějmě můžeme řadit i obráceně, od nejvyšších hodnot po nejnižší. Toho dosáhneme buď nastavením argumentu decreasing= TRUE:

miry[order(miry$vyska, decreasing= T), ]

nebo změníme znaménko vektoru, podle nějž chceme řadit:

miry[order(-miry$vyska), ]
         noha vyska sex
Vita     31.0   194   m
Jirka    29.0   194   m
Jarda    29.6   192   m
Lukas      NA   181   m
Dominik  27.0   178   m
Marketa  25.6   176   z
Dorota     NA   175   z
Lenka    27.0   175   z
Jitka    25.0   171   z
Karolina 25.5   168   z
Klara    23.0   159   z
Ondra      NA    NA   m

Tuto možnost využijeme, pokud chceme podle jedné proměnné řadit vzestupně, ale podle jiné sestupně. Například můžeme seřadit miry vzestupně podle jména, ale tak, aby nejprve byly ženy, a pak muži. Abychom mohli řadit sestupně otočením znaménka, musíme faktor sex převést na čísla:

miry[order(-as.numeric(miry$sex), rownames(miry)), ]
         noha vyska sex
Dorota     NA   175   z
Jitka    25.0   171   z
Karolina 25.5   168   z
Klara    23.0   159   z
Lenka    27.0   175   z
Marketa  25.6   176   z
Dominik  27.0   178   m
Jarda    29.6   192   m
Jirka    29.0   194   m
Lukas      NA   181   m
Ondra      NA    NA   m
Vita     31.0   194   m

rank()

Neparametrické testy namísto vlastních naměřených hodnot počítají s jejich pořadími. Pořadí nám vrátí funkce rank():

miry$vyska
 [1] 171 176 192  NA 175 181 194 194 159 168 175 178
rank(miry$vyska)
 [1]  3.0  6.0  9.0 12.0  4.5  8.0 10.5 10.5  1.0  2.0  4.5  7.0

rank() nám říká, že první hodnota ve vektoru výšek, hodnota 171, je třetí nejnižší. Ta druhá, 176 je šestá nejnižší, třetí devátá, atd. Stejně jako u funkce order() NA hodnoty jsou skládány nakonec. Proto NA hodnota dostala pořadí 12. Pokud se ve vektoru vyskytnou 2 nebo více stejných hodnot, seřadí se za sebe a jejich pořadí je zprůměrováno.

r_intro/cs/theory/sorting.txt · Last modified: 2017/02/23 17:09 (external edit)