6 Jednodimenzionalni tip podataka

6.1 Kreiranje vektora

U ovom poglavlju objašnjava se kreiranje vektora. Poglavlje pokriva različite načine kreiranja vektora, od ručnog unosa elemenata do korištenja ugrađenih funkcija za generiranje sekvenci, ponavljanja vrijednosti i kreiranja slučajnih brojeva temeljenih na teorijskim distribucijama.

Vektor je uređeni niz koji nastaje pridruživanjem elemenata. Uređeni niz znači da je redno mjesto elementa fiksno i da se pozivom određenog rednog mjesta element može identificirati. Nadalje, važno je znati da elementi moraju biti istog tipa. Ako elementi nisu istog tipa, tada se radi o listi (više o tome kasnije), a ne vektoru.

Jedna od ključnih karakteristika vektora u R-u je da svi elementi unutar vektora moraju biti istog tipa. Ako se pokuša kombinirati elemente različitih tipova, R će implicitno promijeniti tip podataka elemenata u vektoru kako bi osigurao homogenost. Na primjer, kombiniranje numeričkih i znakovnih tipova rezultirat će vektorom znakovnog tipa, što može dovesti do neočekivanih rezultata ili grešaka u kasnijim analizama.

U R-u, vektor je jednodimenzionalni tip podataka, ali zbog fleksibilnosti R-ovog sustava, različita tumačenja mogu stvoriti konfuziju. Dakle, vektor u R-u je jednostavan niz elemenata iste vrste (npr. numerički, logički, karakterni) i nema dodatne dimenzije osim dužine. Svaki element ima indeks (poziciju) koji se koristi za pristup elementima. Ipak, R omogućuje pridruživanje atributa dimenzija (dim()) vektoru, što ga pretvara u n-dimenzionalni niz, ali tad vektor postaje matrica ili array. U strogo tehničkom smislu, vektor u R-u je jednodimenzionalan. Dodavanjem dimenzija (dim() atributa) vektor u R-u se preoblikuje i postaje matrica (za 2 dimenzije) ili polje (array, za 3 ili više dimenzije), ali njegova osnovna struktura u memoriji ostaje vektor. Dodavanje atributa dimenzije zapravo mijenja način na koji se interpretira i pristupa elementima. No, time ćemo se baviti u poglavlju o višedimenzionalnim tipovima podataka.

6.1.1 Kreiranje vektora koristeći izravan upis elemenata

Elementi se pridružuju vektoru koristeći funkciju combine, c(). Primjer kreiranja vektora:

> a <- c(1, 2, 3, 4, 5)
> b <- c(5, 10, 15, 20, 25)
> c <- c("Pula", "Rijeka", "Zagreb", "Osijek", "Split")
> d <- c("Iva", "Ana", "Maja", "Marko", "Ivan")
> e <- c(TRUE, TRUE, TRUE, FALSE, FALSE)

Vektori koji predstavljaju kvalitativne varijable ili kategorijske podatke (kao što su vektori c ili e) u R-u često se koriste kao faktori kada je potrebno analizirati ili modelirati kategorijske varijable. Međutim, sami faktori rijetko su korisni; obično se koriste u kombinaciji s drugim numeričkim ili logičkim podacima kako bi se omogućila dublja analiza ili vizualizacija povezanosti između različitih vrsta podataka. Zbog toga ćemo se faktorima detaljnije baviti tek na kraju sljedećeg poglavlja, nakon što savladamo višedimenzionalne tipove podataka.

Ispis vektora vršimo upisom naziva vektora ili pomoću funkcije print().

> print(a)
## [1] 1 2 3 4 5

No, ispis je moguć i samo pozivom naziva vektora:

> b
## [1]  5 10 15 20 25

ili

> c
## [1] "Pula"   "Rijeka" "Zagreb" "Osijek" "Split"

Također, možemo opaziti da neće biti razlike u načinu ispisa s obzirom na to koristi li se print() ili samo naziv.

> print(d)
## [1] "Iva"   "Ana"   "Maja"  "Marko" "Ivan"
> e
## [1]  TRUE  TRUE  TRUE FALSE FALSE

6.1.2 Vektor indeksa

Vektor koji sadrži redoslijedne cijele brojeve kao elemente naziva se i vektor indeksa, zbog toga što vrijednosti elemenata odgovaraju rednim mjestima. Takvi se vektori ponekad koriste kao pomoćna radnja pri izračunima.

> f <- 1:100
> f
##   [1]   1   2   3   4   5   6   7   8   9  10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38
##  [39]  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76
##  [77]  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99 100

