R je projekat zapocet 1992 godine na Universitetu Auckladn, Novi Zeland. Osnivaci su Ross Ihaka i Robert Gentleman stoga i ime R (prvo slovo njihovih imena). To je programski jezik, open-source koji prvenstveno sluzi za staticke analize, analize podataka i vizualizaciju, ali koristi se i za maschine learning, naucno istrazivačke radove. Posebna mu je prednost kod naučno istraživačkih radova jer omogucava ponovno reprodukovanje istog naučnog rada. Također, R se stalno uapređuje, broj korisnika i paketa iz dana u dan se povecava. Na globalnom tržištu rada traži se sve više, a odavno ga koriste i vodeci svjetski fakulteti. R je i jedan od programskih jezika kojeg koriste Data Scientists, nova profesija za koju se također predviđa deficit. Negativne strane R-a su rijetkost. Korisnici se zale da ga je lako naučiti ali tesko savladati, a pojedini se zale da se veoma velikim bazama podataka, usporava rad u R-u. Moje iskustvo je da je R izazovan za učenje upravo iz razloga sto uvijek ima više da se nauči, tako da je zabavan, interesantna, i pocesto se iznenadite sa novim njegovim karakteristikama, sto vas tjera da ga jos vise istrazujete. U pogledu velikih baza, najvecu bazu koju sam importovala imala je oko 4miliona redova. Usporilo jeste rad u R-u ali primjetila sam samo kod grafova. Kad bazu podijelila na dva dijela nisam imala vise usporavanja.
Inace kod importovanja velikih baza mozemo korisiti colClasses () funkciju i uz pomoc nje brze cemo importovat podatke i brzi ce nam biti R.
Lista korisnih web stranica:
. http://r-project.org
. http://rstudio.com
. http://r-bloggers.com
. http://kaggle.com
. http://quick-r.com
. http://datacamp.com
. http://rpubs.com
. http://stackoverflow.com
Lista korisnih knjiga:
R literatura:
help.start ()
help.search("random variable")
#Pretrazuje fajlove neke frazeswirl ()
# paket koji sluzi kao online kurs direktno preko R ucite Rhelp (plot)
ili ?plot
#na ovaj nacin pretrazujete o funkciji plot()
help (package = "dplyr")
#pomoc u vezi odredjenog paketa, u ovom slucaju dplyr paketa.Kurs je namjenjen svima koji su pocetnici u R-u. Nije vezan ni za jednu specificnu oblast: statistika, ekonometrija, maschine learning…nego iskljucivo za R i njegove osnovne mogucnosti. Ko uspjesno zavrsi kurs bice u mogucnosti da importuje bazu, manipulise sa podacima i uradi osnovnu kratku analizu u RMarkdown, te da je publikuje na RPubs.
☺ Instalacija R-a i R studija
☺ Znacenje razlicitih znakova u R-u
☺ Matematicke operacije ☺ Vektori, matrice i baze podataka
☺ Vrste varijabli: poseban akcenat na factor
varijable
☺ Importovanje baza u R
☺ Clean&tidy data.frame: ciscenje baze, formatiranje (datumi, vrsta varijabli..), nedostajuci podaci, prilagoditi bazu za analizu.
☺ Manipulacija bazama
☺ Filtriranje i selektovanje varijabli
☺ Merganje dvije baze
☺ Sortiranje po velicini i reorder
☺ Intervali starosnih godina (cut())
☺ Formatiranje datuma
☺ Nedostajuci podaci
☺ Osnovni grafovi iz basic paketa
☺ Osnovne tabele
☺ Sumarni pregledi varijabli
☺ looping: *apply
☺ osn.funkcije sami kreiramo
☺ ggplot2: vizualiziranje podataka
☺ bar grafovi, linijski, scatterplot, mape, bag of words..
☺ Instalacija Rmarkdown-a
☺ Naslovi i podnaslovi
☺ bulletin
☺ page brake
☺ import grafa i slike
☺ formati fontova
☺ chunks
☺ Publish
Sada kad ste instalirali R, vrijme je da instalirate RStudije.
Open an internet browser and go to www.r-project.org. Click the “download R” link in the middle of the page under “Getting Started.” Select a CRAN location (a mirror site) and click the corresponding link. Click on the “Download R for (Mac) OS X” link at the top of the page. Click on the file containing the latest version of R under “Files.” Save the .pkg file, double-click it to open, and follow the installation instructions. Now that R is installed, you need to download and install RStudio. To Install RStudio
Go to www.rstudio.com and click on the “Download RStudio” button. Click on “Download RStudio Desktop.” Click on the version recommended for your system, or the latest Mac version, save the .dmg file on your computer, double-click it to open, and then drag and drop it to your applications folder.
//pitati almu
Otvaramo ikonu R studio.
U gornjem lijevom uglu nalazi se file, idemo na new pa biramo da li cemo script ili rmarkdown. Postoji još opcija ali na kursu cemo se susretati sa ova dva file-a.
U donjem lijevom uglu nalazi se console u kojem kucamo kodove. kada završimo sa kodom ukucamo enter da dobijemo rezultat. Rezultat se prikazuje u consoli. kodove mozemo da kucamo i u Rscript a da bi rezultat koda bio prikazan u consoli onda pritisnemo ctrl+enter na tastaturi.
Savjet: u R scripti stavljajte samo one kodove koji su vam finalni i scriptu sacuvajte, tj. svaki put je spasavajte kako biste znali dokle ste dosli sa analizom. mozete da idete i na History (u desnom gornjem dijelu ekrana) ili da ukucate u console history ()
. Ipak na taj nacin ne mozete dobiti nesto sto ste davno kucali a prikazuje i kodove koje ste zadavali ali su bili pogresni. Cuvanje kodova u skrpti omogucava da spasite samo bitne i ispravne kodove.
U gornjem desnom uglu nalazi se i Environment, u njemu imate nekoliko dijelova: data, values, functions… u zavisnosti koja vam je vrsta objekta kreirana. U donjem lijevom uglu imate dio files, plots, packages, help i viewer.
Files sluzi za otvaranje podataka: kao i na kompjuteru, i tu su očitani svi folderi i file-ovi ne samo oni vezani za R.
Plots: u tom dijelu se pojavi graf koji zadate da se uradi Packages: prikazuje sve pakete koje imate instalirane
Help: u R Documentations imate da trazite sve sto vas interesuje sto se tiče paketa, funkcija,…
viewer: Viewer cemo koristiti tek na kraju, za sada samo da znate da kad se kuca u Rmarkdown i kad kliknete na KnitHTML u Viewru vam izadje to sto ste otkucali.
<-
Ovo je tzv. asign znak i pripisuje vrijednosti nekoj varijabli$
Dolar se cesto upotrebljava, kada npr zelimo iz baze da izvucemo varijable. Lijevo od dolara je naziv dataframa a desno od $
je ime varijable[]
srednja zagrada znaci indeksiranje. npr. ako zelimo da indeksiramo bazu podataka imamo dvije dimenzije: red i kolonu. prvo navedemo red pa zarez pa kolonu()
male zagrade oznacavju funkciju. Dakle ono sto je u zagradi je odredjena funkcija. najcesce se korisit c()
ali imamo beskonacno mnogo funkcija==, <=, >=, !=
ovi znakovi su svima poznati iz matematike i logike. zadnji se odnosi na nije jednako,
zarez cesto koristimo kada odvajamo npr. red i kolonu kod indeksiranja. On je vrlo bitan cesto se zna izostaviti u pisanju funkcije pa dobijemo error.#
, hashtag nam omogucava da stavljamo tekst u kodu. R ga prepoznaje kao tekst te nam ne isporucuje Error.
2+3
## [1] 5
sin (5)
## [1] -0.9589243
pi #r prepoznaje pi
## [1] 3.141593
8/2
## [1] 4
sqrt(4)
## [1] 2
4^4
## [1] 256
log(x)
exp(x)
round (x,n)
#zaokruzuje decimalna mjesta za n
decimalacor(x, y)
#korelacija izmedju x i ysum(x)
mean (x)
median (x)
quantile (x)
# procentni kvintilivar (x)
# varijansasd(x)
#standardna devijacijaPrimjer:
numericki <- c (1:20*3)
log(numericki)
## [1] 1.098612 1.791759 2.197225 2.484907 2.708050 2.890372 3.044522
## [8] 3.178054 3.295837 3.401197 3.496508 3.583519 3.663562 3.737670
## [15] 3.806662 3.871201 3.931826 3.988984 4.043051 4.094345
round (numericki/18,4) #dijeli vektor sa 3 a zaokruzuje na 4 decimale
## [1] 0.1667 0.3333 0.5000 0.6667 0.8333 1.0000 1.1667 1.3333 1.5000 1.6667
## [11] 1.8333 2.0000 2.1667 2.3333 2.5000 2.6667 2.8333 3.0000 3.1667 3.3333
z <- seq (1, 10.5, by = 0.5)
cor(numericki, z) #oba vektora moraju imati istu duzinu
## [1] 1
length(numericki)
## [1] 20
mean (numericki)
## [1] 31.5
quantile (numericki)
## 0% 25% 50% 75% 100%
## 3.00 17.25 31.50 45.75 60.00
Vektori su jedan od osnovnih objekata u Ru i data structure. Oni mogu biti kategorički, numerički i logički (TRUE ili FALSE) i text/string/karakter.
Na ovaj nacin nismo kreirali objekat. Da bismo kreirali objekat, vektorima moramo dati ime. Kad vektoru damo ime mozemo sa njima rukovati kad zelimo.
numericki<-c(1:10)
logicki <- c(TRUE, FALSE)
factor <- c("b", "B")
karakter <- c("Dobro, dosli", "na kurs") #radi zareza
upitnik1 <- c("B", 0, FALSE)
upitnik2 <- c(5, FALSE, TRUE)
Kad nismo sigurni koji nam je vektor provjeravamo ga sa funkcijom class()
. Tako npr. kategoricki i upitnik vektor provjerimo:
class (karakter)
## [1] "character"
class(upitnik1)
## [1] "character"
class (upitnik2)
## [1] "numeric"
str (upitnik2)
## num [1:3] 5 0 1
Na ovaj nacin sa class()
provjeravamo upitnik1 i upitnik2.Prvi upitnik je karakter, a drugi broj. Da bismo vidjeli koji je to broj FALSE i TRUE koristili smo komandu str()
. Rezultat je pokazao da R prepoznaje FALSE kao 0, a TRUE kao 1.
Matrice imaju redove i kolone. Elementi u matrici moraju da imaju istu klasu (broj, karakter) i jednaku duzinu.
Npr. ako zelimo da generisemo matricu 5x4 to cemo u raditi na slijedeci nacin.
y<-matrix(1:20, nrow=5,ncol=4)
dimnames(y) <- list (c("prviR", "drugiR", "treciR", "cetvrtiR", "petiR"), c("prvaK", "drugaK", "trecaK", "cetvK")) #imena u matrici se formiraju sa `dimnames()`, pa `list ()`. U prvi `c()` upisuju se imena redova, a u drugi `c()` upisuju se imena kolona.
Baza podataka je generalnija od matrica. Baze podatka se sastoji od vise varijabli a svaka varijabla moze da ima razlicitu klasu. Na ovom kursu najcesce cemo raditi sa bazom podataka.
Formirajmo data.frame.
Duzina oba vektora mora biti jednaka. Ovo je kod za data.frame najjednostaviniji
prva_baza <- data.frame(c(1,5,6,8,9), c("a", "b","d", "c","x")) #imam 5 obzervacija i dvije varijable.
print(prva_baza)
## c.1..5..6..8..9. c..a....b....d....c....x..
## 1 1 a
## 2 5 b
## 3 6 d
## 4 8 c
## 5 9 x
Vidimo da su nam nazivi malo cudni. tj R je pokupio sve sto smo naveli da su elementi u varijabli kao naziv varijable. Izmedju je stavljao i tacke jer izmedju R ne prepoznaje nazive varijabli ili data.frame-a sa razmakom, te automatski stavlja tacku.
Kako izmjeniti nazive varijabli u data framu opisano je u sekciji Clean and Tidy, pa Clean data, pa Naziv varijable pod naslovom ****Izmjena naziva varijable u data.frame****.
Varijable mogu biti kvantitativne i kvalitativne.
Kvantitativne varijable su numericke i mogu biti discrete ili continuous. Discrete varijable su one koje mogu imati samo cijeli broj, ono sto nema frakcija, npr. broj ucenika u razredu, broj stanovnika u nekoj drzavi, broj stanova u zgradi. R ove varijable prepoznaje kao integer.
Continuous su numericke koje mogu uzeti bilo koji broj izmedju dva cijela broja. Npr. tezina, duzina, temperatura,..itd. R ove varijable prepoznaje kao numeric. Kvalitativne varijeble su kategoricke. Uzmimo npr. primjer varijable zanimanje. Kakvo zanimanje mozemo imati? Zanimanje moze biti: doktor, ucitelj, bankar, statisticar, sestra, cuvar itd. Ove varijable su kvalitativne jer ih ne mozemo posloziti po nivoima odnosno rangirati. Kvalitativne varijabe u R prepoznaje kao factor i kao karakter.
O faktor varijabli cemo posvetiti posebno poglavlje. Karakter varijabla je tekstualna, u njoj mozemo imati zareze, recenice, ili kada je jedna obzervacije broj, druga slovo ili rijec R tu varijablu prepoznaje kao karakter. Vec smo se susretali u dijelu vektora sa takvom situacijom.
U analizama podatka bitno je znati jedinicu mjere tj. skale mjerenja. Ako razmisljamo o kvalitativnim varijablama i npr. zanimanje, jedinica mjere ove varijable je nominalna skala. Mozemo imati intervale npr. intervali godina, ili % ako posmatramo relativni udio necega u nesto. Buduci da u R-u nema % onda se sluzimo proporcijama.
Kada imamo faktore u R u bazi podataka moramo biti veoma pazljivi. Faktori su kategoricke varijable koji mogu takodjer biti i zamjenjeni brojem npr. 1 za muskarce i 2 za zene. Ipak kada zamjenimo moramo da damo do znanja R u da je 1 faktor a ne broj. Npr
x<- c(1,2,1,1,2)
sum (x)
## [1] 7
f<- c("male", "female", "male", "male", "female")
table (f)
## f
## female male
## 2 3
Ove dvije varijable se razlikuju to je zato sto je x numericka varijabla kojoj mozemo izracunati sumu, a f je faktor i mozemo mu izracunati frekvenciju preko funkcije table()
. Mi mozemo numericku varijablu da pretvorimo u faktor ali necemo moci izracunati sumu. x <- as.factor(x)
Kada probamo sada sumu za x
dobijemo error
: “‘sum’ not meaningful for factors”
Iako smo u f
naveli muskarce prve i ima ih vise, R na prvo mjesto stavlja zene tj. female
zato sto one abecedno prije dodju. Ako zelimo da svaimo male
kao prvi nivo (cesto zatreba u regresionim modelima), onda je slijedeci kod:
f1 <- factor (f, levels = c("male", "female"))
table (f1) #sada je "male" na prvom mjestu
## f1
## male female
## 3 2
R moze da importuje podatke na razlicitih formata. Najjednostavniji nacin za importovanje je .csv file-ova, i kada u R Studiju idemo preko Environmetn, pa Import Data set - from text file. Prije nego sto kliknemo na import moramo da provjerimo najbitnije stavki: da li zelimo heading, strings as factors, koji nam je separator, i da li koristimo tacku ili zarez u brojevima.
getwd()
# da provjerimo koji nam je working directorylist.files("baze")
# izlistava file-ove koji se nalaze u folderu bazesetwd ()
# da namjestimo working directorynpr. ako se baza zove fossilfuel i nalazi se u nasem working directory onda importujemo (prvi primjer ako je fossilfuel u .txt filu a drugi ako je u .csv)
. fuel <- read.table ("fossilfuel.txt")
. fuel <- read.table ("fossilfuel.csv", header = T, sep= ",")
library(foreign)
mystata <- read.dta ("potrosnja_prihod.dta") #STATA file je u istom folderu sa Uvodom. Da nije u "" bi naveli cijeli put do dokumenta npr C://...
head(mystata)
## potrosnja prihod
## 1 70 80
## 2 65 100
## 3 90 120
## 4 95 140
## 5 110 160
## 6 115 180
clipboard <- read.table("clipboard", header = TRUE, dec = ".")
Pored ovih argumenata mozemo imati i sep=
, StringsAsFactors=
..
Npr. stavimo sep = "\t"
u slucaju da nam je separator tab.
Importujemo sa clipboarda u slucaju manjih tabela. Inace ako su vece npr. u excelu onda spasimo u .csv. i nakon toga importujemo u R.
Note: Kada importujemo sa clipboarda podatke moramo imati vec isciscen format, tj. broj da bude broj i to da provjerimo da nemamo custom.
Bitno Cesta greska kod improtovanja sa clipboarda moze da bude Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : line 1 did not have 14 elements
.
Ovo rijesavamo tako sto savimo fill=TRUE
. I sva prazna polja se popunjavaju sa NA
.
clipboard <- read.table("clipboard", header = TRUE, dec = ".", fill=TRUE)
install.packages ()
library ()
help ()
length ()
#duzina vektorastr ()
# struktura vektora ili baze podatakaclass ()
# clasa ili tip objekta (matrica, baza podataka, vektor…)c()
#kreiranje vektoracbind ()
#kreira vise objekata po kolonamarbind ()
#kreira vise objekata po redovimadinames ()
#nazivi varijabli u matricinames ()
#nazivi varijabli u data.frame-uls ()
#imamo listu trenutnih objekata iz Environmentarm ()
#koristimo kada zelimo da obrisemo nesto iz environmentanew <- edit (old)
#editujemo staru bazu i spasavamo u novuattach ()
# pozivamo bazu. Ako radimo samo sa jednom bazom onda ne moramo u kodovim naznacavati. Mozemo samo ime varijabledettach ()
#suprotno od attachfix ()
#editujemo u novom prozoru koji se otvorihead ()
tail ()
x
y
Sve kodove spasiti u R script i poslati na mail 24h prije pocetka slijedeceg casa.
Ako zelite da vjezbate vise od kursa i zadatih zadaca, idite na: #http://www.data.gov/ #http://www.healthdata.gov/dataset/search #http://data.gov.uk/data/search #http://data.gov.in/ #http://data.gov.in/community/developer-community
install.packages ("HistData")
. Ovaj paket sadrzi interesantne baze na kojima mozete da vjezbate.Kopiramo url sa csv file-om i kod nam je:
read.table ("paste_url.csv")
. csv <- read.csv ("paste_ur.csv, skip=4, nrow=12")
Ovdje smo dali kod da zelimo R da preskoci prva 4 reda i da ucita slijedecih 12. To znamo jer smo prije toga otvorili file i vidjeli da to zelimo.
Imamo paket RCurl
koji sluzi da generisemo pdatke sa neta. tzv Client Interface for R.
Ako zelimo mozemo da pretrazujemo odredjene stranice i da vidimo uzorke ponavljanja odredjenih rijeci.
Posjetio odredjenu stranicu npr. www.ncbi.nlm.nih.gov i pretrazimo izraz “vaccine”. To sada spasimo pod imenom:
ncbi <- readLines("https://www.ncbi.nlm.nih.gov/gds/?term=vaccination")
## Warning in readLines("https://www.ncbi.nlm.nih.gov/gds/?term=vaccination"):
## incomplete final line found on 'https://www.ncbi.nlm.nih.gov/gds/?
## term=vaccination'
grep ("vaccine", ncbi)
## [1] 148 151 154
grep ("influence", ncbi)
## [1] 202
ncbi[grep("vaccine",ncbi)] #uzimamo samo redove u kojima je rijec vaccine
date() #stavljamo datum da se zna kad smo radili pretrazivanje
ncbi <- readLines(“https://www.ncbi.nlm.nih.gov/gds/?term=vaccination”).
Pristup twitteru
Ovdje se nalazi lista paketa koja omogovucava jednostavan pristup preko R-a do web stranice koja je gov
.
U ovoj sedmici posveticemo paznju Clean and Tidy data, a na kraju cemo imati case study.
Najvise vremena prilikom analiza podataka provodimo prilikom ciscenja podataka da ih pripremimo za analize. Kada imamao clean & tidy data sa njima nam je lako da manipulisemo i da radimo analize.
Zahvaljujuci g.Hadly Wickamu mozemo da uredjujemo podatke u R-u. On je razvio nekoliko korisnih paketa koje svaki analiticar svakodnevno koristi: reshape (2007), reshape2 (2007), plyr (2011) i ggplot2 (2009).
-podrazumjeva da su nam ispravni formati
-da popunimo prazna polja sa missing values
-da su nam nazivi varijabli korektni
Formate mijenjamo sa slijedecim funkcijma: - as.numeric (naziv varijable) - as.character (naziv varijable) - as.factor (naziv varijable) - as.matrix (naziv tabele) - as.data.frame(naziv_tabele ili naziv_matrice)
Dok cistite bazu cesto zavirujete u dubinu podataka. To najbolje mozete da uraditi sa funkcijom str ()
.
Ako primjetimo da su brojevi kao karakteri moramo da ih promjenimo u brojeve. R importuje numericke varijable u faktor varijable ako su decimale razdvajane sa zarezima.
Da se rijesimo toga koristimo funkciju gsub ()
. npr. baza$varijabla <- as.numeric(as.character(gsub(",","",baza$varijabla)))
. Dakle uz pomoc gsub ()
zamjenili smo “,” sa “” i plus faktor varijablu smo prebacili u as.character, pa numeric, uz pomoc funkcije as.numeric.ovjde trebamo biti pazljivi sa nasim podacima jer je kod nas zarez u R-u tacka.
Notice Nismo odmah prebacili iz faktora u karakter.
Formatiranje datuma R prepoznaje i datume i vrijeme (sate, minute sekunde). Datumi imaju klassu “Date”, a vrijeme ima klasu “POSIXct” ili “POSIXlt”. Datumi su interno pohranjeni kao dani od 01.januara 1970, a vrijeme kao broj sekundi od 01.januara 1970.
Datum mozemo formatirati sa funkcijom strptime ()
. ili as.Date ()
d<- c("01-01-1970", "02-01-1970") #d je karakter
d1<- as.Date(d, "%d-%m-%Y")# d je "POSIXlt" "POSIXt"
d1
## [1] "1970-01-01" "1970-01-02"
Notice bitno je da li stavljamo veliko ili malo “d” “m” i “y”.
Detaljnije o formatiranju datuma posjetite stranicu: https://www.stat.berkeley.edu/classes/s133/dates.html
Notice Da smo stavili “/” ili neki drugi znak umjesto “-”, onda bi i u funkciji strptime ()
stavili taj znak umjesto “-”.
Npr.
d<- c("01/01/1970 23:30", "02/01/1970 23:35")
d1 <- strptime(d, "%d/%m/%Y %H:%M")
d1
## [1] "1970-01-01 23:30:00 CET" "1970-01-02 23:35:00 CET"
Veoma je korisno formatirati datume. R ima korisne funkcije a to su weekdays (), quarters (). Tako da mozemo da racunamo samo odredjene kvartale ili da poredime dane..itd.
Da identifikujemo dane ili kvartale nasih datuma u varijabli d1 koristimo funkciju:
weekdays(d1)
## [1] "Thursday" "Friday"
quarters(d1)
## [1] "Q1" "Q1"
Ove funkcije su nam veoma korisne npr. u sektoru zdravstva. Recimo kod istrazivanja sirenja nekog virusa, povezanosti smrtnosti u odredjeno vrijeme sa nivoom zagadjenosti ili temperaturnim sokom u odredjeno vrijeme..itd.
Funkcija cut()
Funkcija cut ()
je veoma znacajna funkcija. sluzi nam da numericki vektor pretvaramo u sekcije. Tako mozemo starosne godine da pretvorimo u intervale.
Mozemo da zadamo kod interval < - cut (x, breaks = 15)
. Ovaj kod podrazumjeva da nam vektor sijece na 15 dijelova. U ovom slucaju mozemo da imamo ostatke, a npr. ako zelimo da sijecemo godine onda su ostaci neprihvatljivi.
Drugi nacin je: interval <- cut (x, breaks = seq(15,100, by=5))
. U ovom slucaju daje nam intervale bez ostataka. 15
znaci da je to minimum, 100
je maximum, by
znaci za koliko tj. koji je raspon godina.
Uradimo primjer
starost <- c(0:85)
interval <- cut (starost, breaks=seq (0,80,by=5))
interval
## [1] <NA> (0,5] (0,5] (0,5] (0,5] (0,5] (5,10] (5,10]
## [9] (5,10] (5,10] (5,10] (10,15] (10,15] (10,15] (10,15] (10,15]
## [17] (15,20] (15,20] (15,20] (15,20] (15,20] (20,25] (20,25] (20,25]
## [25] (20,25] (20,25] (25,30] (25,30] (25,30] (25,30] (25,30] (30,35]
## [33] (30,35] (30,35] (30,35] (30,35] (35,40] (35,40] (35,40] (35,40]
## [41] (35,40] (40,45] (40,45] (40,45] (40,45] (40,45] (45,50] (45,50]
## [49] (45,50] (45,50] (45,50] (50,55] (50,55] (50,55] (50,55] (50,55]
## [57] (55,60] (55,60] (55,60] (55,60] (55,60] (60,65] (60,65] (60,65]
## [65] (60,65] (60,65] (65,70] (65,70] (65,70] (65,70] (65,70] (70,75]
## [73] (70,75] (70,75] (70,75] (70,75] (75,80] (75,80] (75,80] (75,80]
## [81] (75,80] <NA> <NA> <NA> <NA> <NA>
## 16 Levels: (0,5] (5,10] (10,15] (15,20] (20,25] (25,30] ... (75,80]
Vidimo da imamo 16 nivoa. Mala zagrada znaci da se broj ne ukljucuje, a srednja da se broj ukljucuje. Npr. (0,5] ne ukljucuje 0 ali ukljucuje 5.
Missing values popunjavamo prazna polja sa missing values, na slijedeci nacin:
url <- read.table("https://www.gov.uk/government/uploads/system/uploads/attachment_data/file/271595/reccrime-geo-pfa.csv", fill = T, stringsAsFactors = T, header = T, sep = " ")
table(is.na(url))
##
## FALSE
## 804
url[url == ""] <- NA
table (is.na(url))
##
## FALSE TRUE
## 547 257
Rukovanje sa NA
R ima nekoliko nacina kako da se nosi sa nedostajucim podacima. Za pocetak kada dobijemo bazu podataka dobro je da pokrenemo kod: summary (naziv_baze)
. Ovaj kod ce nam izlistati za svaku varijablu da li postoje NA i koliko ih ima. Inace kod summary()
je dobar zato sto dobijemo i informaciju o vrsti varijabli, broj obzervacija, min, max, mean, median. Ako nas ne interesuje cijela baza nego npr. zelimo da provjerimo samo neku varijablu onda pokrenemo kod: is.na (naziv_varijable)
.
NAs nas cesto sprecavaju da uradimo odredjenu operaciju u Ru. U tom slucaju pojavice nam se Error u kojem pise da zbog NA R nam ne moze dati rezultat. Za to ima rjesenje.
Unutar funkcije, nakon varijable ukucamo na.rm = TRUE
, sto znaci da iz operacije za odredjenu varijablu zanemaruje obzervacije koje su NA. Tako npr ukucamo: fivenum (naziv_varijable, na.rm=TRUE)
.
Ako zelimo u potpunosti da iz cijele baze izbacimo sve obzervacije koje po bilo kojoj varijabli imaju NA onda: bezNA <- na.omit (naziv_baze)
. Na ovaj nacin formirali smo novu bazu bezNA
koja ne sadrzi NA.
Ako ipak zelimo da NA zamjenimo sa nekim brojem, npr saznamo za odredjenu varjablu broj koji je do tad bio NA. Pretpostavimo da je taj broj 3:naziv_baze [is.na(naziv_varijable)] <- 3
.
Ako zelimo da izbacimo iz vektora samo one vrijednosti koje ne sadrze NA
mozemo sa komandom : naziv_varijable[!is.na(naziv_varijable)]
.
Ako zelimo iz data.frama da izdvojimo NA
iz odredjene varijable onda je kod: nona <- naziv_baze[!is.na(naziv_baze$v),]
. nona je novi data.frame, naziv_baze je stari data frame. v je varijabla, !is.na
je logican. Vec smo spomenuli da !=
znaci da nije jednak, tako u ovom slucaju !is.na
znaci da nije varijabla nije jednaka NA.
Izmjena naziva varijable u data.frame
Postoji nekoliko nacina da promjenimo naziv varijable.
funkciom fix()
ili edit ()
. Obje funkcije nam otvaraju jedan mali prozorcic sa nasom bazom i onda rucno unosimo izmjene. Sve sto unesemo na ovaj nacin nema kodova tako da je preporucljiv o koristiti drugi nacin
drugi nacin je funkcija names ()
.
names(prva_baza) <- c("broj", "karakter") #ogranicenja ovog nacina su kada imamo veliki broj varijabli ako zelimo da promjenimo pedesetu varijablu moramo ispisati i prethodne varijable.
Radi ogranicenja names ()
kod velikih baza podataka, postoji i treci nacin funkciom rename ()
. rename se nalazi u paketu reshape tako da prvo trebamo da ga instaliramo i pozovemo. Ako nemate istalisan paket prvo to uradite sa funkcijom: install.packages ("reshape")
. Nakon instalacije pozovite paket funkcijom library ()
.
library (reshape) #Note kod install.packages () imaju navodni znaci a kod library nema!
prva_baza <- rename(prva_baza, c(karakter="slova"))
print(prva_baza)
## broj slova
## 1 1 a
## 2 5 b
## 3 6 d
## 4 8 c
## 5 9 x
Brisanje obavljamo sa negativnim indeksima. npr. ako imamo dataframe df
koji ima 50 redova i 20 kolona, mozda ne zelimo da radimo sa cijelom bazom. Mozda u nekim slucajevima neke obzervaicje treba brisati, ili redove tj. neupotrebljivi su. U tom slucaju ih brisemo na slijedeci nacin:
df1<- df[-30:31, -10:-12]
#df1 nam je novi dataframe, df je stari, lijevo od zareza su redovi, desno od zareza su kolone.
df1 <- df[-1, c(-2,-5:-12)]
# na ovaj nacin nismo obrisali samo od 10 do 12 kolone nego i drugu kolonu i kolone od 5 do 12.
Note kada se stavlja dvotacka :
ona podrazumjeva od broja do broja i ukljucuje. U gornjem slucaju ukljucuje 5 i 12 kolonu a ne ono sto je izmedju.
prvo idemo na link http://www.bhas.ba:8080/istarMDBC/MD/dawinciMD.jsp?a1=u&a2=-&n=1UN906$$$$1021B&o=07&v=1UN0604109OG000000000&p=0&sp=null&l=0
Ovu tabelu prvo otvorimo u excelu pa onda spasimo u csv. formatu. Importovacemo ovaj put preko Environment ikone Import Dataset.
Kad smo improtovali vidimo da imamo 32 observacije ali varijabli, a znamo kad smo vidjeli na web stranici da smo imali 4varijable
Kada ukucamo str (naziv_baze
) vidimo da su nam numericke varijable faktori a to ne zelimo iammo jednu varijablu sa NA i ona je logicka. Nju cemo da brisemo, imamo varijablu prvu koja je povukla i naziv tabele iz orginalnog dokumenta i nazive potresnje i ona je faktor varijabla sa 29 nivou. ovo sve moramo da iscistimo. Takodjer vidimo u tekstu da imao slova sa interpukcijom to cemo sve morati da zamjenimo sa slovima bez interpunkcije.
Prvo izbrisemo drugu varijablu :
potrosnja <- potrosnja_tipnaselja[,-2]
Sada promjenimo nazive varijablama sa funkcijom names ()
jer mijenjamo svaku varijablu.
names(potrosnja) <- c("grupe_proizv", "urbano", "ruralno", "ukupno")
Sada izbrisimo redove od 1 do 5 i red 32. Tj. zadrzavamo redove od 5 do 31.
potrosnja <- potrosnja [5:31,]
Kada idemo na View ()
vidimo da da nam neki redovi ne trebaju, to su redovi koji predstavljaju ukupno prehrana, ukupno neprehrana i total. To sve mozemo da dobijemo u R-u. Posto cemo da brisemo ta tri reda moramo da ih indeksiramo. Vec smo brisali redove i sada nam row.names ()
pocinje od broja 5. Da bi row.names poceo od 1 i tako znali kako da indeksiramo data.frame kucamo:
row.names(potrosnja) <- 1:27
potrosnja <- potrosnja[c(-12,-26:-27),]
row.names(potrosnja) <- 1:24
Sada mozemo preci na formatiranje varijable. Kada ukucamo class ()
za svaku varijablu vidimo da su sve faktor varijable. To ne zelimo jer urbano, ruralno i ukupno su numericke pa to promjenimo.
potrosnja$urbano <- as.numeric(potrosnja$urbano)
potrosnja$ruralno <- as.numeric(potrosnja$ruralno)
potrosnja$ukupno <- as.numeric(potrosnja$ukupno)
class(potrosnja$urbano)
## [1] "numeric"
Da bismo ispravili interpukciju, mozemo preko newpotrosnja <- edit (potrosnja)
, ili da formiramo novu varijablu sa imenima bez interpunkcije. pozeljniji je drugi nacin radi kodova. Buduci da nam je sad varijabla factor, sa 29 nivou to nam nista ne znaci, posebno jer imamo 24 obzervacije tado da cemo prvo factor varijablu pretvoriti u charachter.
potrosnja$grupe_proizv <- as.character(potrosnja$grupe_proizv)
potrosnja$grupe_proizv <- c("hljeb i zitarice", "meso", "riba", "mlijeko, sir, jaja", "ulja i masnoce", "voce", "povrce", "secer, dzem, med, cokolada", "ostali prehrambeni", "bezalkoholna pica", "alkoholna pica", "duhan", "odjeca i obuca", "stanovanje", "elek.energija, plin, voda i dr.energenti", "namjestaj", "zdravstvo", "prijevoz", "komunikacije", "rektreacija i kultura", "obrazovanje", "ugostiteljske usluge", "usluge smejstaja", "ostali proizvodi i usluge")
Takodjer mozemo da brisemo i kolonu ukupno jer kao i redovi total ona se moze izracunati u R-u.
potrosnja <- potrosnja[,1:3]
Mozemo da radimo i sa ovakvom bazom. Koja je sada clean & tidy. A mozemo i da napravimo tzv. long format. da nam varijable ruralno i urbano budu jedna i da je nazovemo tip_naselja.
library (reshape2)
##
## Attaching package: 'reshape2'
## The following objects are masked from 'package:reshape':
##
## colsplit, melt, recast
newpotrosnja <- melt (potrosnja)
## Using grupe_proizv as id variables
names (newpotrosnja) <- c("proizvodi", "tip_naselja","iznos_KM")
dim (newpotrosnja)
## [1] 48 3
Neka proizvodi budu factor.
newpotrosnja$proizvodi <- as.factor(newpotrosnja$proizvodi) # sada je varijabla $proizvodi factor sa 24 nivoa.
Kada smo iscistili bazu mozemo je sada analizirati!!