R Select(), Filter(), Arrange(), Pipeline with Example

โšก Chytrรฉ shrnutรญ

Select, Filter a Arrange v R jsou tล™i pล™รญkazy dplyr, kterรฉ redukujรญ datovรฝ rรกmec na potล™ebnรฉ sloupce, ล™รกdky a poล™adรญ. Tento nรกvod je zล™etฤ›zรญ s operรกtorem pipe na datovรฉ sadฤ› o dobรกch cestovรกnรญ s 205 ล™รกdky.

  • ???? Vรฝbฤ›r sloupce: Funkce select(df, A, B) zachovรกvรก pojmenovanรฉ sloupce, funkce select(df, A:C) zachovรกvรก rozsah sloupcลฏ a funkce select(df, -C) jeden sloupec odstranรญ.
  • ๐Ÿ”Ž Filtrovรกnรญ ล™รกdkลฏ: Funkce filter(df, condition) uchovรกvรก odpovรญdajรญcรญ ล™รกdky a podmรญnky se kombinujรญ s ampersandem pro operรกtor AND nebo svislou ฤรกrou pro operรกtor OR.
  • ๐Ÿ”ฃ Tล™รญdฤ›nรญ: Funkce arrange() standardnฤ› ล™adรญ ล™รกdky vzestupnฤ› a funkce desc() obracรญ poล™adรญ libovolnรฉho sloupce.
  • ๐Ÿ”— Trubka Operator: Operรกtor %>% pล™edรกvรก kaลพdรฝ vรฝsledek pล™รญmo do dalลกรญho slovesa, takลพe ลพรกdnรฉ mezilehlรฉ objekty nezahlcujรญ prostล™edรญ.
  • ๐Ÿงน Pomocnรฉ funkce: Funkce starts_with(), contains() a where() vybรญrajรญ sloupce podle vzoru nebo typu mรญsto podle nรกzvu.
  • ๐Ÿ“ Zรกleลพรญ na poล™adรญ sloves: Nejdล™รญve filtrujte, abyste zmenลกili data, potรฉ vyberte a nakonec uspoล™รกdejte, coลพ udrลพรญ kaลพdรฝ dalลกรญ krok levnฤ›jลกรญ.

R Vybrat filtr Uspoล™รกdat kanรกl

Co je dplyr v R?

dplyr je balรญฤek pro manipulaci s daty v tidyverse. Nahrazuje zรกvorkovou notaci zรกkladu R s malou sadou sloves, z nichลพ kaลพdรฉ je pojmenovรกno podle akce, kterou provรกdรญ, a kaลพdรฉ bere datovรฝ rรกmec jako svลฏj prvnรญ argument. Tento konzistentnรญ tvar umoลพลˆuje ล™etฤ›zenรญ sloves.

Sloveso Pลฏsobรญ na Co to dฤ›lรก
vybrat() Sloupce Zachovรกvรก nebo odstraลˆuje promฤ›nnรฉ
filtr() ล˜รกdky Udrลพuje ล™รกdky odpovรญdajรญcรญ podmรญnce
uspoล™รกdat() ล˜รกdky Zmฤ›nรญ poล™adรญ ล™รกdkลฏ o jeden nebo vรญce sloupcลฏ
mutovat() Sloupce Vytvoล™รญ nebo upravรญ promฤ›nnou
shrnout() Celรฝ stลฏl Sbalรญ vรญce ล™รกdkลฏ do jednรฉ statistiky
seskupovat_podle() Celรฝ stลฏl Rozdฤ›lรญ data tak, aby pozdฤ›jลกรญ slovesa bฤ›ลพela v jednotlivรฝch skupinรกch.

Tento tutoriรกl se zabรฝvรก prvnรญmi tล™emi slovesy a svislou ฤรกrkou. tutoriรกl k agregaฤnรญ funkci Podrobnฤ› se zabรฝvรก metodami group_by() a summarize().

Datovรก sada pouลพitรก v tomto tutoriรกlu

