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.

Korisni sajtovi, knjige i pomoc preko R-a.

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:

  1. Maindonald: “Data Analysis and Graphics Using R”

R literatura:

  1. help.start ()
  2. help.search("random variable") #Pretrazuje fajlove neke fraze
  3. swirl () # paket koji sluzi kao online kurs direktno preko R ucite R
  4. help (plot) ili ?plot #na ovaj nacin pretrazujete o funkciji plot()
  5. help (package = "dplyr") #pomoc u vezi odredjenog paketa, u ovom slucaju dplyr paketa.

Plan rada

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

Instalacija

R i R studija za Windows

  • otvoriti www.r-project.org.Klik na >download R<. link se nalazi na sredini stranice pod: “Getting Started.” Odaberite CRAN lokaciju (a mirror site) i onda kliknite na odgovarajuci link. Ako nema BiH onda ici na USA.
  • Klik na “Download R for Windows” link na vrhu stranice.
  • Klick na “install R for the first time” link na vrhu stranice.
  • Klick “Download R for Windows” i spasite .exe negdje na kompjuteru. Pokrenite .exe file i pratite instrukcije instalacije.

Sada kad ste instalirali R, vrijme je da instalirate RStudije.

Instalacija R Studija za Windows

  • Idite na http://rstudio.com and i kliknite “Download RStudio”.
  • Klinite na “Download RStudio Desktop.”
  • Kliknite na onu verziju koja je predlozena za vas sistem i spasite .exe file
  • pokrenite .exe file i pratite instrukcije

Instalacija R za Mac korisnike

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

Instalacija Rstudija za Mac korisnike

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.

Instalacija R i R Studio za Linux korisnike

//pitati almu

Pocetak rada u R-u

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.


Znacenje razlicitih znakova u R-u

<- 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.

Matematicke operacije

Osnovne

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

Dodatne

  • log(x)
  • exp(x)
  • round (x,n) #zaokruzuje decimalna mjesta za n decimala
  • cor(x, y) #korelacija izmedju x i y
  • sum(x)
  • mean (x)
  • median (x)
  • quantile (x) # procentni kvintili
  • var (x) # varijansa
  • sd(x) #standardna devijacija

Primjer:

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, matrice i baze podataka

Vektori

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

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 - Data.frame

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****.

Vrste varijabli, akcenat na faktore

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.

Faktori

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

Importovanje baza:

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.

Import podataka ako su u istom working directory

  • getwd() # da provjerimo koji nam je working directory
  • list.files("baze") # izlistava file-ove koji se nalaze u folderu baze
  • setwd () # da namjestimo working directory

npr. 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= ",")

Import razlicitih formata

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

Import clipboard

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)


Bitne ucestale funkcije

install.packages ()
library ()
help ()
length () #duzina vektora
str () # struktura vektora ili baze podataka
class () # clasa ili tip objekta (matrica, baza podataka, vektor…)
c() #kreiranje vektora
cbind () #kreira vise objekata po kolonama
rbind () #kreira vise objekata po redovima
dinames () #nazivi varijabli u matrici
names () #nazivi varijabli u data.frame-u
ls () #imamo listu trenutnih objekata iz Environmenta
rm () #koristimo kada zelimo da obrisemo nesto iz environmenta
new <- edit (old) #editujemo staru bazu i spasavamo u novu
attach () # pozivamo bazu. Ako radimo samo sa jednom bazom onda ne moramo u kodovim naznacavati. Mozemo samo ime varijable
dettach () #suprotno od attach
fix () #editujemo u novom prozoru koji se otvori
head ()
tail ()


Zadaca:

  1. kreirati vektor od 15 elemenata i spastiti pod imenom x
  2. pomnoziti vektor sa 2 i spasiti pod imenom y
  3. kreirati matricu 5x2 tj. i dati imena redovima i kolonama po izboru
  4. kreirati data.frame 10x2, tj. deset observacija i dvije varijable. prva varijabla da je numericka a druga karakter. Hit: provjeravati sa class(koji je format).
  5. U max dvije recenice objasniti razliku izmedju factor i character varijable
  6. Navesti jedan primjer numericke varijable kontinius i jedan primjer diskretne numericke varijable.

Sve kodove spasiti u R script i poslati na mail 24h prije pocetka slijedeceg casa.


Samostalne aktivnosti:

Dodatne vjezbe

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

  1. Data Camp
  2. Swirl
  3. A mozete vjezbati na datasets koji se nalaze u paketu: HistData. install.packages ("HistData"). Ovaj paket sadrzi interesantne baze na kojima mozete da vjezbate.
    4.Data.gov ima preko 100.000 baza podataka
    5.Keggle odnedavno njegovi clanovi sharuje stvarne podatke i analize podataka
  4. Data.gov.uk, Data.gov.in
  5. Eurosta
  6. WHO
  7. OECD

Importovanje sa neta:

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.

R i INTERNET

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”).

R i API

Paket “twitterR”

Pristup twitteru

ROpenGov

Ovdje se nalazi lista paketa koja omogovucava jednostavan pristup preko R-a do web stranice koja je gov.

CLEAN AND TIDY

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).

Clean data:

-podrazumjeva da su nam ispravni formati
-da popunimo prazna polja sa missing values
-da su nam nazivi varijabli korektni

Formatiranje varijabli

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.

Nedostajuci podaci

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.

Naziv varijable

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

Tidy data: podrazumjeva:

  • da je svaki red obzervacija
  • da je svaka kolona varijabla
  • da mozemo za svaki tip observacije oformiti tabelu.

Brisanje redova i kolona:

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.

red=observacija, kolona=varijabla**

Kada imamo format da su nam redovi godine, a kolone varijable, taj format trebamo transformisati da bismo dobii tzv. “tidy” bazu. U ovu svrhu mozemo da koristimo vise paketa. Npr. paket “reshape2”. U ovom paketu nalazi se funkcija melt () koja transformise da nam je svaki red jedna obzervacija.

npr. novabaza <- melt (starabaza).


CASE STUDY: potrosnja domacinstava u BiH, cleand and tidy dataset

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!!