6.1.3 Kreiranje vektora cjelobrojnih vrijednosti u zadanom intervalu

Ponekad je potrebno kreirati duži vektor, pa čak i uz neke specifične karakteristike te bi ručni upis bio prezahtjevan. Tada su sljedeće mogućnosti vrlo korisne.

> f <- 100:200
> f
##   [1] 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
##  [39] 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175
##  [77] 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200

Prethodnom naredbom kreira se vektor koji sadrži sve cjelobrojne vrijednosti između 100 i 200, uključujući 100 i 200. Na takav način mogu se kreirati vektori koji će sadržavati cijele brojeve u bilo kojem rasponu.

6.1.4 Kreiranje sekvencijskih vektora

> g<-seq(1, 200, by=3)
> g
##  [1]   1   4   7  10  13  16  19  22  25  28  31  34  37  40  43  46  49  52  55  58  61  64  67  70  73  76  79  82  85  88  91  94  97 100 103 106 109 112 115
## [40] 118 121 124 127 130 133 136 139 142 145 148 151 154 157 160 163 166 169 172 175 178 181 184 187 190 193 196 199

Prethodnom funkcijom generiran je vektor g, kojemu je prva vrijednost 1, a svaka sljedeća vrijednost je treća po redu, do 200. Promjenom parametara može se kontrolirati izlaz. Na primjer, seq(5,10,2) rezultirat će vektorom koji će sadržavati vrijednosti 5, 7 i 9.

6.1.5 Kreiranje vektora s ponovljenim vrijednostima

> h<-rep(c(1, 5, 10), times=2)
> h
## [1]  1  5 10  1  5 10

Prethodnom funkcijom kreiran je vektor temeljem replikacije zadanog vektora c(1, 5, 10), na način da se ponavlja dva puta. Umjesto times=2, moguće je koristiti, na primjer, each=2, pri čemu se svaka vrijednost ponavlja dva puta (1, 1, 5, 5, 10, 10), ili npr. length.out=7, pri čemu kreira vektor duljine 7 na način da se niz vrijednosti ponavlja dok se ne dosegne sedam elemenata. Isprobajte sami.

U situacijama u kojima je potrebno kreirati vektor koji sadrži elemente koji se ponavljaju, to se može učiniti koristeći naredbu rep(). Naredba rep() ima dva argumenta. Prvi argument je broj ili znak koji se ponavlja, a drugi označava koliko će se puta taj broj ili znak ponoviti.

> m <- c(rep(2, 4), rep(0, 2), rep(5, 3))
> m
## [1] 2 2 2 2 0 0 5 5 5

Ovo može biti korisno, na primjer, u linearnom programiranju gdje je potrebno definirati vektor smjera ograničenja u linearnom programu.

> m <- c(rep("<=", 3), rep(">=", 4), "=")
> m
## [1] "<=" "<=" "<=" ">=" ">=" ">=" ">=" "="

6.1.6 Kreiranje vektora koristeći teorijske distribucije vjerojatnosti/ generator slučajnih brojeva

U nekim analizama, bit će potrebno kreirati vektore temeljem teorijskih distribucija vjerojatnosti. U paketu stats koji je dio osnovnog R okruženja, za kreiranje vektora vezanih uz kreiranje slučajnih brojeva uz pomoć teorijskih distribucija vjerojatnosti. rnorm() je generator slučajnih brojeva baziran na normalnoj distribuciji i jedan je od najčešće korištenih generatora slučajnih brojeva.

Na primjer, ako se želi kreirati vektor koji će sadržavati 100 elemenata koji se ravnaju prema normalnoj distribuciji s prosjekom 55 i standardnom devijacijom 5, to je moguće učiniti na sljedeći način:

> norm <- rnorm(1000, 55, 5)
> glimpse(norm)
##  num [1:1000] 55.5 48.9 61.9 45.7 53.8 ...
> mean(norm)
## [1] 55
> sd(norm)
## [1] 4.9

Nalik ovom primjeru, moguće je kreirati vektore koji se ravnaju i prema drugim teorijskim distribucijama. Među najčešće korištenima su runif(), koji funkcionira kao generator slučajnih brojeva baziran na uniformnoj distribuciji, rbinom() na binomnoj distribuciji, rpois() na Poissonovoj distribuciji, rchisq() na Hi-kvadrat distribuciji, rf() na F-distribuciji, rbeta() na beta distribuciji, rgamma() na gamma distribuciji. Pri korištenju funkcija kao što su runif() ili rnorm(), važno je razumjeti distribuciju iz koje se uzorkuje.