Knihovna s nรกzvem dplyr obsahuje cennรฉ slovesa pro navigaci v datovรฉ sadฤ›. V tomto tutoriรกlu se seznรกmรญte s datovou sadou Travel times (doby cestovรกnรญ). Datovรก sada zaznamenรกvรก cesty, kterรฉ ล™idiฤ podnikne mezi domovem a pracoviลกtฤ›m. V datovรฉ sadฤ› je ฤtrnรกct promฤ›nnรฝch, vฤetnฤ›:

  • DayOfWeek: Urฤete den v tรฝdnu, kdy ล™idiฤ pouลพรญvรก svรฉ auto
  • Vzdรกlenost: Celkovรก vzdรกlenost cesty
  • MaxSpeed: Maximรกlnรญ rychlost jรญzdy
  • TotalTime: Dรฉlka cesty v minutรกch

Soubor dat obsahuje 205 pozorovรกnรญ a jรญzdy se uskuteฤnily od Monday do pรกtku.

Nejprve musรญte:

  • naฤรญst datovou sadu
  • zkontrolujte strukturu dat.

Jednou z praktickรฝch funkcรญ v dplyru je glimpse(). Hraje stejnou roli jako str() v zรกkladnรญm R, ale vypisuje jeden ล™รกdek na promฤ›nnou s typem a prvnรญmi nฤ›kolika hodnotami, coลพ je mnohem snazลกรญ prohledรกvat na ลกirokรฉ datovรฉ sadฤ›.

library(dplyr) 
PATH <- "https://raw.githubusercontent.com/guru99-edu/R-Programming/master/travel_times.csv"
df <- read.csv(PATH)
glimpse(df)

Vรฝstup:

## Observations: 205
## Variables: 14
## $ X              <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ...
## $ Date           <fctr> 1/6/2012, 1/6/2012, 1/4/2012, 1/4/2012, 1/3/20...
## $ StartTime      <fctr> 16:37, 08:20, 16:17, 07:53, 18:57, 07:57, 17:3...
## $ DayOfWeek      <fctr> Friday, Friday, Wednesday, Wednesday, Tuesday,...
## $ GoingTo        <fctr> Home, GSK, Home, GSK, Home, GSK, Home, GSK, GS...
## $ Distance       <dbl> 51.29, 51.63, 51.27, 49.17, 51.15, 51.80, 51.37...
## $ MaxSpeed       <dbl> 127.4, 130.3, 127.4, 132.3, 136.2, 135.8, 123.2...
## $ AvgSpeed       <dbl> 78.3, 81.8, 82.0, 74.2, 83.4, 84.5, 82.9, 77.5,...
## $ AvgMovingSpeed <dbl> 84.8, 88.9, 85.8, 82.9, 88.1, 88.8, 87.3, 85.9,...
## $ FuelEconomy    <fctr> , , , , , , -, -, 8.89, 8.89, 8.89, 8.89, 8.89...
## $ TotalTime      <dbl> 39.3, 37.9, 37.5, 39.8, 36.8, 36.8, 37.2, 37.9,...
## $ MovingTime     <dbl> 36.3, 34.9, 35.9, 35.6, 34.8, 35.0, 35.3, 34.3,...
## $ Take407All     <fctr> No, No, No, No, No, No, No, No, No, No, No, No...
## $ Comments       <fctr> , , , , , , , , , , , , , , , Put snow tires o...	

Promฤ›nnรก Comments si zjevnฤ› vyลพaduje bliลพลกรญ pohled: prvnรญ pozorovรกnรญ jsou vลกechna prรกzdnรก.

sum(df$Comments =="")

Code Vysvฤ›tlenรญ

  • sum(df$Comments == โ€œโ€): Poฤรญtรก pozorovรกnรญ rovnajรญcรญ se prรกzdnรฉmu ล™etฤ›zci ve sloupci Komentรกล™e funkce df

Vรฝstup:

## [1] 181

Po naฤtenรญ dat zaฤnฤ›te s pล™รญkazem, kterรฝ oล™ezรกvรก sloupce.

vybrat()

Zaฤneme slovesem select(). Nepotล™ebujeme nutnฤ› vลกechny promฤ›nnรฉ a osvฤ›dฤenรฝm postupem je vybrat pouze ty promฤ›nnรฉ, kterรฉ povaลพujete za relevantnรญ.

Mรกme 181 chybฤ›jรญcรญch pozorovรกnรญ, tรฉmฤ›ล™ 90 procent datovรฉho souboru. Pokud se je rozhodnete vylouฤit, nebudete moci v analรฝze pokraฤovat.

