2.sedmica:

☺ Transformacije varijabli
☺ Filtriranje i selektovanje varijabli
☺ Merganje dvije baze
☺ Sortiranje po velicini i reorder


Manipulacije varijablama u R-u:


Transformacije varijabli

WHO <- read.csv("C:/Users/Amra Fetahovic/Downloads/WHO.csv", stringsAsFactors=FALSE) 

Primjer transformacije varijable kao sto smo naveli moze biti logovanje odredjene varijable. Cesto nam je to potrebno u analizama kako bismo dobili normalnu distribuciji i mogli da radimo odredjene statisticke analize npr. Linearnu regresiju.

WHO$Poplog <- log(WHO$Population)

Sada imamo u bazi jednu vise varijablu. Poplog je nova varijabla. Ako zelimo da logovanu varijablu vratimo kako je bila onda je to exp(WHO$Poplog).

Jos jedan primjer moze biti racunjanje udjela. Npr ako zelimo da izracunamo udio $Under15 u ukupnoj populciji.

WHO$UdioUnder15 <- WHO$Under15/WHO$Population

head (WHO[,11:15])
##     GNI PrimarySchoolEnrollmentMale PrimarySchoolEnrollmentFemale
## 1  1140                          NA                            NA
## 2  8820                          NA                            NA
## 3  8310                        98.2                          96.4
## 4    NA                        78.4                          79.4
## 5  5230                        93.1                          78.2
## 6 17900                        91.1                          84.5
##      Poplog  UdioUnder15
## 1 10.303102 0.0015899413
## 2  8.058960 0.0067457306
## 3 10.557946 0.0007125409
## 4  4.356709 0.1948717949
## 5  9.943717 0.0022851928
## 6  4.488636 0.2916853933

Filtriranje i selektovanje varijabli

Selektiranje elemenata iz vektora

Postoji nekoliko nacina da selektujemo vektor u osnovnom R paketu:
- prema poziciji
- prema vrijednosti
- prema imenu

Prema poziciji:

x <- seq(2,8, by=0.3) # za razliku od c(), korisitili smo malo napredniji nacin a to je seq (). Seq je skracenica od sequence. 2 je minimum, 8 je maximum a 0.3 je raspon izmedju dva elementa. 
print (x)
##  [1] 2.0 2.3 2.6 2.9 3.2 3.5 3.8 4.1 4.4 4.7 5.0 5.3 5.6 5.9 6.2 6.5 6.8
## [18] 7.1 7.4 7.7 8.0
x[5] #peti element
## [1] 3.2
x[-5] #sve osim 5 elementa
##  [1] 2.0 2.3 2.6 2.9 3.5 3.8 4.1 4.4 4.7 5.0 5.3 5.6 5.9 6.2 6.5 6.8 7.1
## [18] 7.4 7.7 8.0
x[5:10] # elemente od 5 do 10, ukljucujuci 5 i 10
## [1] 3.2 3.5 3.8 4.1 4.4 4.7
x[-(5:10)] # elementi osim 5 do 10
##  [1] 2.0 2.3 2.6 2.9 5.0 5.3 5.6 5.9 6.2 6.5 6.8 7.1 7.4 7.7 8.0
x[c(1,5)] #prvi i 5 element
## [1] 2.0 3.2

Prema vrijednosti

x[x==6.5] #izdvaja samo one elemnente koji su jednaki broju 10
## [1] 6.5
x[x<5] #izdvaja samo one elemente koji su manji od 2 
##  [1] 2.0 2.3 2.6 2.9 3.2 3.5 3.8 4.1 4.4 4.7
x[x %in% c(2,4,6.2,8)] #uzima samo elemente koji se nalaze u setu 2, 4, 5, 8 
## [1] 2.0 6.2 8.0

Prema nazivu vektora

odnosi se na kategoricke varijable:

voce <- c("kruske", "jabuke", "breskve", "breskve") # formirajmo vektor
voce[voce=='breskve'] #izdvajamo samo breskve
## [1] "breskve" "breskve"

Selektiranje elemenata iz data.frame-a