U situacijama u kojima vektor odražava vjerojatnosti, često će se koristiti uniformna distribucija pri kreiranju vektora. Pritom će biti potrebno definirati minimum i maksimum raspona u kojem se generiraju vrijednosti, a ako se žele generirati vrijednosti koje predstavljaju vjerojatnosti, onda će biti \(min=0\) i \(max=1\). Osim toga, potrebno je odrediti koliko je brojeva potrebno kreirati.

> unif <-runif(50, 0, 1)
> unif
##  [1] 0.243 0.055 0.226 0.807 0.691 0.892 0.766 0.844 0.154 0.550 0.280 0.979 0.770 0.947 0.403 0.064 0.810 0.339 0.443 0.302 0.694 0.580 0.637 0.989 0.343 0.088
## [27] 0.313 0.033 0.086 0.973 0.671 0.213 0.732 0.770 0.486 0.163 0.317 0.279 0.564 0.331 0.645 0.641 0.762 0.562 0.401 0.496 0.294 0.049 0.640 0.813

6.2 Rad s vektorima

U ovom poglavlju objašnjavaju se osnovne operacije s vektorima u R-u, uključujući spajanje, sortiranje i manipulaciju elemenata, kao i izračun osnovnih statističkih pokazatelja. Također se uvode koncepti poput dodavanja atributa, recikliranja elemenata i logičkih upita, omogućujući korisnicima fleksibilnu manipulaciju podacima. Na kraju, poglavlje daje praktične primjere za usporedbu i obradu podataka unutar vektora, što je ključno za efikasnu analizu.

6.2.1 Spajanje vektora

Vektori se mogu spojiti, a rezultat će predstavljati jedan niz podataka, pri čemu redoslijed vektora uvjetuje redoslijed podataka u nizu. Za spajanje vektora također se koristi c().

> i <- c(a, b)
> i
##  [1]  1  2  3  4  5  5 10 15 20 25
> j <- c(b, a)
> j
##  [1]  5 10 15 20 25  1  2  3  4  5

Obratite pozornost na to da vektori i i j nisu jednaki. Također, vektori se mogu sastojati od elemenata tipa character, na primjer:

> k <- c(c, d)
> k
##  [1] "Pula"   "Rijeka" "Zagreb" "Osijek" "Split"  "Iva"    "Ana"    "Maja"   "Marko"  "Ivan"

6.2.2 Sortiranje elemenata vektora

U specifičnim situacijama u kojima nam je važno znati na kojim se pozicijama nalaze elementi s obzirom na svoju vrijednost, može pomoći funkcija order(). Ova funkcija neće posložiti elemente redom (sjetite se da je vektor uređeni niz podataka), nego će vratiti niz rednih mjesta koje bi elementi trebali zauzeti ako bi bili poredani po veličini.

> ord <- order(j)
> ord
##  [1]  6  7  8  9  1 10  2  3  4  5

Ako je elemente vektora potrebno sortirati, koristi se funkcija sort(). Funkcija sort učinit će ono što njezin naziv govori, sortirat će podatke. Vodite računa o tome da, ako upišete npr. sort(j), elementi vektora j bit će ispisani redoslijedno, ali samo ispisani - neće biti sačuvani. Ako želite sačuvati sortirane elemente vektora, onda morate te elemente pripisati novom objektu, tj. vektoru (u ovom slučaju to je ord). Sličan se pristup koristi svugdje u ovoj lekciji. Ipak, vidjet ćete naknadno, neće biti potrebno uvijek koristiti ovaj pristup, a ponekad je i nepoželjno zbog kreiranja velikog broja varijabli s kojima se kasnije teško snaći.

> j_sort <- sort(j)
> j_sort
##  [1]  1  2  3  4  5  5 10 15 20 25

6.2.3 Tip vektora

Za ispitivanje tipa vektora također se može koristiti typeof(). U slučaju kombinacije elemenata različitih tipova, tip vektora preuzet će tzv. „jači” tip podataka, pri čemu je odnos tipova podataka:

\[logical \to integer \to double \to character\]

Što to znači? Na primjer, ako niz podataka sadrži makar jednu character vrijednost, tada će tip tog niza podataka poprimiti tip character.

> typeof(a)
## [1] "double"
> typeof(k)
## [1] "character"

Vektor a je tip double, a vektor k je character. Njihovim spajanjem dobiva se vektor koji sadrži brojeve i znakove, ali će takav vektor (y) biti identificiran kao tip character, a ne double.

> y <- c(a, k)
> typeof(y)
## [1] "character"

6.2.4 Dodavanje atributa

Pod dodavanjem atributa najčešće se misli na dodavanje naziva stupcima i recima (zaglavlja i predstupci u tablicama).

Na primjer, ako je zadan vektor

> l <- c("Poslovna analitika", 6, 2, 1, 1, "T")
> length(l)
## [1] 6

elementima vektora mogu se pridružiti nazivi:

> names(l) <- c("kolegij", "ECTS", "Sati predavanja", 
+               "Sati vježbi", "Sati seminara", "Obavezan")

provjerite kako sad izgleda vektor l.

> l
##              kolegij                 ECTS      Sati predavanja          Sati vježbi        Sati seminara             Obavezan 
## "Poslovna analitika"                  "6"                  "2"                  "1"                  "1"                  "T"

Ako se osim naziva dodaju bilo kakvi dodatni atributi, tada više neće biti prepoznat kao vektor (ako provjeravate npr. funkcijom is.vector()). Ipak, moguće je dodavati i dodatne atribute, ako za to postoji opravdani razlog i ako za daljnju analizu nije nužno da niz bude prepoznat kao vektor. Tada se to čini funkcijom attr().

> attr(l, "studij") <- "Informatički menadžment"
> l
##              kolegij                 ECTS      Sati predavanja          Sati vježbi        Sati seminara             Obavezan 
## "Poslovna analitika"                  "6"                  "2"                  "1"                  "1"                  "T" 
## attr(,"studij")
## [1] "Informaticki menadžment"

6.2.5 Duljina vektora

Duljina vektora ispituje se pomoću length(). Ako ispitate duljinu vektora l prije i nakon dodavanja naziva, vidjet ćete da se duljina vektora nije promijenila.

> length(l)
## [1] 6

6.2.6 Odabir elemenata vektora

Također, ponekad je potrebno odabrati pojedini element vektora, uobičajeno se to čini s uglatim zagradama, [ ]. Na primjer:

> a[1]
## [1] 1

selektira element koji se nalazi na prvom mjestu u vektoru a, ili na primjer,

> i[7]
## [1] 10

selektira element koji se nalazi na 7 mjestu u vektoru i.

Pokušaj pristupa elementu vektora koji ne postoji, kao što je i[100] za vektor i, rezultirat će ispisom NA (engl. Not Available) umjesto greške.

> i[100]
## [1] NA

Moguće je odabrati i nekoliko elemenata istovremeno, na primjer:

> j[c(2, 5, 8)]
## [1] 10 25  3

odnosno elemente na drugom, petom i osmom mjestu u vektoru j. Nadalje,

> j[3:7]
## [1] 15 20 25  1  2

odabire sve elemente koji se nalaze na mjestima od trećeg do sedmog, uključujući elemente na trećem i sedmom mjestu.

Osim toga, može se koristiti i funkcija seq(), na primjer:

> j[seq(1, 10, by=2)]
## [1]  5 15 25  2  4

Izraz j[seq(1, 10, by=2)] odabire elemente iz vektora j koristeći sekvencu indeksa generiranu funkcijom seq(1, 10, by=2). Ova funkcija stvara sekvencu brojeva od 1 do 10 u koracima od 2 (tj. 1, 3, 5, 7, 9), pa izraz dohvaća elemente j s tim indeksima, birajući svaki drugi element unutar prvih 10 elemenata vektora.

6.2.7 Zamjena i brisanje elemenata vektora

Osim provjere, to jest, odabira pojedinih elemenata vektora, ponekad je potrebno zamijeniti određene vrijednosti. Na primjer, neka je zadan vektor m,

> m <- c(2, 20, 3, 5, "o", 6, "k", 10, 35, 22)
> typeof(m)
## [1] "character"

Vektor m je trenutno tipa character, možete provjeriti i s is.character(m). Ako je za daljnju obradu potrebno da vektor bude definiran kao integer ili double, može se uočiti da elementi „o” i „k” priječe u tome da vektor bude tako identificiran. Može se pretpostaviti da je umjesto „o“ trebala biti zapisana nula, pa se može izvršiti zamjena elementa:

> m[5] <- 0
> m
##  [1] "2"  "20" "3"  "5"  "0"  "6"  "k"  "10" "35" "22"

Za element „k“ ne može se pretpostaviti koji je broj trebao zamijeniti, pa je jedna od mogućnosti brisanje elementa:

> m <- m[-7]
> m
## [1] "2"  "20" "3"  "5"  "0"  "6"  "10" "35" "22"

Drugi način brisanja elementa je m[[7]] <- NULL. Obratite pozornost da se nakon ove operacije mijenja duljina vektora, length(m).

6.2.8 Operacije na vektorima

Na vektorima je moguće vršiti određene operacije, na primjer:

> #vektor a zabilježen je kao objekt i nalazi se u gornjem desnom prozoru, Environment. Tamo možete provjeriti koje elemente sadrži vektor a, kako bi popratili sljedeći niz operacija. 
> 
> a * 3
## [1]  3  6  9 12 15

Zbrajanje elementa 5 s vektorom a rezultirat će uvećanjem svakog elementa vektora a za 5.

> a + 5
## [1]  6  7  8  9 10

Kvadriranje vektora rezultirat će vektorom koji sadrži kvadrate elemenata vektora a.

> a^2
## [1]  1  4  9 16 25

Moguće je izvršiti i kombinaciju operacija. Na primjer, \(a \cdot 2 + 3\) rezultirat će vektorom u kojem je svaki element vektora a pomnožen s dva i uvećan za tri.

> a * 2 + 3
## [1]  5  7  9 11 13

R će poštivati prioritete računskih operacija, pa će tako u sljedećem primjeru prvo riješiti zagradu, a potom rezultat pomnožiti sa svakim elementom vektora a.

> a * (2 + 3)
## [1]  5 10 15 20 25

Moguće je vektore množiti međusobno. No tad treba voditi računa o tome da će se izmnožiti samo elementi na pripadajućim pozicijama. Dakle, prvi element u vektoru a s prvim elementom vektora b, pa drugi element vektora a s drugim elementom vektora b, itd.

> a * b
## [1]   5  20  45  80 125

Na sličan će se način vektori zbrajati. Dakle, zbrajanje vektora je moguće, a rezultat će biti novi vektor koji sadrži elemente zbroja vrijednosti elemenata a i b na odgovarajućim pozicijama.

> a + b
## [1]  6 12 18 24 30

6.2.9 Izračun pokazatelja deskriptivne statistike vektora

Za vektore je moguće izračunati i neke osnovne statističke podatke, koristeći fivenum() (Tuckeyevih pet brojeva), sum(), min(), max(), mean().

Tuckeyevih pet brojeva su minimum, prvi kvartil, medijan, treći kvartil i maksimum.

> fivenum(j)
## [1]  1  3  5 15 25

Minimum se može utvrditi i pozivom naredbe min().

> min(j)
## [1] 1

Maksimalna vrijednost u vektoru može se utvrditi i pozivom naredbe max().

> max(j)
## [1] 25

Naredba mean() utvrđuje aritmetičku sredinu vektora.

> mean(j)
## [1] 9

Naredba median() utvrđuje medijalnu vrijednost u nizu (medijan).

> median(j)
## [1] 5

Također, možemo utvrditi i total tako što ćemo zbrojiti sve vrijednosti u nizu. Drugim riječima, vektore možemo tretirati kao varijable.

> sum(j)
## [1] 90

Naredba summary() uz Tuckeyevih pet brojeva uključuje i prosjek.

> summary(j)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     1.0     3.2     5.0     9.0    13.8    25.0

Također, za ranije kreirani vektor norm možemo provjeriti ravna li se prema pretpostavljenoj distribuciji \(N(55,5)\).

> mean(norm)
## [1] 55
> sd(norm)
## [1] 4.9

Važno je napomenuti da funkcije kao što su mean(), sum() i median() neće ispravno raditi na vektorima koji sadrže znakovne tipove ili vrijednosti koje nedostaju (NA). Kako bi se to izbjeglo, korisno je provjeriti vektor prije primjene ovih funkcija ili koristiti argumente poput na.rm = TRUE za ignoriranje NA vrijednosti.

> typeof(j)
## [1] "double"
> summary(is.na(j))    # sažetak provjere svih vrijednosti u vektoru sadrže li NA
##    Mode   FALSE 
## logical      10
> mean(j, na.rm = TRUE)
## [1] 9

Funkcija typeof(j) vraća tip podataka elemenata unutar vektora j. U ovom slučaju, ispis [1] “double” ukazuje na to da vektor j sadrži elemente tipa double, što znači da su to cijeli ili decimalni brojevi.

Naredba summary(is.na(j)) koristi se za sažimanje rezultata provjere o prisutnosti NA vrijednosti unutar vektora j. Funkcija is.na(j) vraća logički vektor iste duljine kao j, gdje su vrijednosti TRUE za elemente koji su NA i FALSE za one koji nisu NA. summary() zatim daje brojčani sažetak ovog logičkog vektora, pri čemu se prikazuje koliko ima FALSE i koliko TRUE vrijednosti. U ovom slučaju, svi elementi vektora j su valjani, što znači da nema vrijednosti koje nedostaju (FALSE).

mean(j, na.rm = TRUE) izračunava aritmetičku sredinu elemenata unutar vektora j. Argument na.rm = TRUE uvjetuje ignoriranje NA vrijednosti prilikom izračuna. To je važno samo ako vektor sadrži NA vrijednosti. Međutim, s obzirom da u vektoru j nema NA vrijednosti, ovaj argument tehnički nije bio potreban. Rezultat [1] 9 označava da prosjek elemenata vektora j iznosi 9.

Ukratko, ove naredbe pokazuju kako provjeriti tip podataka vektora, identificirati i sumarizirati prisutnost nedostajućih podataka te sigurno izračunati osnovne statističke mjere poput prosjeka, uzimajući u obzir moguću prisutnost NA vrijednosti.

6.2.10 Recikliranje vektora

Nadalje, moguće je vršiti neke računske operacije čak i ako vektori nisu jednakih duljina, na primjer:

> j + a
##  [1]  6 12 18 24 30  2  4  6  8 10
> j * a
##  [1]   5  20  45  80 125   1   4   9  16  25
> j / a
##  [1] 5 5 5 5 5 1 1 1 1 1

a proces kojim se to postiže je tzv. recikliranje, pri čemu se redoslijedno ponavljaju elementi kraćeg vektora dok se ne izvrši računska operacija s posljednjim elementom duljeg vektora.

6.2.11 Usporedba vektora

Nadalje, vektore je moguće uspoređivati, pri čemu će izlaz predstavljati niz elemenata logičkog tipa, na primjer:

> a > j
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
> j != a
##  [1]  TRUE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE
> a == j
##  [1] FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE

6.2.12 Logički upiti

Na vektorima je moguće vršiti i logičke upite te na taj način odabirati elemente. Na primjer,

> d[e]
## [1] "Iva"  "Ana"  "Maja"
> b > 3
## [1] TRUE TRUE TRUE TRUE TRUE
> b[b > 3]
## [1]  5 10 15 20 25
> n <- c(TRUE, FALSE, FALSE)
> i[n]
## [1]  1  4 10 25

ovaj posljednji primjer, osim logičkog upita, koristi i princip recikliranja, a rezultat je svaki treći element vektora i.

Prije nego nastavite, obratite pozornost na Environment. Svi kreirani objekti, nalaze se na popisu, uz navođenje tipa, duljine i ispisa prvih nekoliko elemenata.

Pitanja za ponavljanje

  1. Koji je rezultat sljedeće naredbe: c <- c(3, 5, “text,” TRUE)? Objasnite zašto dolazi do takvog rezultata.

  2. Kako biste kreirali vektor v koji sadrži brojeve od 20 do 50, s razmakom od 5 cijelih brojeva između svakih dviju vrijednosti?

  3. Navedite razliku između rep(x, times=3) i rep(x, each=3). Koji bi bio rezultat za x <- c(1, 2, 3)?

  4. Ako definirate a <- c(10, 20, 30, 40, 50) i b <- c(5, 15, 25, 35, 45), koji je rezultat a + b?

  5. Koristite funkciju rnorm() da generirate 10 slučajnih brojeva iz normalne distribucije s prosjekom 50 i standardnom devijacijom 10. Napišite kod.

  6. Kreirajte vektor koji sadrži sekvencu brojeva od 1 do 100, a svaki peti broj mora biti 0.

  7. Koji je rezultat sljedeće naredbe: rep(c(2, 4), each=3, times=2)? Objasnite što se dešava u naredbi.

  8. Upotrijebite funkciju runif() za generiranje 5 brojeva između 0 i 1. Koje su glavne karakteristike takve distribucije?

  9. Zašto se preporučuje da svi elementi vektora budu istog tipa? Što će se dogoditi ako c(1, “string,” TRUE) definirate kao vektor?

  10. Objasnite rezultat funkcije seq(5, 15, by=2). Koliko elemenata se kreira u ovom slučaju?

  11. Što je rezultat sljedeće naredbe: c(5, 10, 15) + c(2, 4)? Objasnite kako se odvija proces recikliranja elemenata.

  12. Ako su a <- c(3, 5, 7, 9) i b <- c(2, 4, 6, 8), koji je rezultat a > b? Koje vrijednosti sadrži izlaz?

  13. Koji je rezultat naredbe sort(c(8, 3, 5, 1, 9), decreasing = TRUE)? Kako biste pohranili rezultat u novi vektor?

  14. Ako je x <- c(20, NA, 15, NA, 10), kako biste izračunali prosječnu vrijednost elemenata vektora ignorirajući NA vrijednosti?

  15. Definirajte vektor y <- c(“R,” “Studio,” “Analysis”) i dodajte naziv svakom elementu koristeći names(). Kako biste pristupili vrijednosti s nazivom “Studio?”

  16. Koji je rezultat order(c(3, 8, 2, 7))? Što znači povratna vrijednost ove funkcije?

  17. Ako je z <- c(4, 9, 12, 5, 7), koji elementi će biti odabrani naredbom z[z > 6]? Što ova sintaksa postiže?

  18. Kreirajte vektor v <- c(“A,” “B,” “C,” “A,” “D,” “B”). Koristite unique() za pronalaženje jedinstvenih vrijednosti u v. Koji rezultat očekujete?

  19. Ako su p <- c(1, 2, 3, 4, 5) i q <- c(10, 20, 30), koji je rezultat p * q? Objasnite što se događa zbog recikliranja elemenata.

  20. Kako biste uklonili treći element iz vektora k <- c(2, 4, 6, 8, 10)? Koji će biti novi sadržaj vektora nakon te operacije?