Dalลกรญ moลพnostรญ je vypustit promฤ›nnou Komentรกล™ se slovesem select().

Pomocรญ select() mลฏลพeme vybรญrat promฤ›nnรฉ rลฏznรฝmi zpลฏsoby. Vลกimnฤ›te si, ลพe prvnรญm argumentem je datovรก sada.

- `select(df, A, B ,C)`: Select the variables A, B and C from df dataset.
- `select(df, A:C)`: Select all variables from A to C from df dataset.
- `select(df, -C)`: Exclude C from the dataset from df dataset.	

K vylouฤenรญ promฤ›nnรฉ Komentรกล™e mลฏลพete pouลพรญt tล™etรญ zpลฏsob.

step_1_df <- select(df, -Comments)
dim(df)

Vรฝstup:

## [1] 205  14
dim(step_1_df)

Vรฝstup:

## [1] 205  13

Pลฏvodnรญ datovรก sada mรก 14 funkcรญ, zatรญmco step_1_df mรก 13.

Pomocnรฉ funkce select() v R

Pojmenovรกnรญ kaลพdรฉho sloupce se stรกvรก nepraktickรฝm, jakmile datovรก sada obsahuje desรญtky promฤ›nnรฝch. dplyr je dodรกvรกn s pomocnรญky, kterรฉ mรญsto toho vybรญrajรญ sloupce podle vzoru nebo podle typu.

Pomocnรญk Vybere sloupce, kterรฉ Pล™รญklad
zaฤรญnรก_s() Zaฤnฤ›te ล™etฤ›zcem select(df, starts_with(โ€žPrลฏmฤ›rโ€œ))
konฤรญ_s() Ukonฤete provรกzkem vybrat(df, konฤรญ_s(โ€žฤŒasโ€œ))
obsahuje() Obsahovat ล™etฤ›zec kdekoli select(df, contains(โ€žRychlostโ€œ))
zรกpasy() Hledรกnรญ regulรกrnรญho vรฝrazu select(df, matches(โ€œ^Max|^Prลฏmฤ›rโ€))
kde() Splลˆte poลพadavky typovรฉ zkouลกky vybrat(df, kde(je.ฤรญselnรฝ))
vลกechno() Zatรญm nebyli jmenovรกni vybrat(df, CelkovรฝฤŒas, vลกechno())
# Keep only the timing columns
df %>% select(ends_with("Time"))

# Keep every numeric column
df %>% select(where(is.numeric))

# Move TotalTime to the front, keep the rest in place
df %>% select(TotalTime, everything())

S funkcรญ select() se pล™irozenฤ› pรกrujรญ dalลกรญ dvฤ› slovesa. Pro zmฤ›nu nรกzvu sloupce bez jeho odstranฤ›nรญ pouลพijte rename(new_name = old_name).ping ostatnรญ a relocate() pro pล™esun sloupcลฏ bez jejich vรฝpisu vลกech.

filtr()

Sloveso filter() uchovรกvรก pozorovรกnรญ, kterรก splลˆujรญ podmรญnku. Filter() funguje pล™esnฤ› jako select(), nejprve se pล™edรก datovรฝ rรกmec a potรฉ podmรญnka oddฤ›lenรก ฤรกrkou:

filter(df, condition)
arguments:
- df: dataset used to filter the data
- condition:  Condition used to filter the data	

Jedno kritรฉrium

Nejprve mลฏลพete spoฤรญtat poฤet pozorovรกnรญ v rรกmci kaลพdรฉ รบrovnฤ› faktorovรฉ promฤ›nnรฉ.

table(step_1_df$GoingTo)

Code Vysvฤ›tlenรญ

  • table(): Spoฤรญtรก poฤet pozorovรกnรญ na รบroveลˆ. Oฤekรกvรก faktor nebo znakovou promฤ›nnou.
  • table(step_1_df$GoingTo): Spoฤรญtejte poฤet cest smฤ›rem ke kaลพdรฉmu cรญli

Vรฝstup:

## 
##  GSK Home 
##  105  100	

Funkฤnรญ tabulka() udรกvรก, ลพe 105 jรญzd smฤ›ล™uje do GSK a 100 do Home.

Data mลฏลพeme filtrovat, abychom vrรกtili jednu datovou sadu se 105 pozorovรกnรญmi a druhou se 100 pozorovรกnรญmi.