Cesto cemo biti u potrebi da ne koristimo cijelu bazu podatka, nekad radi ciscenja baze, nekad jer nam za odredjenu analizu ne trebaju sve varijable. Da bismo filtrirali potrebne elemente iz baze postoji nekoliko nacina.

Prvo formirajmo bazu podataka koja se sastoji iz kategorickih i numerickih variabli.

df <- data.frame(voce = c('kruske', 'jabuke', 'breskve', 'breskve', 'mandarine', 'mandarine', 'narandze'), kg = c (2,5,5,6,3,1,8))

Prema poziciji

df[,2]
## [1] 2 5 5 6 3 1 8
df[4,]
##      voce kg
## 4 breskve  6
df[4,2]
## [1] 6
df[2:5,1:2] #Selektirali smo redove od 2 do 5 i prvih dvije varijable. 
##        voce kg
## 2    jabuke  5
## 3   breskve  5
## 4   breskve  6
## 5 mandarine  3
df[,-c(1,2)] #Selektiramo sve obzervacije a od varijabli uzimamo sve izuzev druge i pete. Posto imamo dvije varijable sada nemamo baze
## data frame with 0 columns and 7 rows

Prema vrijedosti i nazivu

Zarez prilikom selektiranje prema sadrzaju u data.frame igra znacajnu ulogu, jer na taj nacin zadrzavamo sve varijable a selektiramo samo one redove koje sadrze zadati sadrzaj.

df[df$kg==5,] 
##      voce kg
## 2  jabuke  5
## 3 breskve  5
df[df$kg>5,]
##       voce kg
## 4  breskve  6
## 7 narandze  8
df[df$voce=="breskve",]#Uzimamo sve obzervacije koje imaju u varijabli voce rijec "breskve".
##      voce kg
## 3 breskve  5
## 4 breskve  6

Zamjena broja u vektoru ili bazi podataka

Vec smo formirali vektor pod nazivom numericki. Da se podsjetimo, do je vektor od deset elemenata i sadrzi brojeve od 1 do 10. Ako zelimo da na petom mjestu bude broj 55 onda je komanda:

numericki <- rep(1:10,2)
numericki [5]<-32
print(numericki)
##  [1]  1  2  3  4 32  6  7  8  9 10  1  2  3  4  5  6  7  8  9 10
numericki [c(3,8)] <- c(0,1) #na ovaj nacin mijenjamo 3 i 8 poziciju u vektoru istovremeno
print(numericki)
##  [1]  1  2  0  4 32  6  7  1  9 10  1  2  3  4  5  6  7  8  9 10

Srednja zagrada ima funkciju da indeksira odredjeni element u objektu, bilo da je to vektor ili matrica ili baza podataka. Posto se vektor sastoji samo od jednog niza a baza podataka ima i obzervacije i varijable onda se i kod za zamjenu mijenja.

Da bismo dobili data.frame u kojem ne moramo naknadno mijenajati nazive ukucajmo: df <- data.frame (x=1:3, y=c("a", "b", "c")).

Izmjena broja u data.frame

Posto sada imamo bazu vec formiranu, recimo da zelimo da prmjenimo pod varijablom $broj umjesto 9 da bude 8. Kod je slijedeci:

prva_baza <- data.frame(broj=1:5, slovo="a","B","c","d", "e" )
prva_baza[5,1]<- 8
tail(prva_baza,2)
##   broj slovo X.B. X.c. X.d. X.e.
## 4    4     a    B    c    d    e
## 5    8     a    B    c    d    e

Izmjena faktora u data.frame-u

Kod karakter varijable je malo drugacije, ako pratimo istu logiku kao u primjeru sa brojevima dobijemo error. to je zato sto je varijabla $slova faktor. Kod faktora odnosno kategorickih varijabli moramo staviti navodnike, ali samo kad je tekst, npr: muskarci, zene, crvena, plava, zuta.
Pored toga kod kategoricke varijable, za razliku od numericke, ne mozemo da zamijeniti bilo koje slovo ili rijec. Mozemo da stavimo samo onaj karakter koji vec postji u bazi. Tako u konkretnom primjeru umjesto “x” mozemo da stavimo “a”, “b”, “c” ili “d”.

