# # PRVI CAS , 13.10.2017. # --- UVOD U R --- # R je programski jezik koji je pogodan za statisticku obradu podataka i njihovo graficko prikazivanje # Razvojno okruzenje za R koje cemo koristiti na ovom kursu je RStudio # Linkovi za instalaciju: # https://www.r-project.org/ # https://www.rstudio.com/products/rstudio/download/ # Za one koji hoce da da znaju vise: # https://www.rstudio.com/products/shiny/ # https://www.rstudio.com/products/shiny-2/ ### HELP(), ?word, ??word ### ### Deklaracija promjenjljive ### # Operator dodjele u R-u je "<-" (ali moze da se koristi i "=") x<-9 #za pokretanje u konzoli: Ctrl+Enter x #ispisivanje rezultata # Postoji i operator "->" za dodjelu sa druge strane 9->x x # Elementarne funkcije: exp(), cos(), sin(), log(), .. # Aritmeticki operatori: +,-,*,/ # Logicki operatori: <=, >=, ==, !=, <, >, & (AND), | (OR), ! (NOT) ### VEKTORI ### # U R-u postoji mnostvo funkcija za rad sa vektorima tako da je pozeljno podaci # cuvaju vidu vektora (ili matrica ) # Neki od nacina zadavanje vektora: numeric.vec <- c(1, 10, 49) character.vec <- c("a", "b", "c") boolean.vec <-c(TRUE, FALSE) vec<-rep(0,10) vec<-rep(c(1,2,3),3) vec<-seq(1,5) vec<-seq(0,1,0.1) vec<-seq(9,1,-1) vec<-seq(1, 5, length.out=4) vec<-1:9 # U R-u bi trebalo izbjegavati for petlju, medjutim bice nam korisna u nekim zadacima za lakse # razumijevanje koda # inicijalizujemo vektor vec<-c() for( i in 1:10){ vec[i]<-i^2 } sum(vec) #Operacije sa vektorima a<-1:5 b<-c(3,4,5,6,7) #aritmeticke operacije 5*a a+b a-b a*b a/b #logicke operacije a==b # clan po clan #ako hocemo da poredimo cijela dva vektora all(a==b) all(a==a) a>b a<=5 # Ako dva vektora nisu iste duzine, vrijednosti kraceg vektora se ponavljaju ciklicno tako dok se ne # pogode iste dimenzije sa duzim vektorom u<-c(10, 20, 30) v<-c(1, 2, 3, 4, 5, 6, 7, 8, 9) u + v cos(a) log(a) # Pristupanje vektoru # Indeksiranje vektora pocinje od jedinice! # Vektoru pristupamo tako sto unutar uglastih zagrada upisemo poziciju trazene vrijednosti v[3] # mozemo da izdvojimo i neke cijele vektore v[c(1,2)] v[c(3,4,5)] v[2:4] v[c(2,1,3)] v[v<5] v[v!=8] # Ako stavimo negativan predznak indeksu rezultat je originalni vektor umanjen za clan na poziciji # koja odgovara apsolutnoj vrijednosti broja u zagradi v[-4] v[-c(5,7)] v[-(1:3)] # Napomena: ":" ima manji prioritet od aritmetickih operacija # Ako pozovemo indeks van velicine vektora vraca se NA v[10] # Novi vektor moze se izdvojiti iz datog vektora uz pomoc vektora sa logickim vrijednostima koji je # iste duzine kao originalni. Njegovi clanovi su TRUE (ili T) ako odgovarajuci clan u orignalnom # vektoru treba da bude izdvojen, odnosno FALSE (ili F) u suprotnom s<-c("a","b","c","d") l<-c(T,F,T,F) s[l] # Mozemo da dodamo imena clanovima vektora v<-c("Ivo", "Andric") names(v)<-c("Ime","Prezime") v # Zatim mozemo da izdvajamo clanove po imenu v["Ime"] # Neke funkcije nad vektorima vec<-rev(vec) # obrce redosled clanova vektora length(vec) # Vazne statistike sum(vec) # zbir svih clanova min(vec) # minimum max(vec) # maksimum range(vec) # raspon mean(vec) # srednja vrijednost var(vec) # disperzija sd(vec) # standardno odstupanje # sortiranje sort(vec) sort(vec, decreasing = TRUE) # Vektor mozemo i da mijenjamo: vec[2] <- 0 vec vec[vec<5]<-1 vec vec<-vec[1:4] vec # Brisanje vektora vec<-NULL ### MATRICE ### M <- matrix( c(2, 4, 3, 1, 5, 7), # podaci nrow=2, # broj redova ncol=3, # broj kolona byrow = TRUE) # popunjavamo matrice po redovime (po default-u je po kolonama) M M[2,3] # element matrice u 2. redu i 3. koloni M[2,] # drugi red M[,3] # druga kolona M[, c(1,2)] # izdvajanje prve i druge kolone ### FUNKCIJE ### # Sintaksa za pisanje funkcija # func.name<- function (argument) { # statement # } # "function" je rezervisana rijec za deklaraciju funkcije # izrazi u okviru viticastih zagrada cine tijelo funkcije (zagrade su opcione ako tijelo sadrzi) # samo jedan izraz # Konacno, funkcija se poziva sa func.name(arg) # Primjeri pow <- function(x, y) { result <- x^y print(paste(x,"na stepen", y, "je", result)) } # ako zelimo da funkcija vrati rezultat pow2 <- function(x, y) { result <- x^y return(result) } # Pozivanje funkcije pow(2,3) pow2(2,3) # ili.. pow(x=2, y=3) pow(y=3, x=2) #nije bitan redosled argumenata u ovom slucaju # if/else x<-5 if(x%%2==0) {print("x je paran") } else print("x je neparan") # moze i u jednom redu ifelse(x%%2==0, print("x je paran"), print("x je neparan")) ### LISTE ### #Lista je genericki vektor koji sadrzi druge objekte. n<-c(2, 3, 5) s<-c("aa", "bb", "cc", "dd", "ee") b<-c(TRUE, FALSE, TRUE, FALSE, FALSE) lst<-list(n, s, b) # lst sadrzi kopije od n, s, b lst[1] #niz n lst[2] #niz s # Na ovaj nacin dobijamo kopije prvog, odnosno drugog clana liste # Medjutim ako hocemo da direktno pristupimo clanu liste koristimo "[[.]]" lst[[1]] # Vazno! #Tada mozemo da mijenjamo sadrzaj liste lst[[2]]<-c("a","b") lst lst[[2]][1]<-"c" lst ### Graficko prikazivanje podataka # plot # paketi: ggplot2, plotly ... cars <- c(1, 3, 6, 4, 9) trucks <- c(2, 5, 4, 5, 12) plot(cars, type="o", col="blue", ylim=c(0,12)) lines(trucks, type="o", pch=22, lty=2, col="red") title(main="Autos", col.main="red", font.main=4) x<-sin(1:10) y<-log(1:10) plot(x,y) ### Zadaci 1 i 2 ### SLUCAJNOST U R-u ### # Kako je kompjuter deterministicka masina, pojam "slucajnosti" ne mozemo da vezujemo za njega. # Medjutim postoje razliciti nacini da se simuliraju nizovi slucajnih brojeva tako sto im se zada # mali broj pocetnih argumenata. Posle odredjenog broja simulacija taj niz se ponavlja. Tako dobijene # brojeve nazivamo pseudo-slucajnim. U zadacima kada se zada slucajnost podrazumijevacemo pseudo-slu- # cajnost # Funckcija sample() # U svom najjednostavnijem obliku, funkcija sample permutuje zadati niz na slucajan nacin x<-1:10 sample(x) sample(10) # je poziv ekvivalentan prethodnom # Ova funkcija ima argument replace cija je vrijednost po defaultu FALSE, sto znaci da se simulira # slucajno biranje brojeva bez ponavljanja # Ako proslijedimo vrijednost TRUE fja vraca slucajan uzorak bez ponavljanja # Jos jedan argument je prob (odnosno probability) i on je po defaultu NULL, a mozemo da zadamo # neke tezine elementima skupa # Napomena: # Zbog gore pomenuta dva nacina zadavanja moze da dodje do zabune prilikom sledecih izraza sample(x[x > 8]) #izlaz: vektor duzine 2 sample(x[x > 9]) #izlaz: vektor duzine 10 # argument size sample(x, size=2) # Klasicna definicija vjerovatnoce? # Hocemo da simuliramo bacanje novcica coin <- c("Heads", "Tails") sample(coin, size = 1) # Sada zelimo 100 simulacija ovog slucajnog eksperimenta sample(coin, size = 100) # Prijavice gresku jer se po defaultu bira uzorak bez ponavljanja sample(coin, size = 1000, replace = TRUE) # Prikaz rezultata eksperimenta table(sample(coin, size = 1000, replace = TRUE)) # Simulirajmo bacanje falicnog novcica sample(coin, size = 100, replace = TRUE, prob = c(1/3,2/3)) table(sample(coin, size = 100, replace = TRUE, prob = c(1/3,2/3))) # Vec na sto simulacija mozemo da vidimo razliku u frekvencijama # Jos jedna funkcija za generisanje slucajnosti je runif # Njeni glavni argumenti runif(size, min = a, max = b) # Ona vraca slucajne brojeve iz intervala [a,b] (vjerovatnoca svakog podintervala zavisi samo od # njegove duzine) r<-runif(100, 0,1) length(r[r < 0.5]) length(r[r > 2/3])