# Select observations where GoingTo == Home
select_home <- filter(df, GoingTo == "Home")
dim(select_home)

Vรฝstup:

## [1] 100  14
# Select observations where GoingTo == GSK (work)
select_work <- filter(df, GoingTo == "GSK")
dim(select_work)

Vรฝstup:

## [1] 105  14

Vรญce kritรฉriรญ

Datovou sadu mลฏลพeme filtrovat podle vรญce neลพ jednoho kritรฉria. Mลฏลพete napล™รญklad extracpozorovรกnรญ, kde cรญlem je Domov a cesta se uskuteฤnila ve stล™edu.

select_home_wed <- filter(df, GoingTo == "Home" & DayOfWeek == "Wednesday")
dim(select_home_wed)

Vรฝstup:

## [1] 23 14

Tomuto kritรฉriu odpovรญdalo 23 pozorovรกnรญ.

Bฤ›ลพnรฉ podmรญnky filtru() a Operatory v R

Funkce filter() uchovรกvรก vลกechny ล™รกdky, pro kterรฉ je podmรญnka vyhodnocena jako TRUE. ล˜รกdky, kterรฉ jsou vyhodnoceny jako NA, jsou vynechรกny, coลพ je chovรกnรญ, kterรฉ pล™ekvapuje vฤ›tลกinu zaฤรกteฤnรญkลฏ.

