9 Rad s vektorima

9.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"  
##  [9] "Marko"  "Ivan"

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

9.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 -> integer -> double -> 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"

9.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 
## "Poslovna analitika"                  "6"                  "2" 
##          Sati vježbi        Sati seminara             Obavezan 
##                  "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 
## "Poslovna analitika"                  "6"                  "2" 
##          Sati vježbi        Sati seminara             Obavezan 
##                  "1"                  "1"                  "T" 
## attr(,"studij")
## [1] "Informatički menadžment"

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

9.6 Odabir elemenata vektora

Također, ponekad je potrebno odabrati pojedini element vektora, uobičajeno se to čini s [ ]. 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

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

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

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

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

mean(norm)
## [1] 55.44368
sd(norm)
## [1] 5.365297

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žetka 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 (FALSE), što znači da nema vrijednosti koje nedostaju.

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.

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

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

9.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 ispis prvih nekoliko elemenata.