6.3 Kreiranje faktora

U ovom poglavlju objašnjava se kreiranje i primjena faktora, koji se u R-u u pravilu koriste za reprezentaciju kvalitativnih varijabli (opisnih i stupnjevitih), mjerenih na nominalnoj ili ordinalnoj razini. Poglavlje pokriva načine kreiranja faktora, definiranje razina s poretkom, te postupke za pretvorbu faktora u druge tipove podataka, što je često korisno pri radu s podacima dobivenim putem anketa. Dodatno, ukazat će se na česte greške, poput neadekvatne pretvorbe faktora u numeričke vrijednosti, kako bismo mogli izbjeći nesporazume pri analizi i interpretaciji podataka.

Faktori predstavljaju kvalitativne varijable (opisne i stupnjevite, mjerene na nominalnoj i ordinalnoj ljestvici), a sastoje se od određenog broja razina (engl. level; poprimaju konačan broj unaprijed definiranih vrijednosti). Razine ili leveli mogu se uraditi na način da postoji poredak. U nekim izvorima naići ćete da se faktor tretira kao tip podataka, ali je pravilnije o njima razmišljati kao o vrsti varijabli. Kreiraju se pomoću funkcije factor(). Elemente je moguće kombinirati putem c(), a moguće je i postojeće vektore pretvoriti u faktore.

> Faktor1 <- factor(c("Plava", "Crvena", "Zelena", "Crna"))
> Faktor1
## [1] Plava  Crvena Zelena Crna  
## Levels: Crna Crvena Plava Zelena
> Faktor2 <- factor(d)
> Faktor2
## [1] Iva   Ana   Maja  Marko Ivan 
## Levels: Ana Iva Ivan Maja Marko

U navedena dva primjera radi se o nominalnim varijablama, kod kojih poredak nije moguće utvrditi. Za stupnjevite varijable, kao što je, na primjer, završena razina obrazovanja, možemo utvrditi poredak, a isti može biti relevantan pri daljnjim analizama. U takvom slučaju, faktor se može zadati na sljedeći način:

> r <- c("Osnovna škola", "Srednja škola", "Fakultet")
> Faktor3 <- factor(r, levels = r, ordered = TRUE)
> Faktor3
## [1] Osnovna škola Srednja škola Fakultet     
## Levels: Osnovna škola < Srednja škola < Fakultet

Ako se pri zadavanju vektora doda ordered=TRUE bez specifikacije razina, tada će elementi biti poredani po abecedi ili po veličini.

> Faktor4 <- factor(a, ordered = TRUE)
> Faktor4
## [1] 1 2 3 4 5
## Levels: 1 < 2 < 3 < 4 < 5

Ako faktor želimo pretvoriti natrag u numerički tip varijable, to je moguće učiniti na sljedeći način:

> num <- as.numeric(Faktor4)
> num
## [1] 1 2 3 4 5

Isto bi funkcioniralo i da je upotrijebljena funkcija as.double(), odnosno za cjelobrojne vrijednosti as.integer(), ili as.character() za znakovne elemente. Provjera:

> typeof(num)
## [1] "double"

Još nekoliko primjera.