OperaTor Vรฝznam Pล™รญklad
== Rovnรก filter(df, GoingTo == โ€žDomลฏโ€œ)
!= Nerovnรก se filter(df, DenVTรฝdnu != โ€œMonday")
& A obฤ› musรญ platit filtr(df, Vzdรกlenost > 50 a Max. Rychlost > 130)
| NEBO, mลฏลพe platit kterรฝkoli z nich filtr(df, DenVTรฝdnu == โ€œMondayโ€ž| DenVTรฝdnu == โ€žPรกtekโ€œ)
%v% Odpovรญdรก jakรฉkoli hodnotฤ› ve vektoru filter(df, DenVTรฝdnu %v% c(โ€œMondayโ€žPรกtekโ€œ))
mezi() Spadรก do ฤรญselnรฉho rozsahu filter(df, mezi(Vzdรกlenost, 48, 52))
is.na() Chybฤ›jรญcรญ hodnota filter(df, is.na(Spotล™ebaPaliva))

Vฤ›tลกinฤ› chyb funkce filter() zabraลˆujรญ tล™i nรกvyky.

  • Pouลพijte %in% mรญsto zล™etฤ›zenรฉho operรกtoru OR. filter(df, DenVTรฝdnu %v% c(โ€œMondayโ€žpรกtekโ€œ)) je kratลกรญ a mnohem tฤ›ลพลกรญ se u nฤ›j pล™eklepnout neลพ u dvou porovnรกnรญ == spojenรฝch svislou ฤรกrou.
  • Nikdy netestujte chybฤ›jรญcรญ hodnotu pomocรญ ==. Vรฝraz x == NA vracรญ NA, nikoli TRUE, takลพe ล™รกdek je tiลกe odstranฤ›n. Pouลพijte mรญsto toho is.na(x).
  • ฤŒรกrky znamenajรญ A. Funkce filter(df, a, b) je identickรก s funkcรญ filter(df, a & b), a proto pล™รญklad v tomto tutoriรกlu funguje obฤ›ma zpลฏsoby.

Potrubรญ Operator v dplyru

Vytvoล™enรญ datovรฉ sady vyลพaduje mnoho operacรญ, jako napล™รญklad:

  • importu
  • sluฤovรกnรญ
  • vรฝbฤ›r
  • filtrovรกnรญ
  • a tak dรกle

Knihovna dplyr pล™ichรกzรญ s praktickรฝm operรกtorem %>%, zvanรฝm dรฝmkouDรญky tomu je manipulace s daty ฤistลกรญ, rychlejลกรญ a mรฉnฤ› nรกchylnรก k chybรกm.

Tento operรกtor je kรณd, kterรฝ provรกdรญ kroky bez uklรกdรกnรญ mezikrokลฏ na pevnรฝ disk. Pokud se vrรกtรญte k naลกemu pล™รญkladu vรฝลกe, mลฏลพete vybrat promฤ›nnรฉ, kterรฉ vรกs zajรญmajรญ, a filtrovat je. Mรกme tล™i kroky:

  • Krok 1: Import dat: Importujte data gps
  • Krok 2: Vyberte data: Vyberte GoingTo a DayOfWeek
  • Krok 3: Filtrovรกnรญ dat: Nรกvrat pouze Domลฏ a Stล™eda

Mลฏลพeme k tomu pouลพรญt obtรญลพnรฝ zpลฏsob:

# Step 1
step_1 <- read.csv(PATH)

# Step 2 
step_2 <- select(step_1, GoingTo, DayOfWeek)

# Step 3 
step_3 <- filter(step_2, GoingTo == "Home", DayOfWeek == "Wednesday")

head(step_3)

Vรฝstup:

##   GoingTo DayOfWeek
## 1    Home Wednesday
## 2    Home Wednesday
## 3    Home Wednesday
## 4    Home Wednesday
## 5    Home Wednesday
## 6    Home Wednesday	

To nenรญ pohodlnรฝ zpลฏsob, jak ล™etฤ›zit mnoho operacรญ. Kaลพdรฝ mezivรฝsledek zลฏstรกvรก v prostล™edรญ a nรกzvy rychle pล™estรกvajรญ mรญt ลพรกdnรฝ vรฝznam.

Pouลพijte mรญsto toho operรกtor svisle %>%. Datovรฝ rรกmec pojmenujete jednou na zaฤรกtku a kaลพdรฝ krok vychรกzรญ z nฤ›j.

Zรกkladnรญ syntaxe potrubรญ

New_df <- df %>%
step 1 %>%
step 2 %>%
...
arguments
- New_df: Name of the new data frame 
- df: Data frame used to compute the step
- step: Instruction for each step
- Note: the last instruction does not need a trailing `%>%`, because nothing follows it
- Note: assigning the result to a new object is optional. Without it, the output prints in the console.

Svou prvnรญ rouru mลฏลพete vytvoล™it podle vรฝลกe uvedenรฝch krokลฏ.

# Create the data frame filter_home_wed.It will be the object return at the end of the pipeline
filter_home_wed <- 

#Step 1
read.csv(PATH) %>% 

#Step 2
select(GoingTo, DayOfWeek) %>% 

#Step 3
filter(GoingTo == "Home",DayOfWeek == "Wednesday")
identical(step_3, filter_home_wed)

Vรฝstup:

## [1] TRUE

Oba objekty jsou identickรฉ, takลพe roura v jednom ฤitelnรฉm pล™รญkazu vytvoล™ila pล™esnฤ› stejnรฝ vรฝsledek.

uspoล™รกdat()

v pล™edchozรญ tutoriรกl, nauฤรญte se tล™รญdit hodnoty pomocรญ funkce sort(). Knihovna dplyr mรก svou tล™รญdicรญ funkci. S potrubรญm to funguje jako kouzlo. Sloveso uspoล™รกdat() mลฏลพe zmฤ›nit poล™adรญ jednoho nebo mnoha ล™รกdkลฏ, buฤ vzestupnฤ› (vรฝchozรญ) nebo sestupnฤ›.

- `arrange(A)`: Ascending sort of variable A
- `arrange(A, B)`: Ascending sort of variable A and B
- `arrange(desc(A), B)`: Descending sort of variable A and ascending sort of B

Vzdรกlenost mลฏลพeme seล™adit podle mรญsta urฤenรญ.

# Sort by destination and distance
step_2_df <- step_1_df %>%
    arrange(GoingTo, Distance)
head(step_2_df)

Vรฝstup:

##     X       Date StartTime DayOfWeek GoingTo Distance MaxSpeed AvgSpeed
## 1 193  7/25/2011     08:06    Monday     GSK    48.32    121.2     63.4
## 2 196  7/21/2011     07:59  Thursday     GSK    48.35    129.3     81.5
## 3 198  7/20/2011     08:24 Wednesday     GSK    48.50    125.8     75.7
## 4 189  7/27/2011     08:15 Wednesday     GSK    48.82    124.5     70.4
## 5  95 10/11/2011     08:25   Tuesday     GSK    48.94    130.8     85.7
## 6 171  8/10/2011     08:13 Wednesday     GSK    48.98    124.8     72.8
##   AvgMovingSpeed FuelEconomy TotalTime MovingTime Take407All
## 1           78.4        8.45      45.7       37.0         No
## 2           89.0        8.28      35.6       32.6        Yes
## 3           87.3        7.89      38.5       33.3        Yes
## 4           77.8        8.45      41.6       37.6         No
## 5           93.2        7.81      34.3       31.5        Yes
## 6           78.8        8.54      40.4       37.3         No

Slovesa dplyr v R: Struฤnรฝ pล™ehled

V nรกsledujรญcรญ tabulce jsou uvedena vลกechna slovesa pouลพitรก v tomto tutoriรกlu, vฤetnฤ› syntaxe a toho, co kaลพdรฉ volรกnรญ vracรญ:

Sloveso Objektivnรญ Code Vysvฤ›tlenรญ
zรกblesk zkontrolujte strukturu df
glimpse(df)
Stejnรฝ รบฤel jako str(), snรกze ฤitelnรฝ
vybrat() Vybrat/vylouฤit promฤ›nnรฉ
select(df, A, B ,C)
Vyberte promฤ›nnรฉ A, B a C
select(df, A:C)
Vyberte vลกechny promฤ›nnรฉ od A do C
select(df, -C)
Vylouฤit C
filtr() Zachovat ล™รกdky odpovรญdajรญcรญ jednรฉ nebo vรญce podmรญnkรกm
filter(df, condition1)
Jedna podmรญnka
filter(df, condition1 & condition2)
Dvฤ› podmรญnky kombinovanรฉ s AND
uspoล™รกdat() Seล™aฤte datovou sadu podle jednรฉ nebo vรญce promฤ›nnรฝch
arrange(A)
Vzestupnรฝ druh promฤ›nnรฉ A
arrange(A, B)
Vzestupnรฝ druh promฤ›nnรฉ A a B
arrange(desc(A), B)
Sestupnรฝ druh promฤ›nnรฉ A a vzestupnรฝ druh B
%>% Mezi jednotlivรฝmi kroky vytvoล™te potrubรญ
step 1 %>% step 2 %>% step 3

Nejฤastฤ›jลกรญ dotazy

Pipe magrittr %>% je dodรกvรกn s dplyr a podporuje syntaxi zรกstupnรฝch symbolลฏ s teฤkou. Nativnรญ pipe |> se objevil v R 4.1 a nepotล™ebuje ลพรกdnรฝ balรญฤek. Oba pล™edรกvajรญ levรฝ vรฝsledek do prvnรญho argumentu vpravo.

Ne. Kaลพdรฝ pล™รญkaz dplyr vracรญ novรฝ datovรฝ rรกmec a ponechรกvรก vstup nedotฤenรฝ. Aby zmฤ›na trvala, musรญte vรฝsledek pล™iล™adit objektu nebo jej pล™edat dรกl.

Porovnรกnรญ s NA vrรกtรญ NA mรญsto TRUE a filter() uchovรกvรก pouze ล™รกdky, kterรฉ majรญ hodnotu TRUE. Pro zรกmฤ›rnรฝ vรฝbฤ›r chybฤ›jรญcรญch hodnot pouลพijte is.na() nebo drop_na() z tidyru pro jejich odstranฤ›nรญ.

Inลพenรฝrstvรญ prvkลฏ pro modely umฤ›lรฉ inteligence spoฤรญvรก pล™evรกลพnฤ› v filtrovรกnรญ ล™รกdkลฏ, vรฝbฤ›ru sloupcลฏ a ล™azenรญ. dplyr vyjadล™uje tyto kroky jako ฤitelnรฉ kanรกly, kterรฉ mohou kontroloล™i auditovat, coลพ je dลฏleลพitรฉ, kdyลพ musรญ bรฝt trรฉnovacรญ datovรก sada reprodukovatelnรก.

Ano. Asistenti umฤ›lรฉ inteligence dokรกลพรญ pล™eloลพit podmnoลพiny zรกvorek do volรกnรญ select() a filter() a vysvฤ›tlit rouru. Vลพdy spusลฅte obฤ› verze a porovnejte dimenze, protoลพe zรกkladnรญ R a dplyr zachรกzejรญ s chybฤ›jรญcรญmi hodnotami odliลกnฤ›.

Shrลˆte tento pล™รญspฤ›vek takto: