8 Kreiranje vektora

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.

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

Ispis vektora vrši se 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že se 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

8.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]  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36
##  [37]  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54
##  [55]  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72
##  [73]  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90
##  [91]  91  92  93  94  95  96  97  98  99 100

8.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
##  [19] 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
##  [37] 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153
##  [55] 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
##  [73] 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
##  [91] 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.

8.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
## [20]  58  61  64  67  70  73  76  79  82  85  88  91  94  97 100 103 106 109 112
## [39] 115 118 121 124 127 130 133 136 139 142 145 148 151 154 157 160 163 166 169
## [58] 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.

8.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 parametra. Prvi parametar je broj ili znak koji se ponavlja, a drugi parametar 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.

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

8.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(100, 55,5)
norm
##   [1] 52.27035 56.05187 49.88201 59.38707 59.04712 51.24985 55.38633 61.83270
##   [9] 51.65258 47.86558 58.41236 43.99550 53.91106 49.01936 57.84399 52.89966
##  [17] 52.99752 54.73944 53.37898 48.64631 51.45556 61.82553 44.12281 56.60281
##  [25] 45.98928 60.28580 52.47092 53.90753 52.47532 51.63414 57.54025 58.69119
##  [33] 58.25026 57.90448 49.62543 55.91955 58.88256 49.23076 57.14325 60.85188
##  [41] 57.78595 53.92320 51.14451 50.98141 56.87895 52.19430 59.93393 54.41889
##  [49] 57.19044 53.83838 56.93940 54.10505 54.37087 56.65022 53.50264 51.94280
##  [57] 58.25107 49.07657 55.39359 49.27333 51.89855 58.71233 58.93769 48.99509
##  [65] 59.40937 52.13843 55.91426 49.96324 51.98455 55.52172 53.75804 44.84492
##  [73] 51.64872 49.64950 50.52842 54.37017 53.97481 59.63541 50.39471 52.86321
##  [81] 54.18942 51.60643 52.22205 58.98251 52.70084 55.48059 50.53108 55.62156
##  [89] 49.63905 55.38340 49.04780 57.11771 54.50091 49.19683 50.71007 51.81594
##  [97] 58.08384 53.92034 57.58598 47.50550

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=\). Osim toga, potrebno je odrediti koliko je brojeva potrebno kreirati.

unif <-runif(50,0,1)
unif
##  [1] 0.12445840 0.92911507 0.09856519 0.33623982 0.94579278 0.74925228
##  [7] 0.80297379 0.59243150 0.72726836 0.73707811 0.63335061 0.79252751
## [13] 0.84306917 0.99339804 0.70085384 0.14441878 0.31317365 0.83704270
## [19] 0.56510943 0.07864165 0.17694963 0.68738867 0.93895744 0.16330622
## [25] 0.76489894 0.87258299 0.14845577 0.07163885 0.28438389 0.03891505
## [31] 0.19023094 0.97763616 0.11896276 0.95964989 0.55660329 0.05047884
## [37] 0.38788431 0.29047271 0.77414282 0.87201165 0.69871146 0.88234974
## [43] 0.90868782 0.19330223 0.82485014 0.31733654 0.05492835 0.56646328
## [49] 0.54077940 0.06498220