Uvod v R. 13. oktober Uvodni primer 3

Σχετικά έγγραφα
Funkcijske vrste. Matematika 2. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 2. april Gregor Dolinar Matematika 2

Tretja vaja iz matematike 1

matrike A = [a ij ] m,n αa 11 αa 12 αa 1n αa 21 αa 22 αa 2n αa m1 αa m2 αa mn se števanje po komponentah (matriki morata biti enakih dimenzij):

Diferencialna enačba, v kateri nastopata neznana funkcija in njen odvod v prvi potenci

Odvod. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 5. december Gregor Dolinar Matematika 1

Zaporedja. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 22. oktober Gregor Dolinar Matematika 1

Funkcije. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 14. november Gregor Dolinar Matematika 1

MATEMATIČNI IZRAZI V MAFIRA WIKIJU

KODE ZA ODKRIVANJE IN ODPRAVLJANJE NAPAK

Funkcije. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 21. november Gregor Dolinar Matematika 1

Booleova algebra. Izjave in Booleove spremenljivke

V tem poglavju bomo vpeljali pojem determinante matrike, spoznali bomo njene lastnosti in nekaj metod za računanje determinant.

Odvod. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 10. december Gregor Dolinar Matematika 1

Reševanje sistema linearnih

Zaporedja. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 15. oktober Gregor Dolinar Matematika 1

NEPARAMETRIČNI TESTI. pregledovanje tabel hi-kvadrat test. as. dr. Nino RODE

Funkcije. Matematika 1. Gregor Dolinar. Fakulteta za elektrotehniko Univerza v Ljubljani. 12. november Gregor Dolinar Matematika 1

Kotne in krožne funkcije

13. Jacobijeva metoda za računanje singularnega razcepa

Kontrolne karte uporabljamo za sprotno spremljanje kakovosti izdelka, ki ga izdelujemo v proizvodnem procesu.

Podobnost matrik. Matematika II (FKKT Kemijsko inženirstvo) Diagonalizacija matrik

Statistična analiza. doc. dr. Mitja Kos, mag. farm. Katedra za socialno farmacijo Univerza v Ljubljani- Fakulteta za farmacijo

DISKRETNA FOURIERJEVA TRANSFORMACIJA

Matrike. Poglavje II. Matrika je pravokotna tabela realnih števil. Na primer: , , , 0 1

Kotni funkciji sinus in kosinus

REˇSITVE. Naloga a. b. c. d Skupaj. FAKULTETA ZA MATEMATIKO IN FIZIKO Oddelek za matematiko Verjetnost 2. kolokvij 23.

VEKTORJI. Operacije z vektorji

SKUPNE PORAZDELITVE VEČ SLUČAJNIH SPREMENLJIVK

Splošno o interpolaciji

*M * Osnovna in višja raven MATEMATIKA NAVODILA ZA OCENJEVANJE. Sobota, 4. junij 2011 SPOMLADANSKI IZPITNI ROK. Državni izpitni center

Multivariatna analiza variance

IZPIT IZ ANALIZE II Maribor,

1. Trikotniki hitrosti

Numerično reševanje. diferencialnih enačb II

Delovna točka in napajalna vezja bipolarnih tranzistorjev

Osnove matematične analize 2016/17

Matematika. Funkcije in enačbe

1.3 Vsota diskretnih slučajnih spremenljivk

Definicija. definiramo skalarni produkt. x i y i. in razdaljo. d(x, y) = x y = < x y, x y > = n (x i y i ) 2. i=1. i=1

Na pregledni skici napišite/označite ustrezne točke in paraboli. A) 12 B) 8 C) 4 D) 4 E) 8 F) 12

1 Fibonaccijeva stevila

Osnove linearne algebre

vezani ekstremi funkcij

PONOVITEV SNOVI ZA 4. TEST

Osnove elektrotehnike uvod

Uporabna matematika za naravoslovce

Z Matlabom ali Octave v Numerične metode

Funkcije več spremenljivk

1. Definicijsko območje, zaloga vrednosti. 2. Naraščanje in padanje, ekstremi. 3. Ukrivljenost. 4. Trend na robu definicijskega območja

Algebraične strukture

Gimnazija Krˇsko. vektorji - naloge

Linearna algebra. Bojan Orel Fakulteta za računalništvo in informatiko

Kvadratne forme. Poglavje XI. 1 Definicija in osnovne lastnosti

8. Posplošeni problem lastnih vrednosti

Integralni račun. Nedoločeni integral in integracijske metrode. 1. Izračunaj naslednje nedoločene integrale: (a) dx. (b) x 3 +3+x 2 dx, (c) (d)

Matematika I (VS) Univerza v Ljubljani, FE. Melita Hajdinjak 2013/14. Pregled elementarnih funkcij. Potenčna funkcija. Korenska funkcija.

Osnove statistike. Drago Bokal Oddelek za matematiko in računalništvo Fakulteta za naravoslovje in matematiko Univerza v Mariboru. 1.

Začetni tečaj MATLAB. Avtorja: Poldi Herman, univ. dipl. inž. el. Andraž Žertek, univ. dipl. inž. el.

D f, Z f. Lastnosti. Linearna funkcija. Definicija Linearna funkcija f : je definirana s predpisom f(x) = kx+n; k,

II. LIMITA IN ZVEZNOST FUNKCIJ

8. Diskretni LTI sistemi

Univerza v Ljubljani Fakulteta za računalništvo in informatiko MATEMATIKA. Polona Oblak

Osnovni primer. (Z, +,,, 0, 1) je komutativan prsten sa jedinicom: množenje je distributivno prema sabiranju

DISKRIMINANTNA ANALIZA

Iterativno reševanje sistemov linearnih enačb. Numerične metode, sistemi linearnih enačb. Numerične metode FE, 2. december 2013

Transformator. Delovanje transformatorja I. Delovanje transformatorja II

MATRIČNI ZAPIS MODELA IN OSNOVE MATRIČNE OPERACIJE

Linearne preslikave. Poglavje VII. 1 Definicija linearne preslikave in osnovne lastnosti

MATEMATIKA II TEORIJA

Inverzni problem lastnih vrednosti evklidsko razdaljnih matrik

Oznake in osnovne definicije

UNIVERZA V LJUBLJANI PEDAGOŠKA FAKULTETA SANDRA BOLTA LASTNE VREDNOSTI GRAFA DIPLOMSKO DELO

Problem lastnih vrednosti

Matematika 1. Gabrijel Tomšič Bojan Orel Neža Mramor Kosta

Metoda glavnih komponent

Matematika vaja. Matematika FE, Ljubljana, Slovenija Fakulteta za Elektrotehniko 1000 Ljubljana, Tržaška 25, Slovenija

p 1 ENTROPIJSKI ZAKON

Lastne vrednosti in lastni vektorji

Državni izpitni center SPOMLADANSKI IZPITNI ROK *M * NAVODILA ZA OCENJEVANJE. Sreda, 3. junij 2015 SPLOŠNA MATURA

Spoznajmo sedaj definicijo in nekaj osnovnih primerov zaporedij števil.

Izpeljava Jensenove in Hölderjeve neenakosti ter neenakosti Minkowskega

1. Έντυπα αιτήσεων αποζημίωσης Αξίωση αποζημίωσης Έντυπο Πίνακας μεταφράσεων των όρων του εντύπου...

Funkcija je predpis, ki vsakemu elementu x iz definicijskega območja D R priredi neko število f (x) R.

Matematika. BF Lesarstvo. Zapiski ob predavanjih v šolskem letu 2009/2010

Metoda voditeljev. Poglavje 2

MATEMATIKA 1 UNIVERZITETNI ŠTUDIJSKI PROGRAM BIOKEMIJA 1. LETNIK

Dodatna poglavja iz linearne algebre za 1. letnik finančne matematike na FMF. Primož Moravec

FAKULTETA ZA STROJNIŠTVO Matematika 4 Pisni izpit 22. junij Navodila

UNIVERZA V MARIBORU FAKULTETA ZA KEMIJO IN KEMIJSKO TEHNOLOGIJO MATEMATIKA II

Analiza 2 Rešitve 14. sklopa nalog

Tadeja Kraner Šumenjak MATEMATIKA. Maribor, 2010

Enačba, v kateri poleg neznane funkcije neodvisnih spremenljivk ter konstant nastopajo tudi njeni odvodi, se imenuje diferencialna enačba.

Bernoullijevo zaporedje neodvisnih poskusov

Regresija in korelacija

5.1 Predpogojevanje. K 1 Ax = K 1 b,

Poliedri Ines Pogačar 27. oktober 2009

Univerza v Mariboru. Uporaba matematičnih metod v logistiki 1 Priročnik

ZBIRKA REŠENIH NALOG IZ MATEMATIKE I

Vaje: Električni tokovi

SEMINARSKA NALOGA Funkciji sin(x) in cos(x)

Transcript:

Uvod v R Aleš Žiberna 13. oktober 2010 Kazalo 1 Uvodni primer 3 2 Osnovne informacije 13 2.1 Osnovne računske operacije................... 13 2.2 Spremenljivke........................... 15 2.3 Uporaba funkcij in pomoči.................... 16 2.4 Paketki.............................. 18 2.5 Drugi osnovni podatki...................... 19 3 Podatkovne strukture 20 3.1 Osnovni podatkovni tipi..................... 20 3.2 Vektor............................... 22 3.3 Nominalne in ordinalne spremenljivke.............. 26 3.4 Seznam.............................. 28 3.5 Matrika.............................. 31 3.6 Array............................... 37 3.7 Podatkovni okvir - Data frame.................. 37 3.8 Vaje................................ 40 3.8.1 Vaja 1........................... 40 3.8.2 Vaja 2........................... 40 4 Funkcije in programiranje 41 4.1 Nekaj zelo koristnih funkcij................... 41 4.2 Definranje funkcij......................... 46 4.3 Programski tok.......................... 47 4.4 Vaje................................ 50 4.4.1 Vaja 1........................... 50 1

