☺ Transformacije varijabli
☺ Filtriranje i selektovanje varijabli
☺ Merganje dvije baze
☺ Sortiranje po velicini i reorder
mean ()
.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
Postoji nekoliko nacina da selektujemo vektor u osnovnom R paketu:
- prema poziciji
- prema vrijednosti
- prema imenu
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
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
odnosi se na kategoricke varijable:
voce <- c("kruske", "jabuke", "breskve", "breskve") # formirajmo vektor
voce[voce=='breskve'] #izdvajamo samo breskve
## [1] "breskve" "breskve"
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))
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
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
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"))
.
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
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.
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"))
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.
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
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))
dplyr paket
unlist ()
Ovo je korisna funkcija ali koristi se samo za numericke varijable. Nikako je ne koristiti sa faktorimadim ()
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