https://d396qusza40orc.cloudfront.net/rprog%2Fdata%2Fspecdata.zip 1) if (chemie <= 4) { # podmínka print("jupííí, nepropadáš")} 2) fyzika <- 1 chemie <- 2 if (chemie == 1 & fyzika == 1) { print("neuvěřitelné") } else if (chemie <= 2 & fyzika <= 2) { print("skvělé") } else { print("moc ti to teda nejde") } 3) Vaším úkolem bude vytvořit funkci s názvem getdata, jenž nám po zadání čísla (respektive názvu) souboru spustí příkaz summarize() dané datové tabulky csv. Uveďme si konkrétní příklad. Pokud do konzole zapíšeme příkaz getdata(1), chtěli bychom získat následující výstup. getdata(100) 4) Nastavení adresáře v R pomocí příkazu. 5) Zjistěte, jaký příkaz potřebujeme, abychom do konzole vypsali cestu do adresáře. 6) Znáte příkaz paste() a pamatujete si na nchar()? jméno <- paste("Jakub","Solnička", sep = " ") 7) Vytvořte funkci, která zobrazí cestu k souboru dle vašeho adresáře po zadání názvu souboru. Soubor má koncovku csv. Př. getFileName("nazev_souboru") "C:/Users/jsoln/OneDrive/Desktop/Documents/R_vyuka/specdata/nazev_souboru.csv" getFileName <-function(id) { cesta <- paste(getwd(), "/", id, ".csv", sep = "") cesta } 8) Kdy použiju podmínku v if v našem příkladě? #setwd("C:/Users/jsoln/OneDrive/Desktop/Documents/R_vyuka/specdata") #cesta <- paste(getwd(), "/", "00", paste(1, ".csv", sep = ""), sep = "") #cesta #data <- read.csv(cesta) #print(summary(data)) #cesta getdata <- function(id, summarize = TRUE) { pocet <- nchar(id) if(pocet == 1) { cesta <- paste(getwd(), "/", "00", paste(id, ".csv", sep = ""), sep = "") data <- read.csv(cesta) #Katan <- read_excel("Data/Katan.xlsx") if(summarize == TRUE) { print(summary(data)) } else return(data) } if (pocet == 2) { cesta <- paste(getwd(), "/", "0", paste(id, ".csv", sep = ""), sep = "") data <- read.csv(cesta) if(summarize == TRUE) { print(summary(data)) } else return(data) } if(pocet == 3) { cesta <- paste(getwd(), "/", id, ".csv", sep = "") data <- read.csv(cesta) if(summarize == TRUE) { print(summary(data)) } else return(data) } } getdata(1) 9) Cyklus for Představte si, že se sejde v jedné z čadských kaváren v Ndžameně matematik, statistik a ekonom, kteří kromě jedné hrací kostky mají též hlavu plnou následující sázky. Podstatou sázky je naházet v průměru co největší číslo. Pokud tak například házíte desetkrát, sečtete výsledky hodů a vydělíte je jejich počtem, nic složitého. Aby to ale nebylo zas tak jednoduché (jedná se přeci jenom o vysokoškoláky), každý hráč bude házet v jiném počtu. Ekonom, jelikož šetří čas, si hodí pouze 3krát. Statistik chce házet 9krát a matematik, jelikož je kostka jeho, si chce hodit dokonce 27krát. Kdo dopadne v této sázce nejlépe? # skript pro ekonoma N <- 4 kostka <- numeric(N) kostka[1] <- 0 for (t in 2:N) { kostka[t] <- kostka[t-1] + sample(6, size = 1) } vysledek_ekonom <- kostka[N]/(N-1) # skript pro statistika N <- 10 kostka <- numeric(N) kostka[1] <- 0 for (t in 2:N) { kostka[t] <- kostka[t-1] + sample(6, size = 1) # lze i zkráceně sample(6, 1) } vysledek_statistik <- kostka[N]/(N-1) N<- 28 kostka <- numeric(N) kostka[1] <- 0 for (t in 2:N) { kostka[t] <- kostka[t-1] + sample(6,size = 1) } vysledek_matematik <- kostka[N]/(N-1) ------------------------------------------------ N <- 1000 # cyklus pro ekonoma vysledek_ekonom <- numeric(N) for (x in 1:N) { N2 <- 4 kostka <- numeric(N) kostka[1] <- 0 for (t in 2:N2) { kostka[t] <- kostka[t-1] + sample(6,1) } vysledek_ekonom[x] <- kostka[N2]/(N2-1) } N <- 1000 # obdobně proběhne cyklus pro statistika vysledek_statistik <- numeric(N) for (x in 1:N) { N2 <- 10 # zde budeme házet 9 krát kostka <- numeric(N) kostka[1] <- 0 for (t in 2:N2) { kostka[t] <- kostka[t-1] + sample(6,1) } vysledek_statistik[x] <- kostka[N2]/(N2-1) } N <- 1000 # a ještě cyklus pro matematika vysledek_matematik <- numeric(N) for (x in 1:N) { N2 <- 28 # zde budeme házet 27 krát kostka <- numeric(N) kostka[1] <- 0 for (t in 2:N2) { kostka[t] <- kostka[t-1] + sample(6,1) } vysledek_matematik[x] <- kostka[N2]/(N2-1) } Soutez <- cbind(vysledek_ekonom, vysledek_matematik, vysledek_statistik) Soutez <- as.data.frame(Soutez) Vitez <- ifelse( Soutez$vysledek_ekonom <= Soutez$vysledek_statistik & Soutez$vysledek_ekonom <= Soutez$vysledek_matematik, "ekonom", ifelse( Soutez$vysledek_statistik <= Soutez$vysledek_ekonom & Soutez$vysledek_statistik <= Soutez$vysledek_matematik, "statistik", ifelse( Soutez$vysledek_matematik <= Soutez$vysledek_ekonom & Soutez$vysledek_matematik <= Soutez$vysledek_statistik, "matematik", "NA"))) Soutez <- cbind(Soutez, Vitez) Soutez$vysledek_ekonom <- round(Soutez$vysledek_ekonom, 2) Soutez$vysledek_matematik <- round(Soutez$vysledek_matematik, 2) Soutez$vysledek_statistik <- round(Soutez$vysledek_statistik, 2) table(Vitez) # konečný výsledek ------------------------------------------------------------------- 10) Ve třetím příkladu této lekce se vrátíme zpět k databázi specdata. Vaším úkolem bude vytvořit funkci s názvem korelace, která zjistí korelaci mezi proměnnými sulfate a nitrate po zadání čísla daného souboru csv. Napíšeme-li například příkaz korelace(1), měli bychom získat výsledek -0.2225526. cor( data$sulfate, data$nitrate, use = "complete.obs") korelace <- function(id) { pocet <- nchar(id) if(pocet == 1) { cesta <- paste(getwd(), "/", "00", paste(id, ".csv", sep = ""), sep = "") data <- read.csv(cesta) print(cor( data$sulfate, data$nitrate, use = "complete.obs")) } if (pocet == 2) { cesta <- paste(getwd(), "/", "0", paste(id, ".csv", sep = ""), sep = "") data <- read.csv(cesta) print(cor( data$sulfate, data$nitrate, use = "complete.obs")) } if(pocet == 3) { cesta <- paste(getwd(), "/", id, ".csv", sep = "") data <- read.csv(cesta) print(cor( data$sulfate, data$nitrate, use = "complete.obs")) } } korelace(1) 11) Vaším dalším navazujícím úkolem bude vytvořit data frame, který bude obsahovat dva sloupce. V prvním z nich bude uvedeno číslo (název) csv souboru a ve druhém bude vypočítána hodnota korelace mezi proměnnými sulfate a nitrate. Výpočty proveďte pouze pro prvních 50 csv souborů. formatC(1, width = 3, flag = "0") # Na úvod začneme cyklem FOR. N <- 50 Korelace <- numeric(N) Korelace[1] <- 1 for (t in 1:N) { # Pamatujete si na první příklad, ve kterém jsme řešili problém # nul u subourů s jednocifernými a dvojcifernými názvy? Naše řešení # spočívalo ve využití podmínky IF a příkazu nchar(). Zde ale vidíte, # že se řešení může vejít i na jeden krátký řádek. Následující příkaz # navíc data rovnou i načte. cesta <- read.csv( paste(getwd(), "/", formatC(t, width = 3, flag = "0"), ".csv", sep = "")) Korelace[t] <- cor( cesta$sulfate, cesta$nitrate, use = "complete.obs") } # Na závěr vytvoříme samotný data frame. ID <- 1:50 Data_korelace <- data.frame(ID, Korelace) Data_korelace ------------------ Napište program, který vypočítá prvních 10 čísel Fibonacciho posloupnosti. 0 1 1 2 3 5 8 13 21 34 # Inicializace Fibonacciho posloupnosti fib <- numeric(10) fib[1] <- 0 fib[2] <- 1 # Výpočet dalších čísel for (i in 3:10) { fib[i] <- fib[i-1] + fib[i-2] } # Výpis výsledků cat("Prvních 10 čísel Fibonacciho posloupnosti je:", fib, "\n") 11) cyklus while. pocet_hodu <- 0 kostka <- 0 while (kostka != 6) { pocet_hodu <- pocet_hodu + 1 kostka <- sample(1:6, size = 1)} print(pocet_hodu) 12) Franta a Lojza se rádi sází při hře v kostky. V každém kole každý z hráčů hází dvěma kostkami tak dlouho, dokud mu nepadne jeho oblíbené číslo. V případě Franty se jedná o osmičku a v případě Lojzy o dvanáctku. Kolo vyhraje ten, komu jeho oblíbené číslo padne za nejméně hodů (je to hra pro doopravdy dlouhé zimní večery). V případě shody vyhrává Lojza, který si tak myslí, jak na Frantu nevyzrál. Simulujte 50 kol této hry a určete v kolika procentech kol vyhraje Lojza? N <- 50 Franta <- numeric(N) Franta[1] <- 1 for (t in 1:N) { pocet_hodu <- 0 kostka <- 0 while (kostka != 8) { pocet_hodu <- pocet_hodu + 1 kostka <- sample(6, size = 1) + sample(6, size = 1)} Franta[t] <- pocet_hodu } N <- 50 Lojza <- numeric(N) Lojza[1] <- 1 for (t in 1:N) { pocet_hodu <- 0 kostka <- 0 while (kostka != 12) { pocet_hodu <- pocet_hodu + 1 kostka <- sample(6, size = 1) + sample(6, size = 1)} Lojza[t] <- pocet_hodu } Rozdíl <- Lojza - Franta Výsledek <- sum(Rozdíl <= 0)/50*100 # Příkaz cat() není příliš známý, ale pomůže nám tehdy, chceme-li # vytisknout větu, která by měla obsahovat hodnotu z proměnné. cat("Lojza vyhraje v", Výsledek, "% kol.") --- # Funkce pro hod dvěma kostkami hod_kostkami <- function() { return(sample(1:6, 1) + sample(1:6, 1)) } # Funkce pro simulaci jednoho kola simulace_kola <- function() { franta_hody <- 0 lojza_hody <- 0 # Franta hazi dokud mu nepadne 8 while (TRUE) { franta_hody <- franta_hody + 1 if (hod_kostkami() == 8) { break } } # Lojza hazi dokud mu nepadne 12 while (TRUE) { lojza_hody <- lojza_hody + 1 if (hod_kostkami() == 12) { break } } # Vrátíme počet hodů pro Frantu a Lojzu return(c(franta_hody, lojza_hody)) } # Simulace 50 kol kola <- 50 lojza_vyhry <- 0 for (i in 1:kola) { vysledek <- simulace_kola() franta_hody <- vysledek[1] lojza_hody <- vysledek[2] if (lojza_hody <= franta_hody) { lojza_vyhry <- lojza_vyhry + 1 } } # Výpočet procenta kol, ve kterých vyhrál Lojza lojza_procento_vyher <- (lojza_vyhry / kola) * 100 lojza_procento_vyher Napište program v jazyce R, který najde první Fibonacciho číslo větší než zadaná hodnota. Fibonacciho posloupnost je řada čísel, kde každé číslo je součtem dvou předchozích čísel. První dvě čísla Fibonacciho posloupnosti jsou 0 a 1. # Zadejte kladné číslo cislo <- as.numeric(readline(prompt = "Zadejte kladné číslo: ")) # Inicializace prvních dvou Fibonacciho čísel a <- 0 b <- 1 # Cyklus while pro nalezení prvního Fibonacciho čísla většího než zadané číslo while (b <= cislo) { temp <- b b <- a + b a <- temp } # Výpis výsledku cat("První Fibonacciho číslo větší než", cislo, "je", b, "\n") ----------- # Funkce pro házení dvěma kostkami hod_kostkami <- function() { return(sample(1:6, 1) + sample(1:6, 1)) } # Funkce pro simulaci jednoho kola simulace_kola <- function() { franta_hody <- 0 lojza_hody <- 0 # Franta hází, dokud nepadne 8 repeat { franta_hody <- franta_hody + 1 if (hod_kostkami() == 8) { break } } # Lojza hází, dokud nepadne 12 repeat { lojza_hody <- lojza_hody + 1 if (hod_kostkami() == 12) { break } } # Výsledek kola if (franta_hody < lojza_hody) { return("Franta") } else { return("Lojza") } } # Simulace 50 kol set.seed(123) # pro reprodukovatelnost výsledků vysledky <- replicate(50, simulace_kola()) # Počet výher Lojzy lojza_vyhry <- sum(vysledky == "Lojza") # Procento výher Lojzy procento_vyher_lojzy <- (lojza_vyhry / 50) * 100 # Výsledky lojza_vyhry procento_vyher_lojzy