# Načtení balíčku tidyverse ----------------------------------------------- library(tidyverse) # Rozcvička --------------------------------------------------------------- # Vytvořte vektor s čísly 1 až 5, tak aby to byl vektor typu # integer # double # character # Integer my_integer <- 1:5 typeof(my_integer) my_integer <- c(1L, 2L, 3L, 4L, 5L) typeof(my_integer) is.integer(my_integer) # Double my_double <- my_integer %>% as.double() typeof(my_double) my_double <- c(1, 2, 3, 4, 5) typeof(my_double) # Character my_character <- my_integer %>% as.character() typeof(my_character) my_character <- c("1", "2", "3", "4", "5") typeof(my_character) # Pojmenujte prvky americkými číslovkami "one", "two", "three" atd. names(my_integer) <- c("one","two","three","four","five") my_integer my_double <- my_double %>% set_names(nm = c("one","two","three","four","five")) my_double my_character <- c(one = "1", two = "2", three = "3", four = "4", five = "5") my_character # Jakými možnými způsoby můžeme vybrat třetí prvkek vektoru my_double my_double[3] my_double[[3]] my_double["three"] my_double[c(FALSE, FALSE, TRUE, FALSE, FALSE)] # Práce s listy (lists) --------------------------------------------------- # Vytvořte pojmenovaný list z těcho vektorů # Character variable for movie name mov <- "The Shining" # Vector for the names of the movie actors act <- c("Jack Nicholson", "Shelley Duvall", "Danny Lloyd", "Scatman Crothers", "Barry Nelson") # Data frame of the movie reviews rev <- data.frame( scores = c(4.5, 4.0, 5.0), sources = c("IMDb1", "IMDb2", "IMDb3"), comments = c("Best Horror Film I have Ever Seen", "A truly brilliant and scary film from Stanley Kubrick", "A masterpiece of psychological horror") ) # Vytvoření listu shining <- list( title = mov, actors = act, reviews = rev ) shining # Vyberte vektor s názvem filmu # Tak, ať je outputem stále list obsahující 1 prvek shining[1] shining["title"] shining[c(TRUE, FALSE, FALSE)] str(shining["title"]) typeof(shining["title"]) # Vyříznutí prvku a odsranění jedné úrovně hierarchie # Outputem bude v tomto případě již atomický vektor typy character shining[[1]] shining[["title"]] shining$title str(shining[["title"]]) typeof(shining[["title"]]) # Vyberte vektor s herci shining[2] shining["actors"] shining[c(FALSE, TRUE, FALSE)] shining[[2]] shining[["actors"]] shining$actors # Vyberte vektory s názvem filmu a herci shining[c(1, 2)] shining[1:2] shining[c("title", "actors")] shining[c(TRUE, TRUE, FALSE)] # Vyberte vektor s herci a z nich prvního herce shining[["actors"]][1] shining[["actors"]][[1]] shining$actors[[1]] shining$actors[1] # Vyberte vektor s herci a z nich něj pak první a třetí prvek (herce) shining[["actors"]][c(1,3)] shining$actors[c(1, 3)] # Vyberte vektor s recenzemi shining[3] shining["reviews"] shining[[3]] shining[["reviews"]] shining$reviews # Z recenzí vyberte sloupec s komentáři # Output je data.frame shining[[3]][3] shining[["reviews"]]["comments"] shining$reviews["comments"] # Output je atomický vektor typu character shining[[3]][[3]] shining[["reviews"]][["comments"]] shining$reviews$comments # Vyberte první komentář shining[[3]][[3]][1] shining$reviews$comments[1] # Výběr prvků atomického vektoru ------------------------------------------ # Vytvoříme si tento numerický vektor set.seed(2) x <- sample(c(1:10, NA), size = 100, replace = TRUE) x # Vyberte prvky menší nebo rovno než 5 x <= 5 y <- x <= 5 x[x <= 5] x[y] # Vyberte prvky větší než 6 x[x > 6] # Vyberte prvky větší než 3, ale zároveň menší než 7 x[3 < x & x <7] # Vyberte prvky menší nebo rovno 3 anebo větší nebo rovno 8 x[x <=3 | x>= 8] # Vyberte všechny sudé hodnoty x[x %% 2 == 0] # Vyberte každý třetí prvek x[c(FALSE, FALSE, TRUE)] # Jaký je počet chybějících hodnot? sum(is.na(x)) x %>% is.na() %>% sum() # Jaký je podíl chybějících hodnot? mean(is.na(x)) x %>% is.na() %>% mean() # Jak vybereme všechny prvky, které nejsou missing value? x[!is.na(x)] # Vyberte prvky menší nebo rovno než 5, která zároveň nejsou missing. x[x <= 5 & !is.na(x)] x[which(x <= 5)] # Vyberte prvky větší než 6, která zároveň nejsou missing. x[which(x > 6)] # Vyberte prvky větší než 3, ale menší než 7, která zároveň nejsou missing. x[which(x > 3 & x < 7)] # Vyberte prvky menší nebo rovno 3 anebo větší nebo rovno 8, # která zároveň nejsou missing. x[which(x <= 3 | x >= 8)] # Jaká je průměrná hodnota vektoru x? mean(x) mean(x[!is.na(x)]) mean(x, na.rm = TRUE) # Jaký je medián? median(x, na.rm = TRUE) # Jaká je směrodatná odchylka? sd(x, na.rm = TRUE) # Jaká je minimální a maximální hodnota? min(x, na.rm = TRUE) max(x, na.rm = TRUE) range(x, na.rm = TRUE) # Faktor ----------------------------------------------------------------- set.seed(3) f <- sample(c(1:3, 99), size = 50, replace = TRUE) f # Konvertuje tento vektor na faktor # Dejme tomu, že jeho hodnoty reprezentují úroveň vzdělání # 1 = ZŠ # 2 = SŠ # 3 = VŠ # 99 = missing value my_fct <- factor(f, levels = 1:3, labels = c("ZŠ", "SŠ", "VŠ")) my_fct levels(my_fct) # Co kdybychom chtěli, ať je první úrovní VŠ, pak SŠ, nakonec ZŠ? my_fct <- factor(f, levels = 3:1, labels = c("VŠ", "SŠ", "ZŠ")) my_fct levels(my_fct) # Co kdybychom chtěli, ať je první úrovní SŠ, pak VŠ, nakonec ZŠ? my_fct <- factor(f, levels = c(2, 3, 1), labels = c("SŠ", "VŠ", "ZŠ")) my_fct summary(my_fct) # Jak jinak lze zacházet s hodnotou 99? my_fct <- factor(f, levels = c(1:3, 99), labels = c("ZŠ", "SŠ", "VŠ", "Neuvedeno")) my_fct # Dataframe --------------------------------------------------------------- df <- tibble( name = c("Mercury", "Venus", "Earth", "Mars", "Jupiter", "Saturn", "Uranus", "Neptune"), type = c("Terrestrial", "Terrestrial", "Terrestrial","Terrestrial", "Gas giant", "Gas giant", "Gas giant", "Gas giant"), diameter = c(0.382, 0.949, 1, 0.532, 11.209, 9.449, 4.007, 3.883), rotation = c(58.64, -243.02, 1, 1.03, 0.41, 0.43, -0.72, 0.67), rings = c(FALSE, FALSE, FALSE, FALSE, TRUE, TRUE, TRUE, TRUE) ) df # Vyberte všechny informace o Marsu df[4, ] df[df$name == "Mars", ] subset(df, name == "Mars") # Vyberte sloupec diameter df[, 3] df[3] df["diameter"] # output je stále dataframe df[[3]] # output je atomický vektor df[["diameter"]] # Vyberte planety, které mají prstence df[df$rings == TRUE, ] subset(df, rings == TRUE) # Vyberte sloupec typu planety, ale jen planety s prstenci df[df$rings == TRUE, "type"] df[df$rings == TRUE, 2] subset(df, rings == TRUE)[["type"]] subset(df, rings == TRUE)$type df %>% subset(rings == TRUE) %>% .$type # Jaká je průměrná rotace planet, jejichž průměr (diameter) je mezi # 0.5 až 10 násobkem rotace Země? mean(subset(df, diameter > 0.5 & diameter < 10)$rotation) df %>% subset(diameter > 0.5 & diameter < 10) %>% .$diameter %>% mean() # Konvertujte sloupec type na factor tak, aby první úroveň byla # "Terrestial" summary(df$type) df$type <- factor(df$type, levels = c("Terrestrial", "Gas giant")) summary(df$type) # Seřaďte planety podle velikosti (diameter) df[order(df$diameter), ] # Seřaďte planety podle toho, jestli mají prstence, a až poté podle velikosti df[order(df$type, df$diameter), ] # Která planeta se otáčí opačně než země a zároveň nemá prstence? df[df$rotation < 0 & df$rings == FALSE, ] subset(df, rotation < 0 & rings == FALSE) # Kolik je plynných obrů? df[df$type == "Gas giant", ] nrow(df[df$type == "Gas giant", ]) df %>% subset(type == "Gas giant") %>% nrow() # Kolik je planet, které se otáčejí opačně než Země? df %>% subset(rotation < 0) %>% nrow() # Vyberte nejmenší planetu df[df$diameter == min(df$diameter), ] subset(df, diameter == min(diameter)) df[order(df$diameter) == 1, ] # Vyberte planetu s nejrychlejší rotací (bez ohledu na směr rotace) subset(df, abs(rotation) == max(abs(rotation))) df[order(abs(df$rotation), decreasing = TRUE) == 1, ] # Vyberte 2 planety s nejrychlejší kladnou/zápornou rotací subset(df, rotation == max(rotation) | rotation == min(rotation)) y <- order(df$rotation) y df[y[c(1, 8)], ]