4.4.2 Vaja 2........................... 50 4.4.3 Vaja 3........................... 50 4.4.4 Vaja 4........................... 51 5 Delo z datotekami 51 5.1 Tekstovne datoteke........................ 51 5.2 Shranjevanje in branje R -ovih objektov............. 53 5.3 Branje in pisanje datoteke drugih programov.......... 55 5.4 Vaje................................ 57 5.4.1 Vaja 1........................... 57 5.4.2 Vaja 2........................... 57 5.4.3 Vaja 3........................... 57 5.4.4 Vaja 4........................... 57 6 Risanje 57 6.1 Visoko-nivojske funkcije za risanje................ 58 6.2 Nizko-nivojske funkcije za risanje................ 60 6.3 Vaje................................ 62 6.3.1 Vaja 1........................... 62 6.3.2 Vaja 2........................... 62 6.3.3 Vaja 3........................... 62 2

1 Uvodni primer Za predstavitev načina analize z R -je začnimo s realnim primerom. Podatki, na katerih je narejen primer, so bili zbrani v okviru raziskave Kakovost merjenja egocentričnih socialnih omrežij, katere avtorji so Ferligoj in drugi. Podroben opis raziskave je možno dobiti na spletni strani Arhiva družboslovnih podatkov: http://www.adp.fdv.uni-lj.si. Najprej prebermo podatke in funkcije (prej pripravljene). > #naložimo datoteko s posebej pripravljenimi funkcijami > source("mva-funkcije.r") > #naložimo paketek za branje podatkov iz "tujih" zapisov > library(foreign) > #preberemo podatke > ego<-read.spss("egocapisl_skripta.sav",to.data.frame=true, use.value.labels = FALSE,use.missings=TRUE) Naredimo še frekvenčno tabelo (lepo izpisana s L A TEX-om je v Tabeli 1 in grafa (Slika 1). > ego$spol<-makefactorlabels(ego$spol) > table(ego$spol) moški ženski 267 364 > frektab(ego$spol,dec=1) Frevenca Kum. frek. % Kumulativni % moški 267 267 42.3 42.3 ženski 364 631 57.7 100.0 Frevenca Kum. frek. % Kumulativni % moški 267 267 42.3 42.3 ženski 364 631 57.7 100.0 Tabela 1: Frekvenčna tabela za spol > par(mfrow=c(1,2)) #dva grafa na eno stran > barplot(table(ego$spol),main="strukturni stolpci") > pie(table(ego$spol),main="strukturni krog") > par(mfrow=c(1,1)) Delamo lahko tudi dvodimenzionalne tabele in jih na enostaven način narišemo (Slika 2. 3

Strukturni stolpci Strukturni krog 0 50 150 250 350 ženski moški moški ženski Slika 1: Strukturni stolpci in krog za spol > ego$d9<-makefactorlabels(ego$d9) > tbl<-table(spol=ego$spol,izobrazba=ego$d9) > tbl izobrazba spol nedokončana osnovna šola osnovna šola moški 1 18 ženski 5 36 izobrazba spol poklicna šola štiriletna srednja šola višja šola moški 44 110 28 ženski 44 157 40 izobrazba spol visoka šola magisterij doktorat moški 55 3 8 ženski 75 5 2 > plot(tbl,las=1, main="") Sedaj pa malce transformacije spremenljivk - izračunamo Likartovi lestvici za ekstrovertiranost in emocionalno stabilnost. > #uvedemo novi spremenljivki > ego$ekst_sco <- apply(ego[,c("eksta", "EKSTB", "EKSTE", "EKSTH", "EKSTIR", "EKSTLR", "EKSTNR", "EKSTOR", "EKSTP", "EKSTRR")],1,sum) 4

nedokoncana osnovna šola osnovna šola moški ženski poklicna šola izobrazba štiriletna srednja šola višja šola visoka šola magisterij doktorat spol Slika 2: Strukturni stolpci za povezanost dveh nominalnih spremenljivk > ego$emoc_sco <- apply(ego[,c("emocc", "EMOCDR", "EMOCF", "EMOCGR", "EMOCJR", "EMOCKR", "EMOCMR", "EMOCQR", "EMOCSR", "EMOCTR")],1,sum) Porazdelitev teh dveh spremenljivk lahko vidimo v Sliki 3. > par(mfrow=c(1,2)) #dva grafa na eno stran > hist(ego$ekst_sco, xlab="ekstrovertiranost", main="", freq=false,ylab="gostota") > #dodamo normalno krivuljo > curve(dnorm(x,mean=mean(ego$ekst_sco,na.rm=true), sd=sd(ego$ekst_sco,na.rm=true)),add=true) > #raje z gostoto > hist(ego$emoc_sco, xlab="emocionalna stavilnost", main="", freq=false, ylim=c(0,0.05)) > #ylim=c(0,0.05) smo dodali, da se vidi tudi vrh krivujle, > #ki jo vrišemo z naslednjim ukazom 5

gostota 0.00 0.02 0.04 Density 0.00 0.02 0.04 10 20 30 40 50 ekstrovertiranost 10 20 30 40 50 emocionalna stavilnost Slika 3: Histograma za ekstrovertiranost in emocionalno stabilnost > #dodamo normalno krivuljo > curve(dnorm(x,mean=mean(ego$emoc_sco,na.rm=true), sd=sd(ego$emoc_sco,na.rm=true)),add=true) > par(mfrow=c(1,1)) Sedaj izračunajmo še opisne statistike po skupinah glede na spol ter za eno izmed njiju (emocionalno stabilnost) preverimo hipotezo, da sta aritmetični sredini v obeh skupinah enaki. > #opisne statistike po skupinah > by(ego$ekst_sco, INDICES=ego$SPOL, FUN = function(x)c(povprecje=mean(x,na.rm=true), sd=sd(x,na.rm=true),n=sum(!is.na(x)))) ego$spol: moški povprecje sd n 34.159696 7.711717 263.000000 --------------------------------------------- ego$spol: ženski povprecje sd n 34.659091 8.031826 352.000000 > by(ego$emoc_sco, INDICES=ego$SPOL, FUN = function(x)c(povprecje=mean(x,na.rm=true), sd=sd(x,na.rm=true),n=sum(!is.na(x)))) ego$spol: moški 6

povprecje sd n 36.30682 8.22362 264.00000 --------------------------------------------- ego$spol: ženski povprecje sd n 33.986111 9.184723 360.000000 > ##EMOCIONALNA STABILNOST > #testiramo enakost varianc (več različnih testov) > var.test(emoc_sco~spol,data=ego) F test to compare two variances data: emoc_sco by SPOL F = 0.8017, num df = 263, denom df = 359, p-value = 0.05669 alternative hypothesis: true ratio of variances is not equal to 1 95 percent confidence interval: 0.6411573 1.0063491 sample estimates: ratio of variances 0.801667 > #če želimo kalasičen t-test (predpostavka enakih varianc) > t.test(emoc_sco~spol, data=ego,var.equal = TRUE) Two Sample t-test data: emoc_sco by SPOL t = 3.2579, df = 622, p-value = 0.001184 alternative hypothesis: true difference in means is not equal to 0 95 percent confidence interval: 0.9218292 3.7195850 sample estimates: mean in group moški mean in group ženski 36.30682 33.98611 Izračunajmo še korelacijo med ekstrovertiranostjo in emocionalno stabilnostjo, preverimo hipotezo, da je 0 ter prikažimo odnos z njima na razsevnem grafikonu. Ta je prikazan na Sliki 4, kjer smo z različnimi barvami in zanki označili tudi spol. > plot(jitter(emoc_sco)~jitter(ekst_sco),pch=as.numeric(spol), col=as.numeric(spol),data=ego,ylab="emocionalna stabilnost", 7

xlab="ekstrovertiranost") > #jitter malce razpriši točke, da se ne prekrivajo > par(xpd=true) > legend(x=30,y=52.5,xjust=0.5,yjust=0,legend=c("moški", "ženski"),pch=1:2,col=1:2, horiz = TRUE, title="spol") > par(xpd=false) 10 20 30 40 50 10 20 30 40 50 ekstrovertiranost emocionalna stabilnost Spol moški ženski Slika 4: Razsevni grafikon za ekstrovertiranost in emocionalno stabilnost Izračunamo še korelacijo med novima spremenljivkama in preverimo hipotezo, da je korelacija enaka 0. > #Pearsonov koeficient korelacije > cor(ego[,c("emoc_sco","ekst_sco")],method = "pearson", use="pairwise.complete.obs") emoc_sco ekst_sco emoc_sco 1.0000000 0.2278617 ekst_sco 0.2278617 1.0000000 > cor.test(y=ego$emoc_sco,x=ego$ekst_sco) 8