> chr <- as.character(Faktor3)
> chr
## [1] "Osnovna škola" "Srednja škola" "Fakultet"
> #obratite pozornost na ovaj primjer
> Faktor6 <- factor(h)
> Faktor6
## [1] 1  5  10 1  5  10
## Levels: 1 5 10
> num2 <- as.numeric(Faktor6)
> num2
## [1] 1 2 3 1 2 3

U ovom primjeru može se uočiti da je pretvorbom u numeričku varijablu zapravo sačuvan niz rednih mjesta razina Faktora 6, a ne vrijednosti opažanja. To znači da je potrebno napraviti dodatnu promjenu, prvo u znakovni tip, a onda u numerički tip varijable.

> num2 <- as.numeric(as.character(Faktor6))
> num2
## [1]  1  5 10  1  5 10

Iz ovog primjera možemo uočiti da je izuzetno važno provjeriti rezultat nakon svake izvršene promjene, osobito u početku dok još niste u potpunosti sigurni čemu služi koja funkcija.

Moguće je i pojedinu varijablu iz postojećeg podatkovnog okvira pretvoriti u faktor, no o tome više u poglavlju posvećenom podatkovnim okvirima.

Dodavanje razina postojećem faktoru:

> levels(Faktor3) <- c(levels(Faktor3), "Doktorat")
> Faktor3
## [1] Osnovna škola Srednja škola Fakultet     
## Levels: Osnovna škola < Srednja škola < Fakultet < Doktorat

Faktori su izuzetno korisni za analizu odgovora anketnih podataka, gdje su najčešće odgovori na pitanja o demografskim karakteristikama zapisani kao opisne ili stupnjevite varijable. Osim toga, mnogi statistički modeli u R-u zahtijevaju faktore za kategoričke prediktorne varijable kako bi ispravno interpretirali kategorije. Pri vizualizaciji podataka, faktori omogućuju kontrolu nad redosljedom prikaza kategorija, što može biti ključno za jasnoću grafikona.

6.4 Najčešće greške pri kreiranju i radu s faktorima

  • Neadekvatno upravljanje razinama: Jedna od najčešćih grešaka nastaje pri dodavanju novih elemenata u faktor, pri čemu ti elementi nisu prepoznati kao postojeće razine. R će automatski dodijeliti NA novim elementima koji nisu definirani kao razine faktora.

  • Pretvorba u numeričke vrijednosti: Direktna pretvorba faktora u numeričke vrijednosti (as.numeric(faktor)) može rezultirati vrijednostima koje predstavljaju oznake razina, a ne pridružene stvarne numeričke vrijednosti. Ispravan način je prvo pretvoriti faktor u znakovni niz, a zatim u numeričke vrijednosti.

  • Zanemarivanje poretka za uređene faktore: Pri radu s uređenim faktorima, važno je pravilno postaviti i koristiti poredak, jer to utječe na analizu i vizualizaciju podataka.

Pitanja za ponavljanje

  1. Što su faktori u R-u i koja je njihova osnovna svrha u analizi podataka, posebno kod kvalitativnih varijabli?

  2. Kada bi bilo korisno postaviti argument ordered = TRUE prilikom kreiranja faktora i što se time postiže?

  3. Koja je razlika između nominalnih i ordinalnih faktora i kako se postavlja razlika prilikom kreiranja faktora?

  4. U primjeru r <- c(“Osnovna škola,” “Srednja škola,” “Fakultet”); Faktor3 <- factor(r, levels = r, ordered = TRUE), što će biti rezultat i redoslijed razina u faktoru Faktor3?

  5. Ako faktor pretvorimo u numerički tip pomoću as.numeric(faktor), koje greške mogu nastati i kako ih izbjeći?

  6. Što će vratiti naredba levels(Faktor1) ako je Faktor1 definiran kao Faktor1 <- factor(c(“Plava,” “Crvena,” “Zelena,” “Crna”))?

  7. Kako se koristi funkcija levels() za dodavanje novih razina faktoru i kako biste dodali razinu “Doktorat” faktoru Faktor3?

  8. Nakon kreiranja faktora Faktor4 kao factor(a, ordered = TRUE), kako možete provjeriti je li poredak postavljen po abecednom redoslijedu ili prema drugom kriteriju?

  9. Ako se faktor pretvara u numerički tip podataka, zašto može biti potrebno prvo ga pretvoriti u znakovni niz pomoću as.character() i kako izgleda postupak?

  10. Ako u faktoru zadanom kao Faktor6 <- factor(h) pokušate izvesti naredbu num2 <- as.numeric(Faktor6), što se može dogoditi i kako pravilno izvesti pretvorbu?