################################################################################################### # 1. Pripojte sa k databaze `Poliklinika` pomocou ODBC. if (!require(tidyverse, quietly = TRUE)) install.packages("tidyverse"); if (!require(gridExtra, quietly = TRUE)) install.packages("gridExtra"); library(tidyverse) library(gridExtra) # Sposob 1: # Treba nainstalovat ODBC mysql driver z # https://dev.mysql.com/downloads/connector/odbc/ # Ja som nainstaloval "Windows (x64, 64-bit), MSI Installer" # Poznamka: Instalacia ODBC konekotra vyzaduje admin prava. Ak nemame, treba prejst na sposob 2. # Potom spustit program "ODBC Data Sources 64 bit" zo start menu. # Kliknut na Add # Zvolit MySQL ODBC 8.0 Unicode Driver # Vyplnit Data Source Name: mysql-poliklinika # TCP/IP Server: localhost Port: 3306 # User: root # Password: mysql (resp. to co ste zvolili pri instalacii) # Database: poliklinika # Pozn. V realnom zivote nikdy nevytvarat ODBC data source pouzitim root uzivatela MySQL. # Vzdycky vytvorit v MySQL noveho pouzivatela s primerane obmedzenymi pravami. if (!require(RODBC, quietly = TRUE)) install.packages("RODBC") library(RODBC) conn <- odbcConnect('mysql-poliklinika') # Sposob 2: Nevyzaduje ODBC ani admin prava ani netreba nic instalovat. if (!require(RMySQL, quietly = TRUE)) install.packages('RMySQL') library(RMySQL) conn <- dbConnect( MySQL(), user = 'root', password = 'TU VLOZIT HESLO K MYSQL', dbname = 'poliklinika', host = '127.0.0.1', port = 3306 ) # Ak prikaz vyssie vyhodi chybu: # Error in .local(drv, ...) : # Failed to connect to database: Error: Plugin caching_sha2_password could not be loaded: The specified module could not be found. # # Dovod tej chyby je novy sposob autentifikacie v MySQL 8. # Ten nie je kompatibilny s kniznicou v R. # Vo Workbenchi otvorte novy subor a vykonajte prikaz nizsie, ktory nastavi stary sposob autentifikacie. # ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'TU VLOZIT HESLO K MYSQL'; ################################################################################################### # 2. Vytvorte dve tabulky `Lek` a `Nav` exportovanim zodpovedajucich tabuliek z MySQL qL = "select idL, krstne, spec from lekari" qN = "select idL, poplatok pop, month(den) mes from navstevy" # Sposob 1: Ak ste sa pripojili pomocou odbcConnect(...) Lek <- sqlQuery(conn, qL); Lek Nav <- sqlQuery(conn, qN); Nav close(conn) # Sposob 2: Ak ste sa pripojili pomocou dbConnect(...) Lek <- fetch(dbSendQuery(conn, qL), n = -1); Lek Nav <- fetch(dbSendQuery(conn, qN), n = -1); Nav on.exit(dbDisconnect(conn)) ################################################################################################### # 3. Spojte `Lek` a `Nav` do jednej tabulky `LN` a presvedcte sa, ze operacie inner_join a # left_join v danom pripade vratia rovnake vysledky. LN = Lek %>% inner_join(Nav); LN LN2 = Lek %>% left_join(Nav); difLN = setdiff(LN, LN2); difLN dim(difLN) ################################################################################################### # 4. Z `LN` odfiltrujte riadky s `null` poplatkami. filter(LN, !is.na(pop)) # Pozn.: Skuste za x,y dosadit nejake konkretne indexy a pozrite co to vypise # filter(LN, ! is.na(pop))[x,y] ################################################################################################### # 5. Vytvorte tabulku `LN_id`, ktora bude obsahovay vsetky udaje z `LN`, no bez stlpca `idL`. LN_id = select(LN, -idL) LN_id ################################################################################################### # 6. Vytvorte tabulku `LNk`, ktora bude obsahovay vsetky udaje z `LN`, no stlpec `krstne` bude # pomenovany `krst`. LNk = select(LN_id, krst = krstne, everything()) LNk # <=> LNk = rename(LN, krst = krstne) LNk ################################################################################################### # 7. Vyfiltrujme z `LN` riadky s poplatkami 200, 500 a 800. LNf = filter(LNk, pop == 200 | pop == 500 | pop == 800) LNf ################################################################################################### # 8. Pripojte sa k databaze NASA a nakreslite bodovy graf pre dvojicu stlpcov radi, temp farebne v # zavislosti od siestich hodnot A,B,F,G,K,M stlpca type. # Pripojime sa k databaze `nasa`, ktoru si stiahneme zo stranky predmetu. Nezabudnut vytvorit novy # ODBC Data Source pre databazu `nasa`, vid. zaciatok suboru. conn <- odbcConnect('mysql-nasa') qq = "select * from Exoplanets;" df2_ <- sqlQuery(conn, qq) close(conn) head(df2_,10) # Vypis prvych 10 riadkov names(df2_) # Vypis nazvy stlpcov df2 = transmute(df2_, dist = st_distance, mass = st_mass, type = st_spectral_type, temp = st_effective_temp, radi = st_solar_radii, disc = pl_discovery_method ); names(df2) # Uvod do vykreslovania z prednasky: ## Vykreslime vztah vzdialenosti a hmotnosti hviezdy plot(df2$dist,df2$mass) ## To iste, ale pouzijeme kniznicu ggplot2 (asi najmocnejsia kniznica na vykreslovanie aka existuje) ## Farby zavisia od sposobu objavenia planet, ktore danu hviezdu obiehaju. library(ggplot2) ggplot(df2, aes(x=df2$dist, y=df2$mass, color=df2$disc)) + geom_point(size=3) # Riesenie: # Nebude fungovat, lebo type obsahuje prilis vela roznych spektralnych tried hviezd. # ggplot(df2, aes(x=df2$radi, y=df2$temp, color=df2$type)) + geom_point(size=3) # Spravime GROUP BY podla spektralneho typu hviezd gg <- group_by(df2, type) # Vypiseme len spektralny typy hviezd s3 = summarise( gg ); s3 # Vypiseme spektralne typy hviezd a pocet vyskytov. Pozn: !is.na(...) filtruje non-null hodnoty s3p = summarise(gg, pct = sum(!is.na(type))) # Vypis prvych 15 head(s3p, 15) # <=> s3p[1:15,] # Chcene spektralne typy hviezd typ6 = c("A", "B", "F", "G", "K", "M"); # Chceme len tie planety, kde spektralny typ ich materskej hviezdy zacina na nejake pismeno z pola typ6. df2F = filter(df2, substring(type, 1, 1) %in% typ6) # Nahradime vsetky spektralne typy za ich prve pismeno (G2 V --> G, F7 -> F, F6 -> F, ...) df2FT = mutate(df2F, type = replace(type, 1==1, substring(type, 1, 1))); df2FT # Spravime GROUP BY podla spektralneho typu hviezd, kde prve pismeno spek. typu sa nachadza v poli typ6. ggFT <- group_by(df2FT, type) # Vypiseme pocty vyskytov zakladnych spektralnych typov typ6 s3pFT= summarise(ggFT, pct = sum(!is.na(type) )); s3pFT # Konecne riesenie ggplot(df2FT, aes(x=df2FT$dist, y=df2FT$mass, color=df2FT$type)) + geom_point(size=3) ################################################################################################### ################################################################################################### # BONUS: vykreslovanie (velmi silna vlastnost R) ################################################################################################### # B1: Vykreslite histogram pocetnosti navstev za jednotlive mesiace # Stlpec `mes` z tabulky `Nav` prevedieme na pole cisel s nazvom `Mes` Mes = as.numeric(as.character(Nav$mes)); Mes # Vykreslime histogram # Zakladny histogram ggplot(Nav, aes(x=mes)) + geom_histogram( binwidth=1, color="black", fill="darkmagenta" ) ################################################################################################### # B2: Vykreslite kolko ktory lekar vyzbieral na poplatkoch ggplot(Nav, aes(x=idL,y=pop)) + stat_summary( fun.y=sum, geom="bar", color="black", fill="darkmagenta" )