Pearson's product-moment correlation data: ego$ekst_sco and ego$emoc_sco t = 5.7703, df = 608, p-value = 1.261e-08 alternative hypothesis: true correlation is not equal to 0 95 percent confidence interval: 0.1512119 0.3017878 sample estimates: cor 0.2278617 Nadaljujemo z multivariatno analizo - razvrščanjem v skupine. Najprej izločimo enote z manjkajočimi vrednostmi, nato izračunamo kvadrirano evklidsko razdajo in jo uporabimo za hierarhično razvrščanje z Wardovo metodo. Na podlagi dobljenega dendrograma na Sliki 5 ocenimo, da v podatkih nastopata 2 skupini. > #Hierarhično razvrščanje v skupine > #odstranimo enote z manjkajočimi enotami > emoc<-na.omit(ego[,c("emocc", "EMOCDR", "EMOCF", "EMOCGR", "EMOCJR", "EMOCKR", "EMOCMR", "EMOCQR", "EMOCSR", "EMOCTR")]) > #standardiziramo podatke s funkcijo scale > Zemoc<-scale(emoc) > #izračunamo evklidsko razdaljo na stadnardiziranih podatkih > d<-dist(zemoc) > #za kvadrirano evklidsko razdaljo jo kvadriramo > d2<-d^2 > #uporabimo Wardovo metodo > ward<-hclust(d=d2,method="ward") > #narišemo dendrogram > plot(ward) > abline(h=1500, col="red") Ti dve skupini shranimo in izračunamo povprečja po skupinah na nestandardiziranih spremenljivkah, ki so prikazana v Tabeli 2. > #izberemo 2 skupini (in jih shranimo) > wardcluk2<-cutree(ward,k=2) > #število enot po skupinah > table(wardcluk2) wardcluk2 1 2 9

Cluster Dendrogram 188 478 141 225 396 613 353 608 440 352 503 490 597 30 157 507 304 344 177 452 492 374 391 89 78 582 123 575 471 134 131 314 459 170 381 482 455 623 79 566 536 290 439 76 39 388 320 285 129 161 498 525 375 501 403 261 610 359 485 140 280 493 160 334 229 586 556 581 128 169 71 63 62 324 90 213 350 554 601 5062 365 340 386 413 96 351 366 241 449 373 4817 91 92 15 401 234 263 104 124 235 488 228 274 422 116 521 237 573 443 615 300 327 625 108 144 147 275 434 341 1719 405 35 465 125 209 322 329 339 567 135 151 445 256 94 447 599 196 271 240 3765 232 528 296 254 162 432 395 330 137 504 355 411 448 367 456 626 245 600 66 611 607 595 560 287 173 146 553 377 576 461 535 513 512 307 508 479 469 441 379 291 281 278 269 247 233 202 201 184 118 159 526 550 584 558 605 424 276 56 61 179 450 289 549 325 500 530 297 130 563 246 630 502 472 596 519 192 631 236 380 150 546 489 282 570 248 580 495 457 442 593 363 158 262 298 522 358 199 552 37 561 121 510 460 243 458 176 569 594 195 577 103 310 117 42 219 533 346 110 518 133 487 614 190 266 474 214 127 293 426 20 206 230 491 145 336 545 113 189 480 180 178 25 252 338 318 153 370 253 523 136 354 468 532 205 406 155 628 115 139 598 166 302 357 589 333 193 372 231 312 543 394 483 183 428 606 203 126 67 187 477 4441 101 617 319 198 313 622 99 49 342 119 620 517 389 102 473 364 583 168 309 534 568 578 100 399 362 288 292 496 50 19 200 412 564 602 185 559 383 393 109 331 23 299 390 345 588 420 47 72 36 73 418 242 467 149 316 466 142 410 408 537 301 476 267 565 174 541 106 425 520 208 55 609 305 58 397 415 167 295 111 138 218 463 430 398 529 361 44 224 407 514 527 277 264 349 539 175 38 95 486 429 484 172 618 122 294 404 531 419 427 186 259 207 326 244 258 505 616 547 268 328 542 75 45 414 4703 303 369 216 132 315 4994 191 433 544 227 348 475 423 557 540 619 509 572 497 87 437 627 251 384 417 454 571 591 143 226 77 70 306 464 148 409 538 621 592 382 11 17 212 223 462 239 286 562 265 31 64 41 57 335 112 431 317 114 515 387 272 311 85 579 249 107 421 604 590 283 516 436 93 82 98 222 284 585 204 273 181 260 194 347 400 54 97 438 453 360 371 156 451 163 446 511 524 574 34 279 378 337 308 548 88 69 105 629 368 120 210 182 624 323 587 59 46 53 603 238 250 152 257 332 385 221 392 220 402 217 255 343 154 86 165 197 555 356 215 551 612 270 435 83 80 29 Height 0 500 1000 1500 2000 2500 d2 hclust (*, "ward") Slika 5: Razsevni grafikon za ekstrovertiranost in emocionalno stabilnost 352 272 > #izračunamo povprečja po skupinah > aggregate(x=emoc, by=list(wardcluk2), FUN=mean) Group.1 EMOCC EMOCDR EMOCF EMOCGR EMOCJR 1 1 3.022727 2.428977 3.892045 2.650568 2.448864 2 2 4.000000 4.485294 4.621324 4.139706 4.117647 EMOCKR EMOCMR EMOCQR EMOCSR EMOCTR 1 2.306818 3.301136 2.974432 3.536932 2.758523 2 3.746324 3.786765 4.220588 4.639706 4.518382 Poskusimo še, ali lahko z metodo voditeljev dobimo boljši rezultat. Povprečja po skupinah na nestandardiziranih spremenljivkah so prikazana v Tabeli 3 in na Sliki 6. > #Razvrščanje v skupine z metodo voditeljev > kmeansr10<-kmeans(zemoc, centers=2, iter.max = 50, nstart = 10) 10

1 2 EMOCC 3.02 4.00 EMOCDR 2.43 4.49 EMOCF 3.89 4.62 EMOCGR 2.65 4.14 EMOCJR 2.45 4.12 EMOCKR 2.31 3.75 EMOCMR 3.30 3.79 EMOCQR 2.97 4.22 EMOCSR 3.54 4.64 EMOCTR 2.76 4.52 Tabela 2: Hierarhično razvrščanje - povprečja po skupinah > #ponovimo kar 10-krat (na se izgnemo lokalnim minimumom) > #končni voditelji na standardiziranih spremenljivkah > #(te smo uporabili za razvrščanje) > kmeansr10$centers EMOCC EMOCDR EMOCF EMOCGR EMOCJR 1 0.2807587 0.5873913 0.2360699 0.5311423 0.6126683 2-0.3449321-0.7216522-0.2900287-0.6525462-0.7527067 EMOCKR EMOCMR EMOCQR EMOCSR EMOCTR 1 0.3711498 0.2967399 0.5099416 0.4663205 0.5518454 2-0.4559841-0.3645662-0.6264997-0.5729081-0.6779815 > #velikosti skupin > kmeansr10$size [1] 344 280 > #vrenost wardove kriterijske funkcije > sum(kmeansr10$withinss) [1] 4585.664 > #povprečnja po skupinah na nestandardiziranih sprmenljivkah > aggregate(x=emoc, by=list(kmeansr10$cluster), FUN=mean) Group.1 EMOCC EMOCDR EMOCF EMOCGR EMOCJR 1 1 3.854651 4.261628 4.470930 4.104651 4.098837 2 2 2.950000 2.175000 3.889286 2.310714 2.042857 EMOCKR EMOCMR EMOCQR EMOCSR EMOCTR 1 3.526163 3.947674 4.290698 4.613372 4.322674 2 2.207143 2.978571 2.567857 3.285714 2.546429 11

1 2 EMOCC 3.85 2.95 EMOCDR 4.26 2.17 EMOCF 4.47 3.89 EMOCGR 4.10 2.31 EMOCJR 4.10 2.04 EMOCKR 3.53 2.21 EMOCMR 3.95 2.98 EMOCQR 4.29 2.57 EMOCSR 4.61 3.29 EMOCTR 4.32 2.55 Tabela 3: Metoda voditeljev - povprečja po skupinah > #graf > means<-aggregate(x=emoc,by=list(kmeansr10$cluster),fun=mean) > matplot(t(means[,-1]),type="o",xaxt="n",ylab="povprečja") > axis(side=1,at=1:dim(means[,-1])[2], labels=colnames(means)[-1],las=2) Primerjajmo še razbitji, pridobljeni z metodama. Vidimo, da je vrednost kriterijske funkcije za razbitje, pridobljeno z Wardovo metodo 4913.53, za tisto z metodo voditeljev pa 4585.66. Kako se razporeditvi prekrivata lahko vidimo v Tabeli 4. > #Primerjava kriterijih funkcij > wardkf(zemoc,wardcluk2) #Wardova metoda [1] 4913.525 > sum(kmeansr10$withinss) #metoda voditeljev [1] 4585.664 > #Primerjava končnih razvrstitev po enotah > table("wardova metoda"=wardcluk2, "Metoda voditeljev"=kmeansr10$cluster) Metoda voditeljev Wardova metoda 1 2 1 85 267 2 259 13 Razbitje, prikazano v prostoru prvih dveh glavnih komponent je prikazano na Sliki 7 12

povprecja 2.0 2.5 3.0 3.5 4.0 4.5 1 2 1 2 1 2 1 1 2 2 1 2 1 2 1 2 1 2 1 2 EMOCC EMOCDR EMOCF EMOCGR EMOCJR EMOCKR EMOCMR EMOCQR EMOCSR EMOCTR Slika 6: Graf povprečji po skupinah, dobljenih z metodo voditeljev > # metoda glavnih komponent > PC<-princomp(Zemoc) > plot(pc$scores[,1:2],ylab="2. komponenta",xlab="1. komponenta",pch=kmeansr10$cluster,col=kmeansr10$cluster) > legend(x=mean(range(pc$scores[,1])), y=max(pc$scores[,2])+0.5, legend = c("1. skupina", "2. skupina"), title="metoda voditeljev",xjust=0.5, yjust=0,xpd=true, pch=kmeansr10$cluster,col=kmeansr10$cluster,horiz=true) 2 Osnovne informacije 2.1 Osnovne računske operacije # je znak za komentar v R -ju. 13

1 2 1 85 267 2 259 13 Tabela 4: Primerjava končnih razvrstitev po enotah 2 0 2 4 2 0 2 4 1. komponenta 2. komponenta Metoda voditeljev 1. skupina 2. skupina Slika 7: Graf povprečji po skupinah, dobljenih z metodo voditeljev > 2+2 [1] 4 > 6-2 [1] 4 > 3*5 [1] 15 > 2/5 [1] 0.4 14

> 5%%2 #vrne ostanek pri deljenju [1] 1 > sqrt(25) #koren preko funkcije [1] 5 > 25^(1/2) #in drugače (bolj splošno) [1] 5 > 5^2 #potenca [1] 25 2.2 Spremenljivke Neko vrednost shranimo tako, da jo priredimo neki spremenljivki (objektu). Spremenljivke/objekte nato uporabljamo namesto vrednosti, ki so shranjene v njih. V imenih spremenljivk lahko nastopajo: ˆ črke (velike in male - velikost je pomembna) ˆ številke ˆ znak - znak je bil do verzije 1.8.0 R -ja bil uporabljen kot znak za urejanje, na kar je potrebno biti pozoren, če naletite na kakšno zelo staro kodo. ˆ znak. - predvsem pri funkcijah ima znak. v imenu funkcije tudi poseben pomen (uporablja se, da se prilagodi funkcijo za določen razred objekta), zato se uporaba. v ostalih primerih odsvetuje. Primer uporabe spremenljivk: > a <- 5 #priredimo vrednost spremenljivki > a #izpišemo vrednost spremenljivke [1] 5 > a + 4 [1] 9 > b <- a*2 #nekaj izračunamo in rezultat priredimo > b [1] 10 15

> (c <- a + b) #Kaj se zgodi zaradi oklepajev? [1] 15 Zaradi oklepajev se rezultate izračuna pri zadnjem izrazu tudi izpiše in ne le shrani v spremenljivko c. Ime spremenljivke se mora nujno začeti z črko ali piko (.), tem da so spremenljivke, ki se začenjajo s piko (.) skrite, se pravi se ne izpišejo s funkcijo ls() (ta funkcija izpiše vse vidne objekte v okolju). 2.3 Uporaba funkcij in pomoči Funkcija ls je prva R -ova funkcija, ki smo jo spoznali. Za pomoč o katerikoli R -jevi funkciji napišemo v R eno od spodnjih možnosti:?ime_funkcije help(ime_funkcije) Za iskanje po pomoči lahko uporabite help.search("iskalni pogoj")??"iskalni pogoj" Več pomoči pa najdete tudi v meniju Help. Za iskanje funkcije, katere ime ustreza določenemu vzorcu, pa uporabite funkcijo apropos. Vsaka spremenljivka je pravzaprav objekt (objekti so tudi funkcije). Objekte lahko brišemo s funkcijo rm. Funkcijo kličemo tako, da navedemo njeno ime in potem v oklepajih () njene argumente, ločene z vejico. Nujno moramo navesti vse argumente, ki nimajo privzete vrednosti, ostale pa le, če nam privzeta vrednost ne ustreza. Tudi če ne navedemo nobenega argumenta moramo nujno navesti oklepaje (), kamor v tem primeru ne napišemo nič. Za več o tem glejte primer pri točki?? (??). Pri navajanju argumentov imamo dve možnosti: ˆ Argumente navajamo v takem vrstnem redu, kot so navedeni v funkciji. Ta način lahko uporabimo samo pri argumentih, ki so na začetku oz. smo navedli tudi vse argumente pred njim. ˆ Argumetne navajamo v poljubnem vrstnem redu skupaj z njihovimi imeni kot dvojice ime=vrednost V vsakem primeru ločimo argumente z vejicami. Drugi način je dosti bolj varen. Prvi se ponavadi uporablja le za prvi argument ali pri zelo pogosto 16

uporabljenih funkcijah, čeprav tudi takrat ni priporočljiv. > ls() #Kličemo funkcijo ls, brez da bi navedli kak argument [1] "a" "b" [3] "c" "cortestdf" [5] "d" "d2" [7] "ego" "emoc" [9] "frektab" "insert" [11] "kmeansr10" "makefactorlabels" [13] "means" "PC" [15] "printcortestdf" "ss" [17] "ssallvar" "tbl" [19] "ward" "wardcluk2" [21] "wardkf" "Zemoc" > #Argumenti niso potrebni, ker je pri vseh argumentih > #privzeta vrednost ustrezna > #Z njo izpišemo vse vidne objekte - med njimi je tudi a > > a<-1 #kreiramo a > rm(a) #izbrišemo a - argument funkcije je > ls() #a-ja ni več med objekti [1] "b" "c" [3] "cortestdf" "d" [5] "d2" "ego" [7] "emoc" "frektab" [9] "insert" "kmeansr10" [11] "makefactorlabels" "means" [13] "PC" "printcortestdf" [15] "ss" "ssallvar" [17] "tbl" "ward" [19] "wardcluk2" "wardkf" [21] "Zemoc" > a<-1 #kreiramo a > rm(a) #izbrišemo a > #Pozor: argument funkcije je objekt (ne njegovo ime) > >?ls #pomoč za funkcijo ls > help(ls) #enako >??"List Objects" #išče po pomoči > ls(all.names = TRUE) #izpišemo vse objekte, tudi skrite 17

[1] ".Random.seed" "b" [3] "c" "cortestdf" [5] "d" "d2" [7] "ego" "emoc" [9] "frektab" "insert" [11] "kmeansr10" "makefactorlabels" [13] "means" "PC" [15] "printcortestdf" "ss" [17] "ssallvar" "tbl" [19] "ward" "wardcluk2" [21] "wardkf" "Zemoc" > #torej tudi tiste, ki se začnejo z piko (.) > > rm(list=ls()) #izbrišemo vse vidne objekte > #ta ukaz uporabljajte zelo pazljivo > > #ustvarimo nekaj spremenljivk > a<-1;b<-2;aa<-3;aaaabb<-4;daa<-5 > #V R-ju lahko v eno vrstico napišemo tudi več ukazov, > #ki jih ločimo s podpičji > #ponavadi to sicer ni priporočljivo > > ls(pattern = "aa") #vsi objekti, ki imajo v imenu "aa" [1] "aa" "aaaabb" "daa" 2.4 Paketki Vse funkcije (ki jih nismo napisali sami) in tudi veliko podatkov je v R - ju shranjeno v paketkih. Paketke naložimo preko menija Packages Load package... ali enostavneje s funkcijami library ali require. Edina razlika med njima je v tem, da prva ob neuspehu (če npr. paketek ni inštaliran) javi napako, druga pa vrednost FALSE. Da pa paketke lahko naložimo, morajo biti prej inštalirani. Na voljo je velika množica paketkov. 28 osnovnih paketkov je vključenih že v osnovo distribucijo R -ja (in jih imate tako že inštalirane), velimo več (trenutno 2529) pa jih je na voljo na CRAN-u (Comprehensive R Archive Network). Paketke najlažje inštaliramo kar direktno iz CRAN-a in sicer preko menija 18

1 2 3 4 Slika 8: Štirje obrazi Packages Install package(s)... ali preko funkcije install.packages. > install.packages("teachingdemos") > #inštaliramo paketek s CRAN-a > library(teachingdemos) #naložimo paketek > #funkcija "faces" ni na voljo, če prej en naložimo paketka > faces() #uporabimo funkcijo iz paketka - narišemo 4 obraze Rezultat funkcije je v Sliki 8. 2.5 Drugi osnovni podatki Prostor, kamor v R -ju pišemo ukaze se imenuje konzola. Vanjo lahko ukaze tipkamo, lepimo ali pošljemo iz urejevalnika besedil (če leta to podpira). Zelo priročno je tudi pomikanje po že uporabljenih ukazih (za ponavljanje ali manjše spremembe) z smernimi kazalci za gor in dol. Po posameznem ukazu pa se premikamo z smernimi tipkami za levo in desno. R zapremo preko menija File Exit ali s funkcijama q ali quit (sta identični). Ko ugasnemo R nas R tudi vpraša (če nismo tega povedali že preko argumentov prej omenjenih funkcij, ali želimo shraniti delovno okolje (workspace) in zgodovino. Stanje delovnega okolja (workspace) lahko kadarkoli shranimo z funkcijo save.image ali preko menija File Save Workspace..., zgodovino ukazov pa 19

z savehistory oz preko menija File Save History... Vse datoteke se (če ne izberemo drugače) shranijo v delovno mapo (working directory). Delovno mapo lahko spremenimo preko funkcije setwd ali preko menija File Change dir... Način spreminjanja mape preko menija lahko tudi uporabimo le za to, da najdemo trenutno delovno mapo, lahko pa to tudi ugotovimo s funkcijo getwd. Shranjeno okolje lahko naložimo potem na več načinov. Če nismo spreminjali imen (privzeto ime je.rdata za delovno okolje in.rhistory za zgodovino), potem se oboje avtomatično naloži, če ali zaženemo R v isti mapi ali z dvoklikom na shranjeno okolje.rdata. Delovno okolje lahko naložimo tudi tako, da datoteko prenesemo v R -ovo okno ali s pomočjo funkcije load.image ali preko menija File Load Workspace... Podobno velja tudi za zgodovino. Zgodovino lahko kadarkoli izpišemo tudi z funkcijo history. 3 Podatkovne strukture 3.1 Osnovni podatkovni tipi R pozna naslednje osnovne podatkovne tipe: logical logični vektor - vrednosti TRUE in FALSE integer cela števila numeric realna števila - to je privzeta vrednost za vsa števila v R -ju, tudi cela, npr. 2. complex kompleksna števila character znaki (poljubno število) - vedno jih moramo pisati v narekovajih, saj se drugače upoštevajo kot imena spremenljivk ali drugih objektov (funkcij) raw tega ne rabite Podatkovne tipe spreminjamo s funkcijami as.nekaj, kjer je nekaj ime tipa. Tip podatka preverjamo s is.nekaj. Tip podatka preverimo s funkcijo mode. Obstajajo pa še sledeče posebne vrednosti: NA Not available - ni na voljo oz. R -jeva koda za manjkajočo vrednost 20

NaN Not a Number - ni število. Relevantno samo pri številskih tipih in se uporablja, kadar rezultat nekega izračuna ni definiran, npr. 0/0. NULL Absoluten nič v R -ju, prazen element. Pri prvih dveh (NA,NaN) je rezultat izračuna, kjer nastopa katera od teh vrednosti praktično vedno kar ta vrednost, tretji pa ima nekako podobno vlogo kot prazen element. > 4 #realno število [1] 4 > is.numeric(4) [1] TRUE > is.integer(4) #ni celo število [1] FALSE > a <- as.integer(4) #smo naredili celo število > is.integer(a) [1] TRUE > a<-"to je znakovna spremenljivka" > a<-"4" #še vedno znakovna spremenljivka > a #četudi je znak številka - ne moremo računati [1] "4" > as.numeric(a)+3 #po spremembi lahko računamo [1] 7 > 0/0 [1] NaN > 1 + NA [1] NA Pri realnih podatkih prav pridejo tudi funkcije za zaokroževanje. > floor(2.6) #navzdol [1] 2 > ceiling(2.1) #navgor [1] 3 > round(2.1) #na najbližjo vrednost 21

[1] 2 > round(2.6) [1] 3 > round(1.5) #pozor - uporablja standard IEC 60559 [1] 2 > #vrednosti na meji (5 na koncu) se zaokrožujejo na najbližje > #sodo število > round(2.5) [1] 2 > round(pi,digits=3) #lahko nastavimo tudi število decimalk [1] 3.142 3.2 Vektor Vektor je najbolj osnovna podatkovna struktura. Vsebuje lahko samo podatke enega tipa. Če želimo ustvariti vektor iz podatkov različnih tipov, jih R sam pretvori v tip, ki je najsplošnejši (npr, če zdužujemo številke in znake v tip character ). Vektor ustvarimo tako, da združimo (combine) vrednosti s pomočjo funkcije c. R (oziroma S) je vektorski jezik, kar pomeni, da se operacije izvajajo na vseh elementih vektorja, če ne izberemo le posameznega dela. Pozor: R dovoli tudi množenje dveh vektorjev različnih dolžin. V primeru, da dolžina daljšega ni mnogokratnik dolžine krajšega, izpiše opozorilo, sicer pa le izračuna rezultat. Elemente vektorja izbiramo tako, da njihove indekse navedemo v oglatih oklepajih [ ] (glej primer spodaj). Izbrane dele lahko tudi spreminjamo. Negativna vrednost v oglatih oklepajih pomeni, da izberemo vse razen tistega, kar sledi -. > a<-c(4,6,7,3,1,2) #kreiramo vektor > a #izpišemo vektor [1] 4 6 7 3 1 2 > a + 3 [1] 7 9 10 6 4 5 22

> #vsem elementom vektorja a prištejemo 3 (a se seveda ne > #spremeni) > > b<-c(1,2,3,4,5,6) > a+b #elementi se seštejejo [1] 5 8 10 7 6 8 > a*b #oz. zmnožijo [1] 4 12 21 12 5 12 > b<- c(1,2) > a+b #b se 3x ponovi, da doseže dolžino a-ja brez opozorila [1] 5 8 8 5 2 4 > a*b [1] 4 12 7 6 1 4 > length(a) #izpišemo dolžino vektorja a [1] 6 > length(b) [1] 2 > length(a*b) #dolžina rezultata je enaka dolžini daljšega [1] 6 > b<-c(1,2,3,4) > a*b #b se ponovi 1,5-krat. Izpiše se opozorilo [1] 4 12 21 12 1 4 > a[3] #izberemo 3. element vektorja a (štetje se začne z 1) [1] 7 > c<-c(3,6,"d") #če združimo različne elemente > c #dobimo najbolj splošen tip (znakovni) [1] "3" "6" "d" > c[2]<-'bla bla' #spremenimo 2 element v vektorju b > c [1] "3" "bla bla" "d" > c[-2] #izpišemo vse elemente razen drugega [1] "3" "d" 23

Vektor/zaporedje celih števil od a do b tvorimo tako, da napišemo a:b, kjer a in b zamenjamo s ustreznima številoma oz. sta to dve spremenljivki, ki imata ustrezne vrednosti. To lahko s pridom uporabljamo tudi pri izbiranju dela vektorja, saj lahko izberemo tudi več kot en element vektorja, tako da kot indeks podamo vektor števil. Namesto indeksov lahko tudi uporabimo enako dolg (kot originalni) logični vektor (ima samo vrednosti TRUE in FALSE). Izbrani so elementi, kjer je vrednost TRUE. > 1:5 #vektor od 1 do 5 [1] 1 2 3 4 5 > a<- -10:10 #kreiramo vektor od -10 do 10 in ga shranimo v a > a #izpišemo vektor [1] -10-9 -8-7 -6-5 -4-3 -2-1 0 1 2 3 [15] 4 5 6 7 8 9 10 > a[5:10] #izpišemo številke na mestih od 5 do 10 (vključno) [1] -6-5 -4-3 -2-1 > a[5:10][1:3] #izmed številk na mestih od 5 do 10 izberemo prve 3 [1] -6-5 -4 > a[c(1,11,21)] #izberemo številke na mestih 1, 11 in 21 [1] -10 0 10 > a[-c(1,11,21)] #izberemo vse razen tistih na mestih 1, 11 in 21 [1] -9-8 -7-6 -5-4 -3-2 -1 1 2 3 4 5 6 7 8 9 > a[-(1:5)] #izberemo vse razen tistih na mestih od 1 do 5 [1] -5-4 -3-2 -1 0 1 2 3 4 5 6 7 8 9 10 > a>0 #dobimo logični vektor, ki ga lahko uporabimo za izbor [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE [10] FALSE FALSE TRUE TRUE TRUE TRUE TRUE TRUE TRUE [19] TRUE TRUE TRUE > a[a>0] #izberemo samo pozitivna števila [1] 1 2 3 4 5 6 7 8 9 10 Pozor: če pri zadnjem izrazu spustimo oklepaj, to ni veljavno, ker imajo potem indeksi vrednosti od -1 do 5, kar pa ni dovoljeno. Pri indeksih ne smemo mešati negativnih in pozitivnih števil. 24

Bolj splošnejša zaporedja dobimo s funkcijo seq. Pri pisanju zank je še posebej uporabna funkcija seq_len, ki ima samo en argument in sicer dolžino zaporedja. Njena prednost je v tem, da če je dolžina 0, dejansko kreira vektor dolžine 0. > seq(from=1, to = 11, by= 2) [1] 1 3 5 7 9 11 > seq(from=1, to = 12, by= 2) #enako, ker pri koraku 2 število 12 tako ali tako i [1] 1 3 5 7 9 11 > seq(from=10, to = 0, by= -1) #v obratnem vrstnem redu [1] 10 9 8 7 6 5 4 3 2 1 0 > n<-5 > 1:n [1] 1 2 3 4 5 > seq_len(n) #enako kot zgoraj [1] 1 2 3 4 5 > n<-0 > 1:n #morda ne ravno tisto, kar smo pričakovali [1] 1 0 > seq_len(n) #vektor dolžine 0 - bistveno bolj varno pri zankah integer(0) > seq(length.out=n) #enako kot prej integer(0) Elementom vektorja (in tudi drugih struktur, ki jih bomo spoznali kasneje) lahko damo tudi imena ali kot ustvarimo objekt ali kasneje s funkcijo names. S funkcijo names jih tudi prikličemo. Imena lahko uporabimo namesto indeksov za dostopanej do posameznih elementov. > a<-1:3 #ustvarimo vektor brez imen > a #ni imen [1] 1 2 3 > names(a)<-c("a","b","c") > a #členi imajo sedaj imena, ki se izpišejo nad njimi a b c 1 2 3 25

> a["b"] #izberemo 2. element - b b 2 > #če želimo izbrati več kot en element moramo uporabiti vektor > #imen > a[c("a","c")] a c 1 3 > names(a)<-null #imena izbrišemo > b<-c("1a"=1,b=2,"3. element"=3) #imena podamo ob nastanku > #če imamo v imenih presledke ali če se začnejo z številko > #jih moramo dati v narekovaje, sicer ni nujno > b 1a b 3. element 1 2 3 > names(b)[2]<-"bbb" #spremenimo ime 2. člena > b 1a bbb 3. element 1 2 3 3.3 Nominalne in ordinalne spremenljivke Čeprav bi nominalne spremenljivke lahko predstavili z znakovno spremenljivko spremenljivko (character), je priporočljivo, da za njih uporabljamo tip factor, saj je to bolj varno (definiramo lahko kategorije) in bolj učinkovito. Ustvarimo jo s funkcijo factor oz. spremenimo iz znakovne spremenljivke s funkcijo as.factor. Zelo pomembni argumenti funkcije factor so: levels Vrednosti, ki jih spremenljivka lahko zavzame. Vrednosti morajo torej biti take (lahko le del) kot vrednosti originalne spremenljivke. Če je argument podan, se vse vrednosti spremenljivke, ki niso tu navedene, izločijo. Če je vrednost argumenta ordered=true, podajo tudi vrstni red vrednosti. Privzeta vrednost so vse vrednosti spremenljivke v vrstnem redu, kot se prvič pojavijo (kar je zelo pomembno za pravilno uporabo labels). 26

labels Imena za posamezne vrednosti. Prvo ime je ime vrednosti, ki je kot prva podana v levels, drugo ime za vrednost, ki je podana kot druga v levels,... Uporaba labels brez levels ni priporočljiva, se pa moramo v tem primeru zavedati, kakšna je privzeta vrednost za levels (glejte zgoraj) ordered Ali naj bo faktor urejen, torej ordinalna spremenljivka. Pravilen tip spremenljivke je pri R -ju zelo pomemben, ker se upošteva tudi pri statističnih modelih. Npr. pri linearni regresiji R iz spremenljivke tipa R factor (nominalne) avtomatično tvori umetne spremenljivke. Nekaj primerov: > factor(rep(1:3,times=3)) [1] 1 2 3 1 2 3 1 2 3 Levels: 1 2 3 > #nominalna spremenljivka z vrednostmi 1, 2 in 3 > factor(rep(1:3,times=3),levels=1:3, labels=c("a","b","c")) [1] a b c a b c a b c Levels: a b c > #nominalna spremenljivka z vrednostmi "a", "b" in "c" > factor(rep(1:3,times=3),levels=c("a","b","c")) [1] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> Levels: a b c > #vse vrednosti so NA - če je levels specificiran, > #se kot veljavne vrednosti v originalni spremenljivki > #upoštevajo samo vrednosti v levels > factor(rep(1:3,times=3),labels=c("a","b","c")) [1] a b c a b c a b c Levels: a b c > #sicer kot prej z "levels", a bolj nevarno > #(npr, če bi bila prva vrednost 3), bi "a" predstavljal 3 > factor(rep(1:3,times=3),labels=c("a","b","c"),levels=c(3,1,2)) [1] b c a b c a b c a Levels: a b c > #ker je podal levels v drugačnem vrstnem redu, > #sedaj "a" predstavlja 3 27

> > factor(rep(1:3,times=3),ordered=true) [1] 1 2 3 1 2 3 1 2 3 Levels: 1 < 2 < 3 > #ordinalna spremenljivka > factor(rep(1:3,times=3),ordered=true,levels=c(3,1,2)) [1] 1 2 3 1 2 3 1 2 3 Levels: 3 < 1 < 2 > #drugačen vrstni red kategorij > factor(rep(1:3,times=3),ordered=true,levels=c(3,1,2), labels=c("c","a","b")) [1] a b c a b c a b c Levels: c < a < b > #drugačen vrstni red kategorij z imeni > #imena smo nastavili tako, da "a" predstavlja 1,... > f1<-factor(rep(1:3,times=3),levels=1:3,labels=c("a","b","c")) > factor(f1,ordered=true,levels=c("c","a","b")) [1] a b c a b c a b c Levels: c < a < b 3.4 Seznam Seznam (ang. oz. v R -ju list) je posebna oblika vektorja, kjer so elementi lahko karkoli (kateri koli elementi, se pravi posamezna števila, vektorji, matrike, podatkovni okvirji, seznami, celo funkcije). Ustvarimo jih s funkcijo list ali tako, za s funkcijo c skupaj zlepimo sezname. Do posameznih elementov dostopamo tako, da njihove indekse ali imena navedemo med dvojne oglate oklepaje - [[]]. Če navedemo imena ali indekse v enojnih oglatih oklepajih [], potem je rezultat nov seznam z izbranimi elementi (tudi če izberemo samo enega) Če imajo elementi imena, lahko do njih dostopamo tudi tako, da za imenom seznama napišemo znak za dolar $, ki mu sledi ime elementa. Zelo uporabni funkciji na seznamih sta sestrski funkciji lapply in sapply. Obe funkciji poskušata neko funkcijo (ki jo podamo kot argument) uporabiti na vseh. Razlika je v tem, da poskuša sapply poenostaviti rezultat (v vektor ali matriko), lapply pa vedno vrne seznam. 28

> l<-list(a=c("ups","abc"),b=1:5,c=list(aa="a",bb=5:7),d=list) > #združili smo zelo različne elemente - zadnji je funkcija c > > l[["a"]] #izberemo 1. element - vektor [1] "ups" "abc" > l[[1]] #enako [1] "ups" "abc" > l["a"] #naredimo seznam, ki ima samo 1. element starega $a [1] "ups" "abc" > l[1] #enako $a [1] "ups" "abc" > l[1:3] #izberemo prve 3 elemente $a [1] "ups" "abc" $b [1] 1 2 3 4 5 $c $c$aa [1] "a" $c$bb [1] 5 6 7 > # l[[1:3]] #ne deluje - oz. ima drugačno funkcijo > > > l[["c"]][[2]][1] [1] 5 > #izbrali smo 3. element (c) osnovnega seznama, > #ki pa je tudi seznam > #v tem seznamu smo izbrali 2. element, ki je vektor > #v vektorju smo izbrali 1. element (številko 5) > l[[3]][[2]][1] #enako 29

[1] 5 > l[[3]][[2]] #izberemo 2. element v 3. elementu [1] 5 6 7 > l[[3:2]] #tokrat deluje in je enako kot zgoraj [1] 5 6 7 > #močno odsvetujem > > l$a #če imamo imena lahko uporabimo tudi ta način [1] "ups" "abc" > l$c$aa #deluje tudi v več stopnjah [1] "a" > x<-l$d(3,4,6) #če je element seznama funkcija jo > #lahko tudi uporabimo > x [[1]] [1] 3 [[2]] [1] 4 [[3]] [1] 6 > l #da se spomnimo, kaj je l $a [1] "ups" "abc" $b [1] 1 2 3 4 5 $c $c$aa [1] "a" $c$bb [1] 5 6 7 30

$d function (...).Primitive("list") > lapply(l,fun=length) #izračunamo dolžino vseh elementov $a [1] 2 $b [1] 5 $c [1] 2 $d [1] 1 > #zdaj smo dobili seznam > > sapply(l,fun=length) #sapply vrne vektor a b c d 2 5 2 1 3.5 Matrika Matrika je pravzaprav vektor (katerekoli oblike razen seznama), ki ima dve dimenziji (stolpce in vrstice). Do elementov dostopoma tako, da v oglatih oklepajih navedemo indekse ali imena celic v obeh dimenzijah (ločene z vejicami - [a,b]), ki jih želim izbrati. Če želimo v kaki dimenziji izbrati vse celice, lahko indekse/imena za to dimenzijo izpustimo (vseeno moramo pisati vejico). Kreiramo jo s funkcijo matrix. Natančneje lahko v pomoči preberemo, da ima sledeče argumente. Vrednosti, ki so tu pripisane argumentom so privzete vrednosti. matrix(data = NA, nrow = 1, ncol = 1, byrow = FALSE, dimnames = NULL) Matriko lahko ustvarimo tudi tako, da zlepimo skupaj vektorje kot stolpce (funkcija cbind) ali vrstice (funkcija rbind). >?matrix #dostop do pomoči za razlago argumentov > A<-matrix(data=1:24,nrow=6) #ustvarimo matriko s 6 vrsticami 31

> #in 4 stolpci -> ker je 24 > #elementov v data > > A #ustvarjena matrika [,1] [,2] [,3] [,4] [1,] 1 7 13 19 [2,] 2 8 14 20 [3,] 3 9 15 21 [4,] 4 10 16 22 [5,] 5 11 17 23 [6,] 6 12 18 24 > A[3,2] #izberemo 2. element v 3. vrstici [1] 9 > #oz. vse elemente, ki so v 3. vrstici in 2. stolpcu > > A[3,] #izberemo 3. vrstico [1] 3 9 15 21 > A[,2] #izberemo 2. stolpec [1] 7 8 9 10 11 12 > A[1:3,] #izberemo prve 3 vrstice [,1] [,2] [,3] [,4] [1,] 1 7 13 19 [2,] 2 8 14 20 [3,] 3 9 15 21 > #izberemo elemente, ki so v 2. ali 3. vrstici in > #v 1. ali 4. stolpcu > A[c(2,4),c(1,4)] [,1] [,2] [1,] 2 20 [2,] 4 22 > a<-1:4 > b<-2:5 > B<-cbind(a,b) #matrika z dvema stolpcema > B a b [1,] 1 2 32

[2,] 2 3 [3,] 3 4 [4,] 4 5 > C<-rbind(a,b) #matrika z dvema vrsticama > C [,1] [,2] [,3] [,4] a 1 2 3 4 b 2 3 4 5 R vsebuje tudi jezik za matrično računanje. Pri tem sta najpomembnejša argument za matrično moženje %*% funkcija solve, ki omogoča izračun inverzne matrike. Nekaj primerov. > A<-matrix(data=1:24,nrow=6) > #klasično se operacije pri matriki izvajajo tako kot pri > #vektorjih, torej po elementih > A+2 [,1] [,2] [,3] [,4] [1,] 3 9 15 21 [2,] 4 10 16 22 [3,] 5 11 17 23 [4,] 6 12 18 24 [5,] 7 13 19 25 [6,] 8 14 20 26 > A/2 [,1] [,2] [,3] [,4] [1,] 0.5 3.5 6.5 9.5 [2,] 1.0 4.0 7.0 10.0 [3,] 1.5 4.5 7.5 10.5 [4,] 2.0 5.0 8.0 11.0 [5,] 2.5 5.5 8.5 11.5 [6,] 3.0 6.0 9.0 12.0 > A*2 [,1] [,2] [,3] [,4] [1,] 2 14 26 38 [2,] 4 16 28 40 [3,] 6 18 30 42 [4,] 8 20 32 44 [5,] 10 22 34 46 33

[6,] 12 24 36 48 > A+A [,1] [,2] [,3] [,4] [1,] 2 14 26 38 [2,] 4 16 28 40 [3,] 6 18 30 42 [4,] 8 20 32 44 [5,] 10 22 34 46 [6,] 12 24 36 48 > A*A #tudi če je operacija množenje [,1] [,2] [,3] [,4] [1,] 1 49 169 361 [2,] 4 64 196 400 [3,] 9 81 225 441 [4,] 16 100 256 484 [5,] 25 121 289 529 [6,] 36 144 324 576 > #to ni matrično množenje > > A*(1:4) [,1] [,2] [,3] [,4] [1,] 1 21 13 57 [2,] 4 32 28 80 [3,] 9 9 45 21 [4,] 16 20 64 44 [5,] 5 33 17 69 [6,] 12 48 36 96 > #tako kot pri računanju z vektorji se krajši "reciklira" > #se tolikokrat ponovi, da doseže dolžino daljšega > > t(a) #transponiramo matriko - zamenjamo vrstice in stolpce [,1] [,2] [,3] [,4] [,5] [,6] [1,] 1 2 3 4 5 6 [2,] 7 8 9 10 11 12 [3,] 13 14 15 16 17 18 [4,] 19 20 21 22 23 24 > dim(a) #ugotovimo dimeziji matrike 34

[1] 6 4 > dim(t(a)) #pri transponirani matriki sta ravno obrnjene [1] 4 6 > A %*% t(a) #matrično množenje [,1] [,2] [,3] [,4] [,5] [,6] [1,] 580 620 660 700 740 780 [2,] 620 664 708 752 796 840 [3,] 660 708 756 804 852 900 [4,] 700 752 804 856 908 960 [5,] 740 796 852 908 964 1020 [6,] 780 840 900 960 1020 1080 > A %*% (1:4) #matrično množenje z vektorjem [,1] [1,] 130 [2,] 140 [3,] 150 [4,] 160 [5,] 170 [6,] 180 > #R avtomatično poskrbi, da je vektor ustrezen > #(stolpični ali vrstični) > #bolje je sicer, če ze zo poskrbimo sami > a<-matrix(1:4,ncol=1) #stolpični vektor > A %*% a [,1] [1,] 130 [2,] 140 [3,] 150 [4,] 160 [5,] 170 [6,] 180 > #Izračunamo lahko tudi inverz matrike > # Seveda samo kvadratne in take z neničelno determinanto > AA <- A %*% t(a) #naredimo kvadratno matriko > det(aa) #izračunamo determinanto [1] 5.494284e-59 35

> ##leta je praktično nič, zato te matrike ne moremo uporabiti > > B<-matrix(c(1,6,3,7,3,7,3,7,9),ncol=3) > #naredimo kvadratno matriko, katere determinanta ni 0 > det(b) #izračunamo determinanto [1] -154 > invb<-solve(b) #izračunamo inverz matrike B > #shranili smo ga v invb > invb #izpišemo [,1] [,2] [,3] [1,] 0.1428571 2.727273e-01-0.25974026 [2,] 0.2142857 4.205453e-18-0.07142857 [3,] -0.2142857-9.090909e-02 0.25324675 > B %*% invb #dokaz, da smo izralčunali inverz [,1] [,2] [,3] [1,] 1.000000e+00 8.326673e-17 0 [2,] -3.053113e-16 1.000000e+00 0 [3,] -1.387779e-16 1.387779e-16 1 > #rezultat je enotska matrika > #na diagonali so samo enice, drugod povsod ničle > #nekatere vrednosti niso 0, ampak skoraj nič zaradi > #nenatančnosti izračuna -> nekatere vrednosti v računalniku > #ne moremo predstaviti natančno > zapsmall(b%*%invb) [,1] [,2] [,3] [1,] 1 0 0 [2,] 0 1 0 [3,] 0 0 1 Podobno kot lahko na seznamih uporabljamo funkciji lapply in sapply, lahko na matrikah uporabimo funkcijo apply. Tej moramo poleg matrike in funkcije podati tudi dimenzijo (vrstice ali stoplce), na kateri želimo funkcijo uporabiti. > A<-matrix(data=1:24,nrow=6) > apply(x=a,margin=1,fun=sum) #vsota po vrsticah [1] 40 44 48 52 56 60 > apply(x=a,margin=2,fun=sum) #vsota po stolpcih 36

[1] 21 57 93 129 3.6 Array Nadgradnja matrike je array. Od matrike se razlikuje po tem, da ima poljubno število dimenzij. Za več poglejte?array. Tudi na array-ih je mogoče uporabiti funkcijo apply. 3.7 Podatkovni okvir - Data frame Podatkovni okvir je podatkovna struktura, ki je običajno najbolj primerna za shranjevanje podatkovji. Ima podobno vlogo in strukturo kot podatkovne datoteke pri ostalih statističnih programih, npr. SPSS-u. V vrsticah so enote, v stolpcih pa spremenljivke oz. vektorji. Podatkovni okvirji imajo tako nekatere lastnosti matrik, pa tudi nekatere lastnosti seznamov. So po eni strani podobni matrikam, vendar pa imajo pri podatkovnih okvirjih lahko stolpci hranijo različne tipe podatkov. Še bolj so podobni seznamom, saj so pravzaprav seznami, kjer so vsi elementi vektorji enake dolžine. Se pravi so seznami, kjer je vsak element neka spremenljivka (v statističnem smislu). Tako tudi lahko do elementov dostopamo na način, kot pri seznamih, ali na način, kot pri matrikah. Podatkovni okvir ustvarimo s funkcijo data.frame ali takotako, da vanj preoblikujemo matriko ali seznam (mora biti ustrezne oblike) s funkcijo as.data.frame. > #Ustvarimo nekaj vektorjev > #recimo da vrednosti generiramo slučajno iz normalne porazdelitve > x1<-rnorm(n=10,mean=176,sd=7) > x2<-rnorm(n=10,mean=100,sd=15) > #in še eno nenumerično > x3<-sample(c("a","b","c"),size=10,replace=true) > #izberemo vzorec s ponavljanjem velikosti 10 > podatki<-data.frame(x1,x2,x3) > podatki x1 x2 x3 1 182.3704 91.55786 c 37

2 188.2935 111.80336 b 3 176.8893 90.28650 c 4 177.8618 88.29951 b 5 183.5603 86.47712 a 6 176.0656 116.92817 a 7 178.6895 94.24260 b 8 172.2692 91.10079 a 9 170.2422 98.12461 b 10 175.6734 92.75962 b > names(podatki) #imena kot pri seznamu [1] "x1" "x2" "x3" > dim(podatki) #preverimo dimenzijo kot pri matriki [1] 10 3 > colnames(podatki) #preverimo imena stolpcev kot pri matriki [1] "x1" "x2" "x3" > dimnames(podatki) #kot pri matriki- imena stolpcev in vrstic [[1]] [1] "1" "2" "3" "4" "5" "6" "7" "8" "9" "10" [[2]] [1] "x1" "x2" "x3" > #izbiramo stolpce > podatki[,"x1"] #kot pri matriki (stolpci so 2. dimenzija) [1] 182.3704 188.2935 176.8893 177.8618 183.5603 176.0656 [7] 178.6895 172.2692 170.2422 175.6734 > podatki$x1 #kot pri seznamu [1] 182.3704 188.2935 176.8893 177.8618 183.5603 176.0656 [7] 178.6895 172.2692 170.2422 175.6734 > podatki["x1"] #kot pri seznamu - to je še vedno pod. okvir x1 1 182.3704 2 188.2935 3 176.8893 4 177.8618 5 183.5603 38

6 176.0656 7 178.6895 8 172.2692 9 170.2422 10 175.6734 > podatki[c("x1","x3")] #kot pri seznamu - to je še vedno pod. okvir x1 x3 1 182.3704 c 2 188.2935 b 3 176.8893 c 4 177.8618 b 5 183.5603 a 6 176.0656 a 7 178.6895 b 8 172.2692 a 9 170.2422 b 10 175.6734 b > podatki[["x1"]] #kot pri seznamu - to je zdaj vektro [1] 182.3704 188.2935 176.8893 177.8618 183.5603 176.0656 [7] 178.6895 172.2692 170.2422 175.6734 > #vrstice > podatki[1:3,] #kot pri matriki (vrstice so 2. dimenzija) x1 x2 x3 1 182.3704 91.55786 c 2 188.2935 111.80336 b 3 176.8893 90.28650 c > #elemente > podatki[2,"x1"] #kot pri matriki [1] 188.2935 > #tako lahko tudi več na enkrat > podatki[2:4,c("x1","x3")] #kot pri matriki x1 x3 2 188.2935 b 3 176.8893 c 4 177.8618 b > podatki$x1[1:3] #kot pri seznamu - samo v 1. stolpcu naenkrat 39

[1] 182.3704 188.2935 176.8893 > podatki[["x1"]][1:3] #kot pri seznamu - samo v 1. stolpcu naenkrat [1] 182.3704 188.2935 176.8893 3.8 Vaje 3.8.1 Vaja 1 Recimo da imate sledeče vrednosti: 10, 23, 43, 43, 32, 12 Izračunajte povprečje, varianco in standardni odklon. Za izračun vsote lahko uporabite funkcijo sum, bolj naprednih vgrajenih funkcij pa ne uporabljajte (za varianco, standardni odklon,...) 3.8.2 Vaja 2 Recimo, da imamo tri spremenljivke - y, x1 in x2, ki imajo sledeče vrednosti: y: 10, 23, 43, 43, 32, 12 x1: 1.5, 2.3, 5.4, 4.5, 4.2, 1.0 x2: 210, 183, 186, 164, 175, 200 Recimo, da je y odvisna spremenljivka in x1 ter x2 neodvisni spremenljivki. S pomočjo matričnega računanja izračunajte vrednosti regresijskih koeficientov, napovedan vrednosti in vrednosti rezidualov. Poskrbite, da bodo vse vsi trije rezultati vektorji (rezultat matričnega računanja je matrika) Vse tri rezultate shranite v seznam. Namig: Matrična formula za izračun regresijskih koeficientov je: β = (X X) 1 X y, kjer je matrika X sestavljena iz stolpca enic in po enega stolpca za vsako neodvisno spremenljivko. Formula za izračun napovedi pa je: y = Xβ 40

4 Funkcije in programiranje Zaporedje ukazov, ki jih pogosto uporabljamo skupaj, je smiselno združiti skupaj v funkcijo. To omogoča, da jih zelo enostavno večkrat uporabimo na različnih podatkih. 4.1 Nekaj zelo koristnih funkcij Poleg statističnih funkcij, R vsebuje tudi veliko funkcij za manipulacijo s podatki. Navedimo le nekaj najpomembnejših. sort Uredi enote (v vektorju po velikosti) order Vrne zaporedno številko vsake enote, če jih uredimo glede na določen način. Zelo uporabno za šortiranje podatkovnih okvirjev na.omit Iz podatkovnega okvirja izbriše vse enote (vrstice), kjer nastopajo manjkajoče vrednosti. To nam omogoča, da imamo pri vseh spremenljivkah upoštevamo iste enote. attributes Vrne lastnosti ( attributes ) nekega objekta. sample Vrne slučajen vzorec izbrane velikosti iz izbranega vektorja ali seznama. Privzeto je vzorčenje brez ponavljanja, lahko pa tudi nastavimo s ponavljanjem. Če želimo, lahko tudi nastavimo verjetnosti za posamezne elemente. which Vrne indekse (zaporedne številke), pri katerih je vrednost izraza TRUE (nek pogoj izpolnjen) Poleg funkcij so pomembni tudi operatorji, ki so sicer tudi neke vrste funkcije. Operatorji primerjav == (je enako - dva enačaja!!!, >=, <=, >, <,!= (ni enako).! Operator negacije. Uporablja se z logičnimi vrednostmi - TRUE spremeni v FALSE in obratno %in% Operator vsebovanja. Pove, ali so elementi 1. vektorja vsebovani v 2. elementu. > x1 <- podatki$x1 > x1 #originalna razporeditev [1] 182.3704 188.2935 176.8893 177.8618 183.5603 176.0656 [7] 178.6895 172.2692 170.2422 175.6734 > sort(x1) #urejene po velikosti naraščajoče 41

[1] 170.2422 172.2692 175.6734 176.0656 176.8893 177.8618 [7] 178.6895 182.3704 183.5603 188.2935 > sort(x1, decreasing = TRUE) #urejene po velikosti padajoče [1] 188.2935 183.5603 182.3704 178.6895 177.8618 176.8893 [7] 176.0656 175.6734 172.2692 170.2422 > order(x1) #zaporedne št., da bi bili urejeni po vrsti [1] 9 8 10 6 3 4 7 1 5 2 > x1[order(x1)] #enak rezultat kot sort(x1) [1] 170.2422 172.2692 175.6734 176.0656 176.8893 177.8618 [7] 178.6895 182.3704 183.5603 188.2935 > podatki #originalni vrstni red x1 x2 x3 1 182.3704 91.55786 c 2 188.2935 111.80336 b 3 176.8893 90.28650 c 4 177.8618 88.29951 b 5 183.5603 86.47712 a 6 176.0656 116.92817 a 7 178.6895 94.24260 b 8 172.2692 91.10079 a 9 170.2422 98.12461 b 10 175.6734 92.75962 b > podatki[order(podatki$x3),] x1 x2 x3 5 183.5603 86.47712 a 6 176.0656 116.92817 a 8 172.2692 91.10079 a 2 188.2935 111.80336 b 4 177.8618 88.29951 b 7 178.6895 94.24260 b 9 170.2422 98.12461 b 10 175.6734 92.75962 b 1 182.3704 91.55786 c 3 176.8893 90.28650 c > #podatki, urejeni po velikosti x3 (a,b,c) > podatki[order(podatki$x3,podatki$x1),] 42

x1 x2 x3 8 172.2692 91.10079 a 6 176.0656 116.92817 a 5 183.5603 86.47712 a 9 170.2422 98.12461 b 10 175.6734 92.75962 b 4 177.8618 88.29951 b 7 178.6895 94.24260 b 2 188.2935 111.80336 b 3 176.8893 90.28650 c 1 182.3704 91.55786 c > #podatki, urejeni najprej glede na x3 > #znotraj kategorij x3 pa glede an x1 > > podatkina<-podatki #skopiramo podatke > #dodajmo v podatke manjkajoče vrednosti NA > podatkina[3,"x1"]<-na > podatkina[6,"x2"]<-na > podatkina[2,"x3"]<-na > podatkina[3,"x2"]<-na > podatkina #podatki z manjkajočimi vrednostmi x1 x2 x3 1 182.3704 91.55786 c 2 188.2935 111.80336 <NA> 3 NA NA c 4 177.8618 88.29951 b 5 183.5603 86.47712 a 6 176.0656 NA a 7 178.6895 94.24260 b 8 172.2692 91.10079 a 9 170.2422 98.12461 b 10 175.6734 92.75962 b > podatkinaomit<-na.omit(podatkina) > #odstranimo podatke z manjkajočimi enotami > podatkinaomit x1 x2 x3 1 182.3704 91.55786 c 4 177.8618 88.29951 b 5 183.5603 86.47712 a 43

7 178.6895 94.24260 b 8 172.2692 91.10079 a 9 170.2422 98.12461 b 10 175.6734 92.75962 b > attributes(podatkinaomit)$na.action 2 3 6 2 3 6 attr(,"class") [1] "omit" > #informacija o tem, katere vrstice smo odstranili > > sample(x=1:100,size=5) [1] 87 74 38 78 77 > #slučajni vzorec 5 enot iz vektorja 1:100 brez ponavljanja > sample(x=1:5,size=5) #permutacija (ker porabimo vse enote) [1] 5 4 3 2 1 > abc<-c("a","b","c") > sample(x=abc,size=10,replace=true) #vzorec s ponavljanejm [1] "b" "b" "b" "b" "c" "a" "b" "a" "b" "b" > sample(x=abc,size=10,replace=true, prob=c(0.6,0.2,0.2)) [1] "b" "a" "b" "c" "a" "c" "a" "b" "a" "c" > #vzorec s ponavljanjem - različne verjetnosti izbora > > abc<-c("a","b","c") > rep(abc,times=3) #vektor ponovimo 3-krat [1] "a" "b" "c" "a" "b" "c" "a" "b" "c" > rep(abc,each=3) #vsak element ponovimo 3-krat [1] "a" "a" "a" "b" "b" "b" "c" "c" "c" > rep(abc,each=3,times=2) [1] "a" "a" "a" "b" "b" "b" "c" "c" "c" "a" "a" "a" "b" "b" [15] "b" "c" "c" "c" > #vsak element ponovimo 3-krat, vektro 2-krat > > 44

> x<-sample(x=abc,size=10,replace=true, prob=c(0.6,0.2,0.2)) > x [1] "b" "a" "a" "a" "a" "a" "c" "a" "a" "a" > which(x=="a") #na katerih mestih so a-ji [1] 2 3 4 5 6 8 9 10 > x[which(x=="a")] [1] "a" "a" "a" "a" "a" "a" "a" "a" > x %in% c("b","c") [1] TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE [10] FALSE >!(x=="a") #enako [1] TRUE FALSE FALSE FALSE FALSE FALSE TRUE FALSE FALSE [10] FALSE Poleg zgornjih je potrebno omeniti še funkcije za generiranje pseudo slučajnih števil. R vsebuje mnogo funkcij za generiranje slučajnih vrednosti iz različnih porazdelitev. Naj omenimo samo najpomembnejše: rnorm Normalna porazdelitev runif Enakomerna porazdelitev rbinom Binomska porazdelitev rexp Eksponentna porazdelitev rf F porazdelitev rt t porazdelitev r??? Še kar nekaj drugih porazdelitev. Ime funkcije se vedno začne z r, sledi oznaka (ime ali okrajšava) za porazdelitev. Vse zgoraj navedene funkcije sprejmejo kot prvi argument n, ki pove, koliko števil želimo generirati. Poleg tega kot dodatne argumente sprejmejo prametre porazdelitve. Pozor: Porazdelitvene funkcije so lahko definirane drugače, kot ste navajeni. Opomba: Vse zgoraj navedene funkcije imajo tudi svoje sestre, ki se namesto z r začnejo z: d Funkcija gostote p (Kumulativna) porazdelitvena funkcija q Kvantilna funkcija - vrne vrednost, ki pripada določnem kvantilnem rangu 45