baza <- data.frame(x=c(2,6,89,0,1), y=c("a", "N", "y", "u","v"))
baza [5,2] <- "b"
## Warning in `[<-.factor`(`*tmp*`, iseq, value = "b"): invalid factor level,
## NA generated
print(baza)
##    x    y
## 1  2    a
## 2  6    N
## 3 89    y
## 4  0    u
## 5  1 <NA>
baza [5,2] <-"a" #zamjenili smo sa "a" jer vec imamo taj nivo. 

Spajanje baza

Merdzanje baza

Ako zelimo da merdzamo dvije baze one moraju imati zajednicku varijablu bilo numericku bilo kategoricku preko koje povezujemo dvije baze. Ako je tekstualna moramo dobro provjeriti da li su nazivi isti: malo ili veliko slovo, zarez, isti izgovor. Mozemo naici na dvije situacije: Prva situacija je da baze imaju isti naziv za jednu te istu varijablu a druga mogucnost je da im je naziv razlicit.
Primjer Pretpostavimo da imamo dvije baze B i E. Ako su im varijable isto nazvane onda samo ukucamo:

newdata <- merge (B,E)

A ako su razlicito varijable nazvane onda kucamo: newdata <- merge (B,E, by.x = "date", by.y="day").

Note: kod merdzanja R izbacuje prazne redove da bismo to sprijecili dodamo kao argument: all=T (zadrzavamo i x i y) ili all.x=T (kad zadrzavamo prvu x bazu) ili all.y. = T (kad zadrzavamo sve iz y baze).

Ako imamo situaciju da mergamo dvije varijable sa istim nazivom onda je kod:

mydata <- merge(mydata1, mydata2, by=c("country","year"))

Ako imamo situaciju da mergamo dvije varijable koje su iste ali razlicito su nazvane onda je kod:

mydata <- merge(mydata1, mydata2, by.x=c("country","year"), by.y=c("zemlja", "godina"))

Dodavanje baza

Ako dodajemo baze jednu ispod druge one moraju da imaju jednake nazive varijabli!. Prije nego sto zelimo dodati bazu na bazu ovo moramo da provjerimo.

mydata <- rbind(mydata7, mydata8).

Ako jedna baza ima vise varijabli onda moramo da provjerimo da li zelimo te varijable da zadrzimo. Ako ih zadrzavamo onda ih kreiramo i u drugoj bazi i one tu sadrze NAs.


Sortiranje baze podatka

Sortiramo bazu podataka, prema nekoj numerickoj varijabli. Uzmimo za primjer WHO bazu podataka i da sortiramo dataframe po stopi Fertiliteta.

WHO <- read.csv("C:/Users/Amra Fetahovic/Downloads/WHO.csv", stringsAsFactors=FALSE) #prvo importujemo bazu. ovu bazu cemo i kasnije koristi

sortWHO <- WHO[order(WHO$FertilityRate),]

sortWHO <- WHO[order(WHO$FertilityRate,-WHO$ChildMortality),]# sortiramo po Fertiliy rate i Child Mortality. Prvi je ascending a drugi descending

Dplyr paket

Ovaj paket koristimo kada zelimo da istovremeno provedemo nekoliko filtriranja tj. selektiranja jednom komandom. Malo je napredniji za nauciti od osnovnog, al ga je veoma korsno znati jer sto je veca baza i sto imate vise stavki osnovni nacin subsetovanja data.frame-a postaje potezak. Rezultat toga je da cete dobiti nevjerovatno puno medju baza podatka koje nikada necete korsitit ali ce opterecivati vas environment sto vam otezava analizu.

Stoga predlazem da se nauci ovaj paket.

Prije svega potrebno ga je instalisati pa onda i otvoriti.

install.packages ("dplyr")
library (dplyr)

dplyr paket ima nekoliko funkcija: select, filter, arrange, rename, mutate, summarise i %>%.

