# Packages ---------------------------------------------------------------- library(tidyverse) # For loop --------------------------------------------------------------- # Zkuste napsat for loop, který vypočte průměr každého sloupce z datasetu mtcars. # Základ pro kód máte níže. Ať se nám ve výstupu lépe orientuje, je vhodné si # jeho prvky pojmenovat, např. pomocí set_names a to podle názvů sloupců # z datasetu mtcars. out <- double(length = length(mtcars)) %>% set_names(nm = names(mtcars)) for (i in seq_along(mtcars)) { out[[i]] <- mean(mtcars[[i]]) } out out <- double(length = length(mtcars)) # Názvy prvků outputu jde stanovit i v rámci for loop for (i in seq_along(mtcars)) { out[[i]] <- mean(mtcars[[i]]) names(out[[i]]) <- names(mtcars[i]) } out # Zkuste napsat for loop, který určtí typ, typeof(), každého sloupce z # datasetu starwars. Základ pro kód máte níže. out <- character(length = length(starwars)) %>% set_names(nm = names(starwars)) for (i in seq_along(starwars)) { out[[i]] <- typeof(starwars[[i]]) } out # Zkuste dokončit for loop, který vypočte počet jedinečných hodnot z # každé sloupce datasetu iris out <- out <- integer(length = length(iris)) %>% set_names(nm = names(iris)) for (i in seq_along(iris) ) { out[[i]] <- n_distinct(iris[[i]]) } out # Dokončete for loop, který generuje 10 náhodných čísel z normální distribuce # s různými průměry: -10, 0, 10, 100 mu <- c(-10, 0, 10, 100) out <- vector("list", length = length(mu)) for (i in seq_along(mu)) { out[[i]] <- rnorm(n = 10, mean = mu[[i]]) } out out %>% set_names(c("mu_min10", "mu_0", "mu_10", "mu_100")) %>% as.data.frame() # Zkuste místo hodů mincí simulovat hody šestistěnnou kostkou a pomocí # while loop zjistit, jak dlouho potrvá (kolik hodů bude potřeba), # dokud dvakrát za sebou nepadne šestka. dice <- function() { sample(1:6, size = 1) } dice() # funkce náhodně vylosuje číslo od 1 do 6 throws <- 0 sixes <- 0 while (sixes < 2) { if (dice() == 6) { # když padne šestka sixes <- sixes + 1 # připočti 1 k objektu heads } else { sixes <- 0 # jinak sixes "vynuluj" } throws <- throws + 1 # počítej poček pokusů (hodů mincí celkem) } throws # Funkce využívající předchozí kód a simulující celý pokus, dokud # šestka nepadne in_a_row*krát za sebou count_throws <- function(in_a_row = 2){ throws <- 0 sixes <- 0 while (sixes < in_a_row) { if (dice() == 6) { # když padne šestka sixes <- sixes + 1 # připočti 1 k objektu heads } else { sixes <- 0 # jinak sixes "vynuluj" } throws <- throws + 1 # počítej poček pokusů (hodů mincí celkem) } return(throws) # } # Funkce počítá, kolik hodů bylo zapotřebí count_throws() # Kdybychom chtěli funkci spoustit např. 30, replicate(30, expr = count_throws()) # Výsledný vektor obsahuje počet pokusů, kterých bylo v každé simulaci # zapotřebí, aby dvakrát za sebou padla šestka # Hromadný import ------------------------------------------------------------- # Zkuste hromadně importovat soubory z jiného formátu, např. .csv. Klidně k # tomu využijte předchozí kód, pouze ho vhodně pozměňte. # Cesty k souborům files <- dir("data/", pattern = "\\.csv$", full.names = TRUE) files # Jména pro importovan datasety nms <- files %>% str_remove_all(pattern = "(data/)|(.csv)") %>% str_replace_all(pattern = " ", replacement = "_") nms # Příprava výstupního vektoru data_list <- vector("list", length = length(files)) %>% set_names(nms) data_list for (i in seq_along(data_list)) { data_list[[i]] <- read_csv(files[[i]]) } data_list # Import se úplně nepovedl, protože někde nebyla oddělovačem čárka, ale středník # A funkce read_csv() předpokládá čárku for (i in seq_along(data_list)) { if (ncol(read_csv(files[[i]])) == 1) { # pokud read_csv() vede k datasetu jen s jedním sloupcem data_list[[i]] <- read_csv2(files[[i]]) # Použij místo toho read_csv2() } else { data_list[[i]] <- read_csv(files[[i]]) # Jinak by mělo být ok použít read_csv() } } data_list # Zkopíruj prvky listu (importované datasety) jako objekty do # globálního prostředí list2env(data_list, envir = .GlobalEnv) # Funkce map -------------------------------------------------------------- # Vygenerujte různý počet hodnoty z normálního rozdělení podle tabulky: # n M SD # 30 2.5 0.50 # 60 3.0 0.75 # 90 5.0 1.00 params <- list( n = c(30, 60, 90), mean = c(2.5, 3.0, 5.0), sd = c(0.50, 0.75, 1.0) ) params %>% pmap(rnorm) # Balíček ggplot2 obsahuje také dataset msleep s informace i spánku různých # savců. Zkuste pomocí nejprve pomocí funkce map() hromadně vytvořit boxploty # všech kvantitativních proměnných (sleep_total až bodywt) v závislosti na druhu # potravy (proměnná vore, na osu X) a pak se všechny grafy pokuste uložit pomocí # funkce pwalk() nebo walk2(). msleep %>% glimpse() ggplot(msleep, aes_string(x = "vore", y = "sleep_total")) + geom_boxplot() # Numerické proměné variables <- msleep %>% keep(is.numeric) %>% colnames() variables # List s grafy plot_list <- variables %>% map(~ggplot(msleep, aes_string(x = "vore", y = .x)) + geom_boxplot() ) plot_list # Jména pro soubory, do kterých budeme grafy ukládat plot_names <- str_c(variables, ".png") plot_names # Uložení více grafů pomocí pwalk() a ggsave() list( filename = plot_names, # ggsave má tyto dva hlavní argumenty: filename a plot plot = plot_list ) %>% pwalk(ggsave, path = "plots") # Predikativní funkce -------------------------------------------- # Zkuste ověřit, zda v datasetu starwars: # je nějaký sloupec typu list; some(starwars, is.list) # je nějaký sloupec typu factor; some(starwars, is.factor) # jsou všechny sloupce atomické vektory. every(starwars, is.atomic) # Vyberte z datasetu starwars: # pouze sloupce typu character; keep(starwars, is.character) # pouze sloupce typu double; keep(starwars, is.double) # pouze sloupce typu integer; keep(starwars, is.integer) # pouze sloupce typu list; keep(starwars, is.list) # pouze sloupce, které jsou atomickými vektory. keep(starwars, is.atomic) # Vyřaďte z datasetu starwars: # všechny sloupce typu character; discard(starwars, is.character) # všechny sloupce typu double; discard(starwars, is.double) # všechny sloupce typu integer; discard(starwars, is.integer) # všechny sloupce typu list. discard(starwars, is.list)