# Packages ---------------------------------------------------------------- library(nycflights13) library(tidyverse) # Data k procvičování set.seed(123) flights <- slice_sample(flights, n = 1e4) ?flights summary(flights) glimpse(flights) # Související datasety, kdybyste měli zájem prozkoumat weather airports planes airlines # Výběr řádků pomocí filter() ------------------------------------ # Pokuste se pomocí funkce filter() vybrat lety, které: # měly zpoždění na odletu více než hodninu filter(flights, dep_delay > 60) # měly zpoždění na příletu více než hodninu filter(flights, arr_delay > 60) flights %>% filter(arr_delay > 60) # měly zpoždění na odletu a zároveň na příletu více než půl hodiny filter(flights, dep_delay >30 & arr_delay > 30) filter(flights, dep_delay >30, arr_delay > 30) # měly zpoždění na odletu anebo na příletu více než hodinu. filter(flights, dep_delay > 60 | arr_delay > 60) # měly zpoždění na odletu více než půl hodiny, ale žádné na příletu. filter(flights, dep_delay > 30, arr_delay == 0) filter(flights, dep_delay > 30, arr_delay <= 0) # neměly zpoždění na odletu, ale na příletu alespoň půlhodinové. filter(flights, dep_delay <= 0, arr_delay >= 30) filter(flights, dep_delay <= 0 & arr_delay >= 30) # měly alespoň půlhodinové zpoždění buď jen na odletu, nebo jen na příletu. filter(flights, xor(dep_delay >= 30, arr_delay >= 30)) filter(flights, (dep_delay >= 30 | arr_delay >= 30) & !(dep_delay >= 30 & arr_delay >= 30)) # byly vypraveny v posledních třech mesících v roce. filter(flights, month >= 10) filter(flights, between(month, 10, 12)) # byly vypraveny v druhé polovině roku. filter(flights, month %in% c(7, 8, 9, 10, 11, 12)) filter(flights, month %in% 7:12) filter(flights, month >= 7) # Pro poslední dvě úlohy zkuste uplatnit také funkce between() a %in%. # Seřazení řádků pomocí arrange() ---------------------------------------- # Zkuste přijít na to, jak seřadi chybějící hodnoty na začátek. arrange(flights, !is.na(dep_delay), desc(dep_delay)) arrange(flights, desc(is.na(dep_delay)), desc(dep_delay)) # Seřaďte řádky tak, ať jsou první lety s největším zpožděním při příletu flights %>% arrange(desc(arr_delay)) flights %>% arrange(-arr_delay) # Najděte lety, které odletěly nejdříve z hlediska denního času arrange(flights, dep_time) # Najděte lety, které letěly nejrychleji. arrange(flights, desc(distance / air_time)) # Najděte lety, které uletěly nejdelší vzdálenost. arrange(flights, desc(distance)) # Najděte lety, které uletěly nejkratší vzdálenost. arrange(flights, distance) # Výběr sloupců pomocí select() ---------------------------------------- # Base R subset(flights, select = c(dep_time, dep_delay, arr_time, arr_delay)) # Zkuste vyřešit následující úlohy: # Vymyslete co nejvíce možných způsobů, jak z datasetu flights vybrat sloupce # dep_time, dep_delay, arr_time a arr_delay select(flights, dep_time, dep_delay, arr_time, arr_delay) select(flights, 4, 6, 7, 9) select(flights, starts_with("dep"), starts_with("arr")) nms <- c("dep_time", "dep_delay", "arr_time", "arr_delay", "nonexistent") select(flights, all_of(nms)) select(flights, one_of(nms)) # Co se stane, když ve funkci select() uvedeme název téhož sloupce vícekrát? select(flights, dep_delay, dep_delay) # K čemu slouží funkce all_of() a any_of()? Zkuste spustit tento kód a pak místo # funkce all_of() použít funkci any_of(). x <- c("year", "month", "day", "dep_delay", "arr_delay", "nonexistent") select(flights, all_of(x)) select(flights, one_of(x)) # Rozlišují defaultně funkce starts_with(), ends_with() a contains() # malá a velká písmena? Vyzkoušejte to na kódu níže a pak zkuste # změnit toto defaultní chování: select(flights, contains("TIME")) select(flights, contains("TIME", ignore.case = FALSE)) # Tvorba nových proměnných (sloupců) pomocí mutate() --------------------- # Časy v dep_time jsou srozumitelné, např. číslo 933 znamená 9 hodin a 33 minut, # ale nemůžeme s nimi v současné podobě pracovat jako se spojitou proměnnou. # Zkuste proto na základě dep_time vytvořit dvě nové proměnné dep_time_hour a # dep_time_minute čili “extrahovat” z dep_time hodinu a minutu tak, # ať jsou v samostatných sloupcích. Nápověda: bude se vám hodit celočíselné dělení # (operátor %/%) a zbytek po celočíselném dělení (%%). # Kdybyste chtěli úplně korektní řešení, zkuste si poradit i s tím, # že 2400 0000 znamená začátek daného dne, nikoli konec. # Využijeme toho, že hodiny jsou na pozici stovek a minuty na pozici jednotek # Devět hodin a 30 minut je zapsáno takto: 960 930 %/% 100 # Celočíselné dělení stem xtrahuje hodiny 930 %% 100 # Zbytek po dělení stem extrahuje minuty # Plus můžeme využít toho, že 2400 %% 2400 # je nula a takto tranformovat čas zapsaný 2400 na 0000 mutate(flights, dep_time_hour = (dep_time %% 2400) %/% 100, dep_time_minute = (dep_time %% 2400) %% 100, arr_time_hour = (arr_time %% 2400) %/% 100, dep_time_minute = (arr_time %% 2400) %/% 100, ) %>% select(starts_with("dep_"), starts_with("arr_")) # Vytvořte pomocí mutate() novou proměnnou air_delay udávající nárůst (resp. pokles) # zpoždění během letu čili rozdíl mezi arr_delay a dep_delay. # Pak vytvořte proměnnou air_delay_per_hour udávající nárůst zpoždění během letu # za každou hodinu letu. flights <- mutate(flights, air_delay = arr_delay - dep_delay, air_delay_per_hour = air_delay / (air_time / 60)) # Nakonec vytvořte pomocí funkce min_rank() proměnné air_delay_per_hour_asc a # air_delay_per_hour_desc, udávající pořadí letů podle air_delay_per_hour vzestupně # a sestupně, a vyberte 10 letů, u kterých za každou hodinut letu narostlo # zpoždění během letu nejvíce, a 10 letů, u kterých zpoždění naopak pokleslo nejvíce # (resp. získali největší časový náskok) za každou hodinu letu. slice_min(flights, order_by = min_rank(air_delay_per_hour), n = 10) %>% select(air_delay_per_hour, everything()) slice_max(flights, order_by = min_rank(air_delay_per_hour), n = 10) %>% select(air_delay_per_hour, everything()) # min_rank(air_delay_per_hour) <= 10 vybere 10 letů s nejnižším pořadím v proměnné air_delay_per_hour # min_rank(-air_delay_per_hour) <= 10 vybere 10 letů s nejvyšším pořadím v proměnné air_delay_per_hour flights %>% filter(min_rank(air_delay_per_hour) <= 10 | min_rank(-air_delay_per_hour) <= 10) %>% select(air_delay_per_hour, everything()) %>% arrange(air_delay_per_hour) %>% print(n = Inf) # Souhrnné statistiky pomocí summarise() ------------------------------------ # Rozšiřte předchozí kód tak, abyste vypočetli i relativní četnosti letů různých # dopravců pro obě destinace zvlášť destinaci. # Budeme k tomu potřebovat použít group_by() a mutate(). flights %>% count(dest, carrier) # Četnosti pro jednotlivé kombinace destinace/přepravce flights %>% count(carrier, dest) %>% group_by(carrier) %>% # Podíl destinací v rámci dopravce mutate(p_dest_within_carrier = n/sum(n)) flights %>% count(dest, carrier) %>% group_by(dest) %>% # Podíl dopravců v rámci destinace mutate(p_carrier_within_carrier = n/sum(n))