**select ()**

cuva sve varijable koje se spomenu.

WHODemog <- select(WHO, Country:Over60) #izdvajamo samo varijable do Country do Over60. 

Ako zelimo da izostavimo te varijable onda:

WHOomit <-select (WHO, -(Country:Over60))

Ako zelimo varijable koje sadrze odredjeni broj ili odredjenu rijec:

WHORate <- select(WHO, c(Country, ends_with("Rate")))

Kako smo uradili sa ends_with (), tako postoji i mogucnost da izdvojimo varijable koje pocinju sa odredjenim brojem ili rijeci sa funkcijom starts_with ().

**filter ()**

funkcija se koristi kada zelimo da dijelove observacija iz baze podataka.
Ako zelimo da posmatramo WHO samo za stanovnike Evrope onda moramo filtrirati varijablu Region.

WHOEurope <- filter(WHO, Region=="Europe")
str (WHOEurope[,1:5])
## 'data.frame':    53 obs. of  5 variables:
##  $ Country   : chr  "Albania" "Andorra" "Armenia" "Austria" ...
##  $ Region    : chr  "Europe" "Europe" "Europe" "Europe" ...
##  $ Population: int  3162 78 2969 8464 9309 9405 11060 3834 7278 4307 ...
##  $ Under15   : num  21.3 15.2 20.3 14.5 22.2 ...
##  $ Over60    : num  14.93 22.86 14.06 23.52 8.24 ...

U sklopu filter () funkcije mozemo da damo vise zadataka. Npr, ako nas u Evropi zanimaju samo zemlje kod kojih je ChildMortality manji od 10.

WHOEuro_mort<- filter (WHO, Region=="Europe" & ChildMortality <10)

**arrange()**

Vec smo spomenuli kako da sortiramo podatke u R-u. Postoji i jednostavniji nacin za to a to je preko dplyr paketa sa funcijom `arrange ()``.

WHOsort <- arrange (WHO, FertilityRate)
i kada imamo od najveceg ka najmanjem

WHOsort <- arrange (WHO, desc(FertilityRate))

**group_by ()**

ovo je veoma korisna funkcija i cesto koristi u R-u sa funkcijom summarise (). Primjer je preuzet iz “R Programming for Data Science” by Rodger Peng str.59.
Mi cemo ovaj dio posebno obraditi sa kodovima nase baze u sedmici 3 ako stignemo.

npr.imamo bazu podataka chicago, koja se odnosi na zagadjenost po datimima i godinama i vrsta polutanta. Mi zelimo da vidimo u godoni dana. Nas interesuje godisnji prosjek za pm25, maximalni nivo emisije o3 i medijana no2.

Nakon sto smo formirali varijablu year() koja sadrzi samo godine a ne datume mozemo pristupiti grupisanju. Dakle nas stratum su godine.

godine <- group_by (chicago, year). U ovoj fazi nista se znacajno nije desilo. sada se sluzimo sa grupisanim data.framom za summarize.

summarise (godine, pm25=mean(pm25, na.rm=T), o3 = max(o3tmean, na.rm=T), no2 = median (no2tmean, na.rm=T))

%>%

Ovaj znak je koristan u dpyr paketu jer omogucava da odjednom kao u jednoj recenici tako u jednom kodu zadamo sve sto nas inetersuje. tako smo mogli gore navedeno grupisanje i summarize napisati kao:

group_by (chicago, year) %>% + summarise (pm25 = mean(pm25,na.rm=T), + o3 = max(o3tmean, na.rm=T), + no2 = median (no2tmean, na.rm=T))

Korisno za nauciti do slijedeceg casa:

dplyr paket unlist () Ovo je korisna funkcija ali koristi se samo za numericke varijable. Nikako je ne koristiti sa faktorima
dim () Za rezultat dobivamo dimenzije baze podatka, kolko redove i kolona, tj. obzervacija i varijabli.
str () Dobivamo strukuru baze podataka. Tj. iz kojih se varijabli sastoji osnvono o varijablama, korisna je posebno za pocetak analiza