Основне функције
Рачунање израза:
4+4
(2*2)+1
5/0
Елементарне функције:
exp(), cos(), sin(), tan(), log(), log10(), sqrt(),...
Аритметички оператори: +,-,*,/,...
Логички оператори:
<=,>=, ==, !=, <,>, & , |, !,...
Ако нас занима више о некој функцији:
help(cos) # ili
?cos
example(exp)
За покретање линије кода (за RStudio): \(Ctrl+Enter\)
Све од знака #
до краја реда је КОМЕНТАР!
Променљиве
Подаци се у R чувају у променљивим. Приликом декларације променљиве не наводимо тип променљиве, већ јој само додељујемо вредност. Име променљиве може да садржи слова, бројеве и тачку, а битно је да почиње словом. R је case sensitive, дакле X!=x.
- Основни типови података су:
numerical, character, logical
- Специјални типови података су:
missing values, NULL, NaN, - / + Inf
Оператор доделе у R-у је <-
, али може да се користи и
=
.
<- 9 x
Постоји и оператор ->
за доделу са друге стране.
9 -> x
Нумеричке променљиве
Променљиве којима додељујемо неке нумеричке вредности. Нумеричке вредности су подразумевано типа double.
<- 3 # isto sto i 3->x
x # ispisivanje vrednosti x
## [1] 3
Овако декларисану променљиву можемо користити и у различитим изразима:
x+x
x+3
exp(x^2)
Променњиве типа character
променљиве које садрже неке стрингове
<- "neke reci"
x x
## [1] "neke reci"
Логичке променњиве
променљиве логичког типа могу да имају вредности TRUE или FALSE (у R-у је исто што и T, F)
<- TRUE
A #ili A
## [1] TRUE
<- T
A A
## [1] TRUE
Логичке променљиве се добијају и као резултат релацијских израза:
3<4
3!=3
<- (2<4)&(3==3)
x x
## [1] TRUE
Провера типа података
is.numeric(x)
## [1] FALSE
is.character(x)
## [1] FALSE
is.logical(x)
## [1] TRUE
Вектори
- начин представљања низова у R-у
- индексирање почиње од 1
Начини задавања вектора:
- функција COMBINE
<- c(2,3,4,4)
v v
## [1] 2 3 4 4
- задавањем почетног и крајњег елемента низа
<- 1:30
v v
## [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] 26 27 28 29 30
- функција SEQUENCE
Задајемо почетни и крајњи елемент вектора ако желимо да се сваки следећи елемент увећа за 1.
<- seq(5,25)
v v
## [1] 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
Ако желимо да корак буде различит од 1, наводимо корак као трећи аргумент функције seq(). За многе функције постоје опциони аргументи који ако се експлицитно не наведу у позиву функције, узимају неку default вредност. Овде је та вредност 1.
<- seq(5,25,5)
v v
## [1] 5 10 15 20 25
<- seq(0,1,0.1)
v v
## [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
Ако желимо опадајући низ, ставимо да корак буде негативан.
<- seq(10,1,-1)
v v
## [1] 10 9 8 7 6 5 4 3 2 1
Приступање елементима вектора
v[1]
Мењање вредности елемената вектора
2] <- 27
v[ v
## [1] 10 27 8 7 6 5 4 3 2 1
Додавање новог елемента на крај вектора
11] <- 0
v[ v
## [1] 10 27 8 7 6 5 4 3 2 1 0
Издвајање подвектора
Подвектор можемо издвојити навођењем индекса елемената које желимо да издвојимо.
v[1:3]
v[c(1,3)] # Podvektor koji sadrzi prvi i treci element
Фукнције скалара примењене на векторе
- делују на сваки елемент вектора посебно
sin(v)
v+1
v/2
НАПОМЕНА: оператор :
има већи приоритет од аритметичких
операција
<- 10
n <- 1:n-1
v1 v1
## [1] 0 1 2 3 4 5 6 7 8 9
<- 1:(n-1)
v2 v2
## [1] 1 2 3 4 5 6 7 8 9
Функције за рад са векторима
length(v)
max(v)
min(v)
range(v)
sort(v)
order(v)
sum(v)
mean(v) # uzoracka sredina
var(v) # popravljena uzoracka disperzija
sd(v) # standardna devijacija
Копија вектора помоћу функције rep()
REPLICATE и
варијанте ове функције
rep(v)
rep(v,5) # novi vektor koji sadrzi 5 nadovezanih kopija pocetnog, isto sto i rep(v,times=5)
rep(v,each=3) # kopira svaki element 3 puta uzastopno
rep(v,length.out=2) # kopira prva dva elementa
NA вредности - not available
v <- c(1,4,6,NA,23)
sum(v)
Ако желимо да функција игнорише NA
вредности
sum(v,na.rm=T)
na.omit(v)
Вектори стрингова
v <- c("aaaa","c","bbb")
sort(v)
Логички вектори
- добијају се као резултат релацијских израза са векторима
v <- c(2,6,3,7,8)
v==1:5 # Poredi svaki element vektora sa odgovarajucim
v>3 # Poredi svaki element sa 3
Операције између два вектора
<- c(1,2,3,4)
a <- c(2,3,4,5)
b <- a/b
r r
## [1] 0.5000000 0.6666667 0.7500000 0.8000000
Матрице
Матрице су дводимензиони вектори. Начини задавања матрица су:
- Матрицу правимо од елемената једнодимензионог вектора променом димензија
<- 1:12
x dim(x) <- c(3,4) # x je sada 2D vektor sa 3 vrste i 4 kolone
x
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
- Матрицу формирамо помоћу функције
matrix
<- matrix(1:12, nrow=3) # nrow = broj vrsta matrice
x x
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
<- matrix(1:12,ncol=4) # ncol = broj kolona
x x
## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
Примећујемо да се при креирању матрице прво попуњава елементима прва
колона, па друга, итд. Ако хоћемо да се матрица попуњава по колонама
додамо параметар byrow
.
<- matrix(1:12,nrow=3,byrow=T)
x x
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
## [3,] 9 10 11 12
- Матрица се може добити налепљивањем вектора помоћу функција
cbind
(везује векторе као колоне матрице) иrbind
(везује векторе као врсте матрице)
<- 1:4
a a
## [1] 1 2 3 4
<- 5:8
b b
## [1] 5 6 7 8
<- 9:12
c c
## [1] 9 10 11 12
<- cbind(a,b,c)
M1 M1
## a b c
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
<- cbind(1:4,5:8,9:12) # skraceno
M2 M2
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
<- rbind(1:4,5:8,9:12)
M3 M3
## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
## [3,] 9 10 11 12
- Давање имена колонама и врстама матрице помоћу функција
colnames
иrownames
rownames(x) <- c('A','B','C')
- Приступање елементима матрице
<- x[1,2]
u u
## A
## 2
<- x[3,]
v v
## [1] 9 10 11 12
<- x[,4]
w w
## A B C
## 4 8 12
Операције са матрицама
<- matrix(c(2,5,3,7,5,1,7,4,3),ncol=3)
x t(x) # Transponovana matrica
## [,1] [,2] [,3]
## [1,] 2 5 3
## [2,] 7 5 1
## [3,] 7 4 3
diag(x) # Samo elementi sa dijagonale
## [1] 2 5 3
det(x) # Determinanta
## [1] -69
solve(x) # Inverzna matrica
## [,1] [,2] [,3]
## [1,] -0.15942029 0.2028986 0.1014493
## [2,] 0.04347826 0.2173913 -0.3913043
## [3,] 0.14492754 -0.2753623 0.3623188
- Множење матрица
<- cbind(1:3,4:6,7:9)
a <- cbind(7:9,4:6,1:3)
b *b # Mnozenje elemenata sa istim indeksom a
## [,1] [,2] [,3]
## [1,] 7 16 7
## [2,] 16 25 16
## [3,] 27 36 27
%*%b # Matricno mnozenje a
## [,1] [,2] [,3]
## [1,] 102 66 30
## [2,] 126 81 36
## [3,] 150 96 42
rowSums(x) # suma po redovima
## [1] 16 14 7
rowMeans(x) # srednja vrednosti po redovima
## [1] 5.333333 4.666667 2.333333
colSums(x) # suma po kolonama
## [1] 10 13 14
colMeans(x) # srednja vrednost po kolonama
## [1] 3.333333 4.333333 4.666667
Фактори
Фактори се користе када податке сврставамо у категорије. Сваки фактор има неколико категорија/нивоа (level). Најчешће се те категорије описују бројевима (0 - мушко, 1- женско).
- Пример 1 - пол
<- c(0,0,1,0,1)
pol <- factor(pol,levels=0:1) # pol posmatramo kao faktor, cije su moguce vrednosti 0 i 1
fpol fpol
## [1] 0 0 1 0 1
## Levels: 0 1
levels(fpol) <- c("muski","zenski")# dodeljujemo znacenje levelima faktora
fpol
## [1] muski muski zenski muski zenski
## Levels: muski zenski
levels(fpol)
## [1] "muski" "zenski"
as.numeric(fpol) #prikazuje kako su leveli kodirani, uvek pocinje od 1 (1,2,..)
## [1] 1 1 2 1 2
- Пример 2 - степен бола
<- c(0,3,2,2,1) # Pravimo vektor za 5 pacijenata, gde su elementi stepeni bola
bol <- factor(bol,levels=0:3) # Pravimo faktor
fbol levels(fbol) <- c("nema","slab","umeren","jak") # Dajemo imena levelima da bismo znali kako da interpretiramo brojeve
fbol
## [1] nema jak umeren umeren slab
## Levels: nema slab umeren jak
as.numeric(fbol) # Dodelio je levelima 1,2,3,4
## [1] 1 4 3 3 2
Ако се изостави параметар levels=...
, по default-у се
прави фактор од сортираних вредности из вектора. То није увек
препоручњиво, на пример ако је вектор стрингова, сортирање је по
алфабету.
Базе података (матрица података)
База података (Data frame) је листа вектора исте дужине, таква да су елементи са истим индексом повезани. Подсећа на матрицу у којој су у једној врсти подаци о једном елементу узорка (субјекту у експерименту). Имена врста су јединствена и по томе се елементи разликују.
- Креирање базе података из постојећих података, нпр. спајањем два вектора.
<- 1:12
brojevi <- letters[1:12]
slova <- data.frame(brojevi,slova)
d d
## brojevi slova
## 1 1 a
## 2 2 b
## 3 3 c
## 4 4 d
## 5 5 e
## 6 6 f
## 7 7 g
## 8 8 h
## 9 9 i
## 10 10 j
## 11 11 k
## 12 12 l
- Приступање елементима преко
$
.
$brojevi d
## [1] 1 2 3 4 5 6 7 8 9 10 11 12
$slova d
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"
- Приликом креирања базе колонама можемо доделити имена различита од ових, а можемо их и накнадно изменити.
<- data.frame(br=brojevi,sl=slova)
d d
## br sl
## 1 1 a
## 2 2 b
## 3 3 c
## 4 4 d
## 5 5 e
## 6 6 f
## 7 7 g
## 8 8 h
## 9 9 i
## 10 10 j
## 11 11 k
## 12 12 l
names(d) <- c("kol1","kol2")
d
## kol1 kol2
## 1 1 a
## 2 2 b
## 3 3 c
## 4 4 d
## 5 5 e
## 6 6 f
## 7 7 g
## 8 8 h
## 9 9 i
## 10 10 j
## 11 11 k
## 12 12 l
$kol1 d
## [1] 1 2 3 4 5 6 7 8 9 10 11 12
$kol2 d
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"
Функција attach
Функција attach
примењена на базу података омогућава нам
да приступамо елементима без навођења имена базе. За поништавање
функције attach
користи се функција
detach
.
attach(d)
kol1
## [1] 1 2 3 4 5 6 7 8 9 10 11 12
kol2
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"
detach(d)
Индексирање база података
Из базе података можемо извући податке преко $
или преко
матричне репрезентације.
d
## kol1 kol2
## 1 1 a
## 2 2 b
## 3 3 c
## 4 4 d
## 5 5 e
## 6 6 f
## 7 7 g
## 8 8 h
## 9 9 i
## 10 10 j
## 11 11 k
## 12 12 l
1, 2] # ili d$kol2[1] d[
## [1] "a"
1, ] #vraca prvu vrstu d[
## kol1 kol2
## 1 1 a
1] # vraca prvu kolonu d[ ,
## [1] 1 2 3 4 5 6 7 8 9 10 11 12
1] # vraca data frame koji sadzi prvu kolonu d d[
## kol1
## 1 1
## 2 2
## 3 3
## 4 4
## 5 5
## 6 6
## 7 7
## 8 8
## 9 9
## 10 10
## 11 11
## 12 12
- Условна селекција у бази података
$kol1 < 10,] # Baza podatakа koja sadrzi vrednost <10 u prvoj koloni d[d
## kol1 kol2
## 1 1 a
## 2 2 b
## 3 3 c
## 4 4 d
## 5 5 e
## 6 6 f
## 7 7 g
## 8 8 h
## 9 9 i
$kol1 < 10 & d$kol1%%2 == 0,]# + parne vrednosti d[d
## kol1 kol2
## 2 2 b
## 4 4 d
## 6 6 f
## 8 8 h
Додавање вектора у базу података
У R-у постоје уграђене базе, као на пример sleep
.
data(sleep) #ucitava bazu sleep u tekuci session u R-u
#ispisuje sleep
## extra group ID
## 1 0.7 1 1
## 2 -1.6 1 2
## 3 -0.2 1 3
## 4 -1.2 1 4
## 5 -0.1 1 5
## 6 3.4 1 6
## 7 3.7 1 7
## 8 0.8 1 8
## 9 0.0 1 9
## 10 2.0 1 10
## 11 1.9 2 1
## 12 0.8 2 2
## 13 1.1 2 3
## 14 0.1 2 4
## 15 -0.1 2 5
## 16 4.4 2 6
## 17 5.5 2 7
## 18 1.6 2 8
## 19 4.6 2 9
## 20 3.4 2 10
cbind(sleep, seq(20,1,-1)) # Dodajemo kolonu brojeva 20,19,18,...1
## extra group ID seq(20, 1, -1)
## 1 0.7 1 1 20
## 2 -1.6 1 2 19
## 3 -0.2 1 3 18
## 4 -1.2 1 4 17
## 5 -0.1 1 5 16
## 6 3.4 1 6 15
## 7 3.7 1 7 14
## 8 0.8 1 8 13
## 9 0.0 1 9 12
## 10 2.0 1 10 11
## 11 1.9 2 1 10
## 12 0.8 2 2 9
## 13 1.1 2 3 8
## 14 0.1 2 4 7
## 15 -0.1 2 5 6
## 16 4.4 2 6 5
## 17 5.5 2 7 4
## 18 1.6 2 8 3
## 19 4.6 2 9 2
## 20 3.4 2 10 1
rbind(sleep, c(2.0,1,1)) # isto tako mozemo dodati i vrstu
## extra group ID
## 1 0.7 1 1
## 2 -1.6 1 2
## 3 -0.2 1 3
## 4 -1.2 1 4
## 5 -0.1 1 5
## 6 3.4 1 6
## 7 3.7 1 7
## 8 0.8 1 8
## 9 0.0 1 9
## 10 2.0 1 10
## 11 1.9 2 1
## 12 0.8 2 2
## 13 1.1 2 3
## 14 0.1 2 4
## 15 -0.1 2 5
## 16 4.4 2 6
## 17 5.5 2 7
## 18 1.6 2 8
## 19 4.6 2 9
## 20 3.4 2 10
## 21 2.0 1 1
- Ако хоћемо да трансформишемо неку од колона користимо функцију
transform
.
transform(sleep, abs.extra = abs(extra)) # U novoj koloni abs.extra da nam ispisuje aps. vrednosti kolone extra
## extra group ID abs.extra
## 1 0.7 1 1 0.7
## 2 -1.6 1 2 1.6
## 3 -0.2 1 3 0.2
## 4 -1.2 1 4 1.2
## 5 -0.1 1 5 0.1
## 6 3.4 1 6 3.4
## 7 3.7 1 7 3.7
## 8 0.8 1 8 0.8
## 9 0.0 1 9 0.0
## 10 2.0 1 10 2.0
## 11 1.9 2 1 1.9
## 12 0.8 2 2 0.8
## 13 1.1 2 3 1.1
## 14 0.1 2 4 0.1
## 15 -0.1 2 5 0.1
## 16 4.4 2 6 4.4
## 17 5.5 2 7 5.5
## 18 1.6 2 8 1.6
## 19 4.6 2 9 4.6
## 20 3.4 2 10 3.4
- За приказ уопштених података о бази користимо функцију
summary
.
data(InsectSprays) # Jos jedna ugradjena baza - InsectSprays
InsectSprays
## count spray
## 1 10 A
## 2 7 A
## 3 20 A
## 4 14 A
## 5 14 A
## 6 12 A
## 7 10 A
## 8 23 A
## 9 17 A
## 10 20 A
## 11 14 A
## 12 13 A
## 13 11 B
## 14 17 B
## 15 21 B
## 16 11 B
## 17 16 B
## 18 14 B
## 19 17 B
## 20 17 B
## 21 19 B
## 22 21 B
## 23 7 B
## 24 13 B
## 25 0 C
## 26 1 C
## 27 7 C
## 28 2 C
## 29 3 C
## 30 1 C
## 31 2 C
## 32 1 C
## 33 3 C
## 34 0 C
## 35 1 C
## 36 4 C
## 37 3 D
## 38 5 D
## 39 12 D
## 40 6 D
## 41 4 D
## 42 3 D
## 43 5 D
## 44 5 D
## 45 5 D
## 46 5 D
## 47 2 D
## 48 4 D
## 49 3 E
## 50 5 E
## 51 3 E
## 52 5 E
## 53 3 E
## 54 6 E
## 55 1 E
## 56 1 E
## 57 3 E
## 58 2 E
## 59 6 E
## 60 4 E
## 61 11 F
## 62 9 F
## 63 15 F
## 64 22 F
## 65 15 F
## 66 16 F
## 67 13 F
## 68 10 F
## 69 26 F
## 70 26 F
## 71 24 F
## 72 13 F
summary(InsectSprays)
## count spray
## Min. : 0.00 A:12
## 1st Qu.: 3.00 B:12
## Median : 7.00 C:12
## Mean : 9.50 D:12
## 3rd Qu.:14.25 E:12
## Max. :26.00 F:12
- Испис првих 6 редова (обично се користи за веће базе)
head(InsectSprays) # Primetimo da ne moramo da navodimo InsectSprays$spray,vec samo ime kolone
## count spray
## 1 10 A
## 2 7 A
## 3 20 A
## 4 14 A
## 5 14 A
## 6 12 A
Учитавање података
- Учитавање табеле као базе податка:
read.table("putanja/ime_fajla.txt",header=T)
, гдеheader=T
значи да прву врсту не посматра као податке, већ као заглавље табеле/базе података.
Прво правимо текстуални фајл са табелом. На пример, копирамо део базе
cars
у неки фајл. Треба водити рачуна да
working directory
буде локација где је фајл или у позиву
функције навести целу путању.
cars
## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
## 7 10 18
## 8 10 26
## 9 10 34
## 10 11 17
## 11 11 28
## 12 12 14
## 13 12 20
## 14 12 24
## 15 12 28
## 16 13 26
## 17 13 34
## 18 13 34
## 19 13 46
## 20 14 26
## 21 14 36
## 22 14 60
## 23 14 80
## 24 15 20
## 25 15 26
## 26 15 54
## 27 16 32
## 28 16 40
## 29 17 32
## 30 17 40
## 31 17 50
## 32 18 42
## 33 18 56
## 34 18 76
## 35 18 84
## 36 19 36
## 37 19 46
## 38 19 68
## 39 20 32
## 40 20 48
## 41 20 52
## 42 20 56
## 43 20 64
## 44 22 66
## 45 23 54
## 46 24 70
## 47 24 92
## 48 24 93
## 49 24 120
## 50 25 85
<- read.table("cars.txt", header = T)
baza head(baza)
## speed dist
## 1 4 2
## 2 4 10
## 3 7 4
## 4 7 22
## 5 8 16
## 6 9 10
Функција read.table
подразумева да је сепаратор празно
поље. Ако хоћемо да сепаратор буде зарез користимо функцију
read.csv
, а ако хоћемо да сепаратор буде TAB
,
тада користимо функцију read.delim
.
read.csv("cars_zarezi.txt", header = T)
## X speed dist
## 1 1 4 2
## 2 2 4 10
## 3 3 7 4
## 4 4 7 22
## 5 5 8 16
## 6 6 9 10
## 7 7 10 18
## 8 8 10 26
## 9 9 10 34
## 10 10 11 17
## 11 11 11 28
## 12 12 12 14
## 13 13 12 20
## 14 14 12 24
## 15 15 12 28
- Писање табеле/ базе података у фајл:
write.table(data,fajl,sep="\t")
, где јеdata`` типа
data.frameили матрица. Ако није, аутоматски ће се конвертовати. Параметар
sep``` означава како ће бити раздвојени подаци у оквиру врсте у новом фајлу.
write.table(baza, "fajl1.txt", sep = "\t")
write.table(baza, "fajl2.txt", sep = " SEPARATOR ")
- Функција
scan
Користи се за учтавање података:
scan(file,what,nmax,sep)
, где је what
тип
података, nmax
је максималан број карактера који хоћемо да
учитамо, а sep
је сепаратор.
<- scan("cars.txt", what = character(), nmax = 30) # Skeniracemo tekstualni fajl cars.txt
s is.vector(s) # Dobija se vektor sa skeniranim podacima
## [1] TRUE
Генерално, за писање у фајл:
write(podaci,"fajl",ncolumns=...,append=T/F,sep=" ")
<- 1:120
x write(x, "fajl.txt", sep= " ", ncolumns = 12)
Пакети
Пакет је колекција R
- функција, које се односе на један
појам, повезани су. На пример, пакет за графику, пакет функција и база
за линеарну регресију, пакет узорака из неког истраживања,…
Поступак за инсталирање пакета је
install.packages("ime_paketa")
, пакет се инсталира директно
са нета или скинути пакет у zip формату са сајта, па
tools--install packages---
.
Када је пакет инсталиран учитава се са
library(ime_paketa)
и тада су нам на располагању његове
функције, базе података и остало.
На пример, пакет
PASWR (paket probability and statistics with R)
садржи
корисне функције и базе података за вероватноћу и статистику.
# install.packages("PASWR")
library(PASWR)
## Warning: package 'PASWR' was built under R version 4.1.3
## Loading required package: lattice
data(Aggression) # kada je paket ucitan bazu ucitavamo sa data(BAZA)
Aggression
## violence noviolence
## 1 35 26
## 2 30 28
## 3 15 16
## 4 20 16
## 5 25 16
## 6 14 16
## 7 37 32
## 8 26 24
## 9 36 30
## 10 40 33
## 11 35 20
## 12 20 19
## 13 16 19
## 14 21 10
## 15 17 7
## 16 15 17
Ако нећемо да учитамо цео пакет, можемо учитати само неку од база без
претходног позива library
.
data(Aggression, package = "PASWR")
У овом пакету има и корисних статистичких тестова.
- Када завршавамо са радом
detach("package:PASWR")
- За приказ неког пакета
# help(datasets)
data(airquality)# Odavde vidimo imena baza, jedna od njih sadrzi podatke o vazduhu iz Njujorka
head(airquality)
## Ozone Solar.R Wind Temp Month Day
## 1 41 190 7.4 67 5 1
## 2 36 118 8.0 72 5 2
## 3 12 149 12.6 74 5 3
## 4 18 313 11.5 62 5 4
## 5 NA NA 14.3 56 5 5
## 6 28 NA 14.9 66 5 6
Функције
У R
-у се функција дефинише на следећи начин:
IME_FJE<-function(arg1,arg2,arg3,...) {TELO FUNKCIJE}
.
Функција се позива са IME_FJE(arg1,arg2,...)
са
конкретним аргументима.
Ако желимо да видимо код постојећих функција, куцамо само име функције без аргумената.
factorial
## function (x)
## gamma(x + 1)
## <bytecode: 0x0000000020906300>
## <environment: namespace:base>
- Функција која рачуна биномни коефицијент \(\binom{n}{k}\).
<- function(n,k){
binomni <-factorial(n)/(factorial(k)*factorial(n-k))
koefreturn(koef)
}
Позив финкције је
binomni(4,2)
## [1] 6
Када позивамо функцију, аргументе наводимо истим редом као у дефиницији функције, осим ако их наведемо по имену. Тада је редослед произвољан.
binomni(k=2,n=4)
## [1] 6
- Функција која спаја два вектора као колоне матрице.
<-function(v1,v2){
spojireturn (cbind(v1,v2))
}# Poziv
spoji(c(0,1,2,3),seq(0,3,1))
## v1 v2
## [1,] 0 0
## [2,] 1 1
## [3,] 2 2
## [4,] 3 3
Функција не мора да садржи RETURN
наредбу, може само да
се направе неке измене које важе само у телу функције.
- Функција која рачуна квадрат броја
<-function(x){
SQ<-x^2
x
}<-3
aSQ(a)
# nije se izmenilo van funkcije a
## [1] 3
FOR, WHILE, REPEAT и IF наредбе:
Било која целина или блок наредби може се издвојити заградама \(\{ \}\). Ако у конзоли пређемо у нови ред, а траје блок, појавиће се + да то означи.
IF наредба
if(logicki_izraz)
наредбе које се извршавају или
if(logicki_izraz)
наредбе else
наредбе
a
## [1] 3
if(a>3) a<-a-3 else a<-0
a
## [1] 0
<-2
a<-3
b<-4
cif(a<b && b<c)
<-a*b*c else
y<-0 y
Наредбе могу да буду и сложене, само би се онда ограничиле са \(\{\}\).
FOR петља
for(brojac in start:finish) {naredbe}
for (i in 1:10) print(i)
## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10
Хоћемо да направимо матрицу \(5\times 4\), где је \(a_{i,j}=i+j\),
<-matrix(nrow=5,ncol=4) # Prazna matrica
a a
## [,1] [,2] [,3] [,4]
## [1,] NA NA NA NA
## [2,] NA NA NA NA
## [3,] NA NA NA NA
## [4,] NA NA NA NA
## [5,] NA NA NA NA
# for petlje jedna u drugoj
for(i in 1:5)
for(j in 1:4)
<-i+j
a[i,j] a
## [,1] [,2] [,3] [,4]
## [1,] 2 3 4 5
## [2,] 3 4 5 6
## [3,] 4 5 6 7
## [4,] 5 6 7 8
## [5,] 6 7 8 9
WHILE петља
while (uslov) {naredbe}
<-1
xwhile(x<=5){
<-x+1
x
} x
## [1] 6
REPEAT наредба
Садржи наредбе које се извршавају, као и услов за излазак из петље, иначе имамо бесконачну петљу!
repeat{naredbe if (uslov) break}
<-0
yrepeat{
<-y+1
yif(y>=5) break
} y
## [1] 5