Ovaj dokument sadrži neke od primjera koje ćemo koristiti na predavanjima i vježbama, odgovarajući R kod i autput Ukoliko ovaj kod iskopirate usvoju R konzolu, dobićete isti autput i rezultate koji prezentovani u ovom dokumentu.
U većini slučajeva korisno je početi skriptu naredbom koja čisti radno okruženje. Ako koristite ista imena za određene objekte u različitim projektima (poput naziva glavnog objekta podataka „data“), tada objekti na kojima ste ranije radili mogu ometati proces rada. Naredba za uklanjanje objekta iz radnog okruženja je rm()
i ako, na primjer, želite ukloniti objekat”data" iz radnog okruženja, morali biste unijeti naredbu rm("data")
. Da biste uklonili sve objekte iz radnog okruženja, možete kombinovati naredbe za spisak svih objekata u radnom okruženju i za čišćenje radnog okruženja:
Napomena: ne preporučuje se potpuno brisanje u toku samog rada, makar ne prije prije nego ste sigurno sačuvali skriptu sa kojom radite.
rm(list = ls())
Na početku svake R sesije, u slučaju da koristite fajlove na svom računaru, potrebno je podesiti radni folder (working directory).
Ako radite s R, prije ili kasnije ćete htjeti učitati i sačuvati baze podataka sa vašeg računara. Da biste olakšali ovaj proces, trebali biste reći R-u koji je vaš radni folder (direktorij) To se može učiniti pomoću funkcije setwd()
, đe unutar zagrada definišete “put” do foldera koji želite koristiti.
Bilo bi poželjno da naziv foldera koji koristite kao radni ne sadrži specijalne karaktere (č,ć,š,ś,đ,ž,ż), kao ni razmake. Da bi zaobišli probleme tehničke prirode, preporučljivo je da naziv foldera bude nešto jednostavno i kratko, kao npr. c:/Desktop/NMPI/
ili d:/Desktop/NMPI/
(zavisno od toga na kojem hard disku se nalazi operativni sistem).
Napomena: smjer kosih crta zavisi i od operativnog sistema koji koristite. U RStudio je moguće radni folder podesiti i ručno klikom na “Session” > “Set Working Directory” > “Choose Directory”.
setwd("~/Desktop/NMPI/") # Funkcija "setwd()" je skraćenica za naredbu "set working directory".
Provjera da li smo uspješno podesili radni folder možemo sprovesti funkcijom getwd()
getwd()
[1] "/Users/NemanjaB/Desktop/NPMI"
Folder je pravilno podešen. Možemo početi sa radom…
Iako nakon instalacije R ima prilično velikim brojem funkcionalnosti, stvarna snaga R dolazi iz ogromne količine dodatnih paketa koje možete instalirati, a koji pružaju funkcije za obradu svih vrsta analiza i vizuelizacije podataka. Instaliranje paketa u R vrši se jednostavnom funkcijom install.packages()
. Imajte na umu da naziv paketa mora biti pod navodnicima.
install.packages('foreign') # Ovo instalira paket `foreign`, koji u sebi ima ugrađene funkcije za učitavanje baza podataka koje su napravljene u drugim statističkim programima, kao npr. SPSS.
Instaliranje paketa znači da su potrebni fajlovi dostupni na računaru i da se mogu koristiti ukoliko istraživač procijeni da je potrebno. Međutim, da biste koristili funkcionalnosti paketa, on mora se prvo mora učitati. To se radi s funkcijom library()
:
library('foreign')
RStudio vam daje dodatnu opciju za navigaciju i učitavanje potrebnih paketa. Ako odete na meni „Paketi“ (Packages), u donjem desnom panelu, možete viđeti ćete listu svih instaliranih i učitanih paketa.
Paketi se isporučuju u R zajedno sa dokumentacijom. Ako u meniju paketa kliknete na ime paketa, viđet ćete spisak funkcija koje ovaj paketi sadrži, kao i link do datoteke detaljnog opisa paketa na samom početku. Informacije o paketima su takođe dostupne na veb lokaciji Comprehensive R Archive Network (CRAN). Na primjer, stranica sa informacijama za paket ‘foreign’ izgleda ovako: https://cran.r-project.org/web/packages/foreign/index.html. Najvažniji dio arhive je referentni priručnik - PDF dokument koji sadrži sve informacije koje je autor paketa stavio na raspolaganje, uključujući sve funkcije koje su uključene u paket.
Napomena: da biste bolje organizovali skriptu i održavali kod urednim, korisno je sve naredbe koje se odnose na učitavanje pakete koje planirate koristiti specifikovati na samom početku skripte.
Većina onoga što se radi s R radi se kroz funkcije, koje se u R unose sa sljedećom strukturom:
Na primjer, ako želimo doviti kvadratni korijen iz broja, učinili bismo to ovako:
sqrt(100) # Skraćenica "sqrt" označava "squared root" (kvadratni korijen)
[1] 10
Kad naiđete na funkciju koju niste sigurni kako koristiti, uvijek možete zatražiti pomoć od R. To možete učiniti upisivanjem imena funkcije u konzoli kojoj prethodi upitnik ili upotrebom funkcije pomoći help()
, dodajuć ime funkcije u zagradu.
help(mean)
?mean # Traženje pomoći (detaljnog objašnjenja) za korišćenje funkcije "mean" koja daje prosječnu vrijednost za određeni niz brojeva
Svi pomoćni podaci za R pakete imaju istu strukturu:
Rekli smo da je R programski jezik orijentisan na objekte. U bukvalnom smislu to je samo po sebi razumljivo - rad s R znači rad s „objektima“. Objekti mogu sadržati podatke u različitim formatima. Možete vidjeti koji su objekti u radnom okruženju R pomoću naredbe ls()
ili u RStudio ako pogledate panel Okruženje (Environment), koji takođe prikazuje osnovne informacije o objektima u radnom prostoru.
Objekti u R-u mogu sadržavati brojeve, znakove i logičke vrijednosti koji sadrži podatke s kojima radimo. Objekat se može stvoriti imenovanjem i dodjeljivanjem vrijednosti. Napravimo objekt nazvan X
i dodijelimo mu vrijednost operacije 4 + 1
. Simbol <-
znači da stavljamo sve što se događa s desne strane strelice u ono prema čemu strelica pokazuje.
x <- 4 + 1
Ako sada unesemo ime objekta u konzolu, R će nam pokazati što je unutra.
x
[1] 5
Ovo je objekat koji sadrži jednu vrijednost, ali objekti mogu nositi nekoliko vrijednosti i mogu se međusobno kombinovati. Objektu koji smo upravo definisali možemo dodati vrijednost i možemo dodati objekte zajedno. To je učinjeno s funkcijom c()
- đe „c“ predstavlja skraćenicu za „kombinovanje“ (combine).
x1 <- c(x,2)
x1
[1] 5 2
x2 <- 6
x3 <- c(x1,x2,9,11,15,8)
x3
[1] 5 2 6 9 11 15 8
Objekti koji nose više od jedne vrijednosti nazivamo vektori, u ovom slučaju vektor brojeva. Vektor je u osnovi niz vrijednosti, na primjer, vektor se može smatrati vrijednošću varijable u različitim slučajevima koje ispitujemo.
Vrlo je lako izvršiti računske radnje na numeričkim vektorim. Vektori se mogu dijeliti, sabirati, oduzimati i množiti jednako kao da se to radi sa pojedinačnim brojevima. Ista operacija se izvodi na svakom elementu unutar vektora. Ovo je vrlo korisno u brojnim okolnostima kada želimo istu radnju sprovesti na više pojedinačnih vrijednosti.
x3/3
[1] 1.6666667 0.6666667 2.0000000 3.0000000 3.6666667 5.0000000 2.6666667
Vectors can also contain characters of sets of characters (words). Entering and combining them into vectors is the same as you would be working with numbers, the only thing you have to keep in mind is that character values have to be put into quotation marks. If you enter just data in the R console, it will be looking for the object called data in the working environment, if you want to refer to data as a character sequence, then it has to be in quotation marks.
Vektori mogu sadržati i skupove znakova (riječi). Unos i kombiniranje u vektore je ista kao što biste radili s brojevima, jedino što morate imati na umu je da vrijednosti znakova moraju biti stavljene u navodnike. Ako u R konzolu unesete riječ bez navodnika, ona će tražiti objekt pod istim imenom u radnom okruženju.
w1 <- "podatak"
w1
[1] "podatak"
w2 <- c("Ja", "imam", w1)
w2
[1] "Ja" "imam" "podatak"
Objekti takođe mogu sadržati logičke vrijednosti TRUE i FALSE, s kojima dolazimo u kontakt kada uporedimo vrijednosti objekata pomoću logičkih operacija
w1 == "podatak"
[1] TRUE
x1 == 2
[1] FALSE TRUE
x1 > 10
[1] FALSE FALSE
Lista glavnih logičkih operacija koje se mogu koristiti sa R uključuje:
<
manje od>
veće od<=
manje ili jednako>=
veće ili jednako==
jednako!=
nije jednakoAko radite samo s logičkim vrijednostima, treba imati na umu:
!x
nije x. Ovo poništava vrijednost logičkog operatora:! TRUE vraća FALSE.x | y
x ili y. Vrijednost ovog izraza je TRUE ako je jedna od vrijednosti istinita.x & y
x i y.Vrijednost ovog izraza je TRUE ako su obje vrijednosti istinite.Logičke vrijednosti u R odgovaraju brojevima - 1 je TRUE, a 0 je FALSE. To znači da određene proračune možete raditi i s logičkim vrijednostima. Na primjer, ako želite znati koliko TRUE vrijednosti postoji u vektoru, možete tražiti od R da vam kaže zbroj elemenata u tom vektoru.
l <- c(TRUE, FALSE, FALSE, TRUE, TRUE, TRUE)
sum(l) # funkcija sum() sabira sve vrijednosti u vektoru. U vektoru "l" postoje 4 istinite vrijednosti.
[1] 4
Uz to, R dozvljava i tip objekta koji se naziva factor
za predstavljanje kategoričkih podataka, poput imena ljudi ili različitih kategorija odgovora na anketu itd.
imena <- c("Jovan", "Milica", "Vuk", "Marko", "Nikola", "Sara", "Bojana")
imena
[1] "Jovan" "Milica" "Vuk" "Marko" "Nikola" "Sara" "Bojana"
imena <- as.factor(imena) # niz funkcija koje počinju sa "as." (as.factor, as.character, as. numeric) koriste se kako bi promijenili prirodu vektora.
Faktor je u osnovi objekat koji označava kategorije brojevima i povezuje ime sa svakim jedinstvenim brojem. To možemo vidjeti ako koristimo funkciju as.numeric()
za pretvaranje faktora u brojeve.
as.numeric(imena)
[1] 2 4 7 3 5 6 1
imena <- as.character(imena)
imena
[1] "Jovan" "Milica" "Vuk" "Marko" "Nikola" "Sara" "Bojana"
Ako želimo znati koliko vrijednosti sadrži vektor, možemo koristiti funkciju length()
. Prikazaće broj koji odgovaa je dužini vektora.
length(imena)
[1] 7
Ako se želite uputiti na određenu vrijednost u vektoru, morate koristiti kockaste zagrade nakon imena objekta. Zagrade sadrže redni broj vrijednosti na koju se želite pozivati. Takvo indeksiranje može se koristiti i za zamjenu vrijednosti u objektima.
x3
[1] 5 2 6 9 11 15 8
x3[2]
[1] 2
x3[2] <- 32
x3
[1] 5 32 6 9 11 15 8
Kada razmišljamo o vektorima kao nečemu što sadrži vrijednosti varijable, tada bi sljedeći logičan korak bio pitati što ako radimo s vrijednostima mnogih varijabli među pojedincima? Objekti koji sadrže više vektora iste dužine nazivaju se datotekama
(data frames) u R.
Ako imamo vektore koje želimo kombinovati u jedinstvenu datoteku, tada za to možemo koristiti funkciju data.frame()
.
data <- data.frame(imena, x3) # ovom naredbom će se u jedinstvenu datoteku sačuvati informacije iz vektora sa imenima osoba ("imena") i brojevima ("x3)
data
imena x3
1 Jovan 5
2 Milica 32
3 Vuk 6
4 Marko 9
5 Nikola 11
6 Sara 15
7 Bojana 8
Ukoliko želimo vizuelno pegledati datoteku koju smo kreirali, to možemo uraditi koristeći funkciju View()
. RStudio takođe omogućava isto uradite klikom na datoteku u meniju Okruženje. Baza podataka će se otvoriti u zasebnom meniju odmah pored skripte sa kodom.
View(data)
Ukoliko želimo ispitati datoteku kako bi viđeli je li sve u redu, prvi korak bi bila provjera veličine same datoteke. Funkcija dim()
omogućava da saznamo dimenzije baze podata, odnosno koliko redova i koliko kolona sadrži.
dim(data)
Datoteka “data” ima 6 redova i 2 kolone.
S obzirom da prilikom rada sa velikim bazama podataka može biti kompjuterski zahtjevno pregledati cijelu bazi koristeći funkciju View()
, moguće je u konzoli prikazati samo dio baze, koristeći funkcije head()
i tail()
.
head(data) # funkcijom head() možemo prikazati prvih 6 obzervacija u datoteci
imena x3
1 Jovan 5
2 Milica 32
3 Vuk 6
4 Marko 9
5 Nikola 11
6 Sara 15
tail(data) # funkcijom head() možemo prikazati posljednjih 6 obzervacija u datoteci
imena x3
2 Milica 32
3 Vuk 6
4 Marko 9
5 Nikola 11
6 Sara 15
7 Bojana 8
Imena redova, u ovom slučaju brojeva, možemo smatrati odgovaraju brojevima slučajeva, a nazive kolona nazivima varijabli. Vidimo da je R imenovao kolonu prema imenima vektora koje smo kombinirali.
Imena redova i kolona možemo vidjeti i promijeniti u okviru podataka s funkcijom rownames()
(za redove) i colnames()
(za kolone).
rownames(data)
[1] "1" "2" "3" "4" "5" "6" "7"
colnames(data)
[1] "imena" "x3"
rownames(data) <- c("Ime1", "Ime2","Ime3","Ime4", "Ime5","Ime6","Ime7")
rownames(data)
[1] "Ime1" "Ime2" "Ime3" "Ime4" "Ime5" "Ime6" "Ime7"
colnames(data) <- c("Ime", "Broj")
colnames(data)
[1] "Ime" "Broj"
data
Ime Broj
Ime1 Jovan 5
Ime2 Milica 32
Ime3 Vuk 6
Ime4 Marko 9
Ime5 Nikola 11
Ime6 Sara 15
Ime7 Bojana 8
Napomena: Korisno je da nazivi varijabli (i vektori s kojima radite ) budu kratki i informativni. Gore navedena imena korisniku podataka odmah govore sa čime imaju posla. Da su nazvani x1
i var1
, korisnik bi morao početi tražiti ili pamtiti što tačno te oznake znače, što je nepotreban utrošak vremena i pažnje.
Na vrijednosti u okviru datoteke možemo se pozvati na isti način kao u vektoru, ali u ovom slučaju moramo imati na umu da umjesto jednodimenzionalnog objekta imamo posla s dvodimenzionalnim objektom - imamo i redove i kolone. Stoga nam umjesto jednog broja u kackastim zagradama trebaju biti dva broja odvojena zarezom. Prvi označava red, a drugi kolonu. Ako je jedno od mjesta ostalo prazno, to konzoli daje naredbu da se korisnik poziva na sve vrijednosti u tom redu ili koloni koje smo definisali u zagradama.
data[2,1] # ova naredba će nam prikazati vrijednost sačuvanu u drugom redu prve kolone.
[1] Milica
Levels: Bojana Jovan Marko Milica Nikola Sara Vuk
data[5,2] # ova naredba će nam prikazati vrijednost sačuvanu u petom redu druge kolone.
[1] 11
data[,2] # ova naredba će nam prikazati sve vrijednosti za drugu kolonu (varijablu).
[1] 5 32 6 9 11 15 8
data[1:4,2]
[1] 5 32 6 9
data[c(1:2,4:5),2]
[1] 5 32 9 11
Na varijable (kolone) u okviru baze podataka najčešće se poziva po imenima. Ovo vraća vektor koji odgovara toj koloni.
Da bi referisali na varijablu u datoteci koristeći ime, potrebno je između naziva datoteke i varijable staviti znak $
:
data$Broj
[1] 5 32 6 9 11 15 8
data$Ime
[1] Jovan Milica Vuk Marko Nikola Sara Bojana
Levels: Bojana Jovan Marko Milica Nikola Sara Vuk
Lista je mnogo fleksibilnija struktura podataka od datoteka, jer može sadržavati vektore i različitog tipa i različite dužine. Sve što smo u toku vježbe kreirali možemo staviti u jednu listu.
zemlja <- "Italija"
l1 <- list(zemlja, imena, x3)
l1
[[1]]
[1] "Italija"
[[2]]
[1] "Jovan" "Milica" "Vuk" "Marko" "Nikola" "Sara" "Bojana"
[[3]]
[1] 5 32 6 9 11 15 8
Sada prvi element na listi sadrži vektor znakova dužine 1 s vrijednošću „Italija“. Drugi element sadrži vektor imena koji smo stvorili prije, treći element numerički vektor.
Pozivanje na elemente na listi slično je pozivanju na elemente u vektoru, ali umjesto jednostrukih kockastih zagrada morate koristiti dvostruke.
l1[[1]]
[1] "Italija"
Na isti način kao i sa vektorima, u liste možemo dodavati nove podatke. Broj unutar duple kockaste zagrade označava redosljed vektora u listi, onda dodavanjem kockaste zagrade nakon toga možemo označiti vrijednost unutar konkretnog vektroa.
l1[[1]][2] <- "Crna Gora" # naredba će na drugu poziciju u prvom vektoru i liste "l1" dodati vrijednost "Crna Gora"
l1
[[1]]
[1] "Italija" "Crna Gora"
[[2]]
[1] "Jovan" "Milica" "Vuk" "Marko" "Nikola" "Sara" "Bojana"
[[3]]
[1] 5 32 6 9 11 15 8