Матрице
Матрице су дводимензиони вектори. Начини задавања матрица су:
- Матрицу правимо од елемената једнодимензионог вектора променом димензија
x <- 1:12
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
x <- matrix(1:12, nrow = 3) # nrow = broj vrsta matrice
x## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
x <- matrix(1:12, ncol = 4) # ncol = broj kolona
x## [,1] [,2] [,3] [,4]
## [1,] 1 4 7 10
## [2,] 2 5 8 11
## [3,] 3 6 9 12
Примећујемо да се при креирању матрице прво попуњава елементима прва
колона, па друга, итд. Ако хоћемо да се матрица попуњава по колонама
додамо параметар byrow.
x <- matrix(1:12, nrow = 3, byrow = T)
x## [,1] [,2] [,3] [,4]
## [1,] 1 2 3 4
## [2,] 5 6 7 8
## [3,] 9 10 11 12
- Матрица се може добити налепљивањем вектора помоћу функција
cbind(везује векторе као колоне матрице) иrbind(везује векторе као врсте матрице)
a <- 1:4
a## [1] 1 2 3 4
b <- 5:8
b## [1] 5 6 7 8
c <- 9:12
c## [1] 9 10 11 12
M1 <- cbind(a, b, c)
M1## a b c
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
M2 <- cbind(1:4, 5:8, 9:12) # skraceno
M2## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 2 6 10
## [3,] 3 7 11
## [4,] 4 8 12
M3 <- rbind(1:4, 5:8, 9:12)
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] [,3] [,4]
## A 1 2 3 4
## B 5 6 7 8
## C 9 10 11 12
НАПОМЕНА: У R-у постоји уграђен вектор који садржи слова алфабета.
SLOVA <- LETTERS
SLOVA## [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" "K" "L" "M" "N" "O" "P" "Q" "R" "S"
## [20] "T" "U" "V" "W" "X" "Y" "Z"
slova <- letters
slova## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
## [20] "t" "u" "v" "w" "x" "y" "z"
Претходна команда може да изгледа и овако:
rownames(x) <- LETTERS[1:3]
x## [,1] [,2] [,3] [,4]
## A 1 2 3 4
## B 5 6 7 8
## C 9 10 11 12
Још неки уграђени вектори за имена врста и колона матрица:
month.name
month.abb
- Приступање елементима матрице
u <- x[1, 2]
u## A
## 2
v <- x[3, ]
v## [1] 9 10 11 12
w <- x[ ,4]
w## A B C
## 4 8 12
Операције са матрицама
x <- matrix(c(2,5,3,7,5,1,7,4,3), ncol = 3)
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
- Множење матрица
a <- cbind(1:3, 4:6, 7:9)
b <- cbind(7:9, 4:6, 1:3)
a*b # Mnozenje elemenata sa istim indeksom## [,1] [,2] [,3]
## [1,] 7 16 7
## [2,] 16 25 16
## [3,] 27 36 27
a%*%b # Matricno mnozenje## [,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 - пол
pol <- c(0, 0, 1, 0, 1)
fpol <- factor(pol, levels = 0:1) # pol posmatramo kao faktor, cije su moguce vrednosti 0 i 1
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 - степен бола
bol <- c(0, 3, 2, 2, 1) # Pravimo vektor za 5 pacijenata, gde su elementi stepeni bola
fbol <- factor(bol, levels = 0:3) # Pravimo faktor
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-у се
прави фактор од сортираних вредности из вектора. То није увек
препоручљиво, на пример ако је вектор стрингова, сортирање је по
алфабету.
Листе
Листе су колекција објеката сакупљена у један сложен објекат.
Пример прављења листе од два вектора.
v1 <- c(4, 3, 2, 1)
v2 <- c(5, 6, 7, 8)
lista <- list(v1, v2)
lista## [[1]]
## [1] 4 3 2 1
##
## [[2]]
## [1] 5 6 7 8
- Приступање елементима листе
lista[[1]]## [1] 4 3 2 1
lista[[1]][2]## [1] 3
Ако приликом прављења листе елементима доделимо имена, елементе листе
можемо позвати и преко њихових имена и знака $.
lista <- list(prvi = v1, drugi = v2)
lista[[1]]## [1] 4 3 2 1
lista[["prvi"]]## [1] 4 3 2 1
lista$prvi## [1] 4 3 2 1
- Функција која враћа имена елемената
names(lista)## [1] "prvi" "drugi"
НАПОМЕНА: Елементи листе не морају бити објекти истог типа!!!
lista <- list(2, 1.4, "string", c(1,3,4), 2:12, matrix(1:12, nrow = 2))
lista## [[1]]
## [1] 2
##
## [[2]]
## [1] 1.4
##
## [[3]]
## [1] "string"
##
## [[4]]
## [1] 1 3 4
##
## [[5]]
## [1] 2 3 4 5 6 7 8 9 10 11 12
##
## [[6]]
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
nova_lista <- list(lista, 12, "rec") # Lista moze sadrzati i druge liste
nova_lista## [[1]]
## [[1]][[1]]
## [1] 2
##
## [[1]][[2]]
## [1] 1.4
##
## [[1]][[3]]
## [1] "string"
##
## [[1]][[4]]
## [1] 1 3 4
##
## [[1]][[5]]
## [1] 2 3 4 5 6 7 8 9 10 11 12
##
## [[1]][[6]]
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 3 5 7 9 11
## [2,] 2 4 6 8 10 12
##
##
## [[2]]
## [1] 12
##
## [[3]]
## [1] "rec"
- Додавање елемената на крај листе
lista <- list(1:3, matrix(1:4, ncol = 2)) # Prvo pravimo listu od 2 elementa:
lista## [[1]]
## [1] 1 2 3
##
## [[2]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
lista[[3]] <- "treci" # Dodavanje preko indeksa
# Moguce je dodati novi element i preko imena
lista$cetvrti <- "cet"
lista # Samo cetvrti element liste ima ime i dodat je na kraj liste## [[1]]
## [1] 1 2 3
##
## [[2]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## [[3]]
## [1] "treci"
##
## $cetvrti
## [1] "cet"
- Брисање елемената листе
lista[-1] # prikazuje listu bez prvog elementa## [[1]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## [[2]]
## [1] "treci"
##
## $cetvrti
## [1] "cet"
lista[lista != "treci"] # prikazuje listu bez elemenata identicnih reci "treci"## [[1]]
## [1] 1 2 3
##
## [[2]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## $cetvrti
## [1] "cet"
lista <- lista[lista != "treci"] # Da sacuvamo izmenu, dodeljujemo listi izmenjenu verziju
lista## [[1]]
## [1] 1 2 3
##
## [[2]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## $cetvrti
## [1] "cet"
Базе података (матрица података)
База података (Data frame) је листа вектора исте дужине, таква да су елементи са истим индексом повезани. Подсећа на матрицу у којој су у једној врсти подаци о једном елементу узорка (субјекту у експерименту). Имена врста су јединствена и по томе се елементи разликују.
- Креирање базе података из постојећих података, нпр. спајањем два вектора.
brojevi <- 1:12
slova <- letters[1:12]
d <- data.frame(brojevi, slova)
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
- Приступање елементима преко
$.
d$brojevi## [1] 1 2 3 4 5 6 7 8 9 10 11 12
d$slova## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l"
- Приликом креирања базе колонама можемо доделити имена различита од ових, а можемо их и накнадно изменити.
d <- data.frame(br=brojevi, sl=slova)
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
d$kol1## [1] 1 2 3 4 5 6 7 8 9 10 11 12
d$kol2## [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
d[1,2] # ili d$kol2[1]## [1] "a"
d[1,] #vraca prvu vrstu## kol1 kol2
## 1 1 a
d[,1] # vraca prvu kolonu## [1] 1 2 3 4 5 6 7 8 9 10 11 12
d[1] # vraca data frame koji sadzi prvu kolonu 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
- Условна селекција у бази података
d[d$kol1<10,] # Baza podatakа koja sadrzi vrednost <10 u prvoj koloni## 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
d[d$kol1<10 & d$kol1%%2==0,]# + parne vrednosti## 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
sleep #ispisuje## 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)## 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
baza<-read.table("cars.txt",header=T)
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је сепаратор.
# s <- scan("~/MATF/SS12023-4/cars.txt", what = character(), nmax = 30) # Skeniracemo tekstualni fajl cars.txt
# is.vector(s) # Dobija se vektor sa skeniranim podacimaАко желимо да не учитава реч по реч, него ред по ред, користимо
функцију readLines.
# readLines("~/MATF/SS12022-3/cars.txt")Пакети
Пакет је колекција R- функција, које се односе на један
појам, повезани су. На пример, пакет за графику, пакет функција и база
за линеарну регресију, пакет узорака из неког истраживања,… Са
R-ом долази сет стандардних пакета, а остали се могу
преузети са http://cran.r-project.org/.
Поступак за инсталирање пакета је
install.packages("ime_paketa"), пакет се инсталира директно
са нета или скинути пакет у zip формату са сајта, па
tools--install packages---.
Када је пакет инсталиран учитава се са
library(ime_paketa) и тада су нам на располагању његове
функције, базе података и остало.
На пример, пакет
PASWR (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")