3. Faktori¶
Pojam faktor se odnosi na statistički tip podataka koji zovemo kategorička varijabla.
Kategoričke varijable pripadaju nekom skupu (klasi) sa ograničenim brojem kategorija (vrijednosti klase).
Na primjer: Muško
, Žensko
ili Prošao ispit
, Pao ispit
Faktor dobijemo tako da vektor konvertiramo funkcijom factor()
Primjer:
Imamo vektor spol
koji ima 5 elemenata:
spol_v <- c('musko', 'zensko', 'zensko', 'zensko', 'musko')
spol_v
- 'musko'
- 'zensko'
- 'zensko'
- 'zensko'
- 'musko'
Kada ga konvertiramo u faktor dobijemo 5 elemenata ali samo dvije vrijednosti klase (levels);
spol_f <- factor(spol_v)
spol_f
- musko
- zensko
- zensko
- zensko
- musko
Levels:
- 'musko'
- 'zensko'
Kada govorimo o kategoričkim varijablama razlikujemo nominalne i ordinalne varijable.
Za razliku od nominalnih koje su "obične" (spol, boja kose, vrsta životinje, ...) ordinalne varijable u sebi sadržavaju određenu hijerarhiju.
Na primjer; "dobar", "loš", "zao",
ili "ponedjeljak", "utorak", "srijeda",
ili "visok", "srednji", "nizak"
Tu unutrašnju hijerarhiju možemo i zadati u faktoru.
Na primjer:
temp_v <- c("visoka", "visoka", "srednja", "niska", "visoka")
temp_f <- factor(temp_v, order=TRUE, levels=c("niska", "srednja", "visoka"))
temp_f
- visoka
- visoka
- srednja
- niska
- visoka
Levels:
- 'niska'
- 'srednja'
- 'visoka'
To smo mogli napraviti i na sljedeći način:
temp_f <- factor(temp_v, order=T)
levels(temp_f)=c("niska", "srednja", "visoka")
temp_f
- visoka
- visoka
- srednja
- niska
- visoka
Levels:
- 'niska'
- 'srednja'
- 'visoka'
Pošto imamo hijerarhiju, tj. redoslijed u faktoru, možemo uspoređivati njegove elemente.
Na primjer u faktoru temp_f
pogledajmo njegov 3. i 4. element i onda provjerimo da li je 3. veći od 4.
temp_f[3]
temp_f[4]
temp_f[3]>temp_f[4]
Levels:
- 'niska'
- 'srednja'
- 'visoka'
Levels:
- 'niska'
- 'srednja'
- 'visoka'
I zaista, srednja
jest veća od niske
Malo detaljnije o faktoru¶
Da bi dobili više detalja o nekom faktori koristimo funkciju summary()
Ova funkcija će nam vratiti broj elemenata pojedine vrijednosti klase.
Na primjer:
summary(temp_f)
- niska
- 1
- srednja
- 1
- visoka
- 3
Zadatak
Napravite faktore od vektora pon
i uto
.
pon_v
ima vrijednosti visoka
, niska
, visoka
, a
uto_v
ima vrijednosti srednja
, niska
, visoka
Pretvorite ih i faktore i usporedite ih
# Rješenje
pon_v <- c('visoka', 'niska', 'visoka')
uto_v <- c('srednja', 'niska', 'visoka')
hijerarhija_v <- c('niska', 'srednja', 'visoka')
pon_f <- factor(pon_v, order=T, levels=hijerarhija_v)
uto_f <- factor(uto_v, order=T, levels=hijerarhija_v)
pon_f > uto_f
- TRUE
- FALSE
- FALSE
Primjećujemo da je uspoređivao svaki element pojedinačno.
Zadatak
Kreirajte uređeni faktor x s vrijednostima 'lijevo', 'desno', 'desno', 'lijevo'.
Postavite hijerarhiju na 'lijevo' < 'desno'
Usporedite vrijednosti prvog i drugog člana tog faktora.
x <- factor(c("lijevo", "desno", "desno", "lijevo"), order=T, levels = c("lijevo", "desno"))
x
x[1]>x[2]
- lijevo
- desno
- desno
- lijevo
Levels:
- 'lijevo'
- 'desno'
Broj razina faktora.¶
Razina može biti i više nego što ih je prikazano u faktoru, na primjer:
y <- factor(c("lijevo", "desno", "desno", "lijevo"), levels = c("lijevo", "sredina", "desno"))
y
- lijevo
- desno
- desno
- lijevo
Levels:
- 'lijevo'
- 'sredina'
- 'desno'
Ako želimo saznati broj razina nekoga faktora, koristimo funkciju length()
.
length(levels(y))
Da bi prikazali korištene razine nekog faktora korisititi ćemo unique()
.
unique(y)
length(unique(y))
- lijevo
- desno
Levels:
- 'lijevo'
- 'sredina'
- 'desno'
Zadatak
Kreirajte uređeni faktor red
s vrijednostima:
'četiri', 'jedan', 'dva', 'četiri', 'dva', 'dva'
Usporedite drugi i treći član ovoga faktora.
Koji je "veći"?
Koji je veći ako usporedimo prvi i drugi član?
red<-factor(c('četiri', 'jedan', 'dva', 'četiri', 'dva','dva'), order=T)
red[2]>red[3]
Zaključujemo da je 'jedan' veći od 'dva'.
Zašto?
Ispišite faktor.
Koji je redoslijed (poredak, levels) klasa u njemu?
red
- četiri
- jedan
- dva
- četiri
- dva
- dva
Levels:
- 'četiri'
- 'dva'
- 'jedan'
Poredak klasa u vektoru (levels) je napravljen abecedno.
Poredajte klase u ovom vektoru da odgovaraju stvarnosti.
red <- factor(red, order=T, levels=c('jedan','dva','četiri'))
red
red[2]>red[3]
- četiri
- jedan
- dva
- četiri
- dva
- dva
Levels:
- 'jedan'
- 'dva'
- 'četiri'
Sada je 'jedan' manji od 'dva' što je u redu.
Mijenjanje vrijednosti faktora.¶
U faktoru red
izmijenite prvi član u 'jedan', a zatim ga ispišite.
red[1]='jedan'
red
- jedan
- jedan
- dva
- četiri
- dva
- dva
Levels:
- 'jedan'
- 'dva'
- 'četiri'
Sada za šestog člana tog faktora postavite vrijednost 'tri'.
red[6]='tri'
red
Warning message in `[<-.factor`(`*tmp*`, 6, value = "tri"): “invalid factor level, NA generated”
- jedan
- jedan
- dva
- četiri
- dva
- <NA>
Levels:
- 'jedan'
- 'dva'
- 'četiri'
Program će javiti grešku, ali će ipak izmijeniti 6. vrijednost faktora.
No, neće ju promijeniti u vrijednost 'tri' već u '<NA>'.
Faktoru možemo dodavati samo vrijednosti klase koje već postoje u njemu.
Dakle, u faktor red
trebamo dodati vrijednost klase 'tri'.
levels(red)=c('jedan', 'dva', 'tri', 'četiri')
levels(red)
red
- 'jedan'
- 'dva'
- 'tri'
- 'četiri'
- jedan
- jedan
- dva
- tri
- dva
- <NA>
Levels:
- 'jedan'
- 'dva'
- 'tri'
- 'četiri'
Brojevi kao članovi faktora¶
Faktori mogu biti i u obliku brojeva, međutim sustav ih doživljava samo kao nazive kategorija te se s takvim brojevima ne mogu obavljati matematičke operacije.
brojevi=factor(c(7, 1, 5, 2, 4, 12))
brojevi
- 7
- 1
- 5
- 2
- 4
- 12
Levels:
- '1'
- '2'
- '4'
- '5'
- '7'
- '12'
Probajte zbrojiti drugi i peti član faktora brojevi
.
brojevi[2]+brojevi[5]
Warning message in Ops.factor(brojevi[2], brojevi[5]): “‘+’ not meaningful for factors”
To se ne može raditi s faktorima. Članovi faktora su samo instance klasa.
Da bi ih mogli korisiti kao brojeve, koristimo funkcije as.numeric()
i as.character()
.
Na primjer ako uzmeno neki tekstualni vektor c('1','5','2')
da bi pretvorili karaktere u brojeve, koristit ćemo as.numeric(c('1','5','2')
.
a=c('1','5','2')
a[1]+a[2] #će javiti grešku
Error in a[1] + a[2]: non-numeric argument to binary operator Traceback:
a=c('1','5','2')
a<-as.numeric(a)
a[1]+a[2] #će raditi ispravno
Zadatak:
Koristeći funkciju as.numeric
pretvorite faktor brojevi u vektor brojeva naziva br.
A zatim zbrojite prva dva člana tog vektora.
br=as.numeric(brojevi)
br[1]+br[2]
Ovaj put nismo dobili grešku, ali nismo dobili niti točan rezultat.
U čemu je stvar?
Ispišite vektor br.
br
- 5
- 1
- 4
- 2
- 3
- 6
Funkcija as.numeric(neki_faktor)
nam vraća samo redne brojeve razina u redoslijedu u kojem se nalaze u faktoru.
Dakle, ovaj vektor prvo moramo pretvoriti u tekstualni, a zatimu u numerički.
Zvuči komplicirano, ali to tako funkcionira.
brojevi
br=as.character(brojevi)
br
br=as.numeric(br)
br
br[1]+br[2]
- 7
- 1
- 5
- 2
- 4
- 12
Levels:
- '1'
- '2'
- '4'
- '5'
- '7'
- '12'
- '7'
- '1'
- '5'
- '2'
- '4'
- '12'
- 7
- 1
- 5
- 2
- 4
- 12