Матрице

Матрице су дводимензиони вектори. Начини задавања матрица су:

  1. Матрицу правимо од елемената једнодимензионог вектора променом димензија
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
  1. Матрицу формирамо помоћу функције 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
  1. Матрица се може добити налепљивањем вектора помоћу функција 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
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- женско).

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

Учитавање података

Прво правимо текстуални фајл са табелом. На пример, копирамо део базе 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(baza,"fajl1.txt",sep="\t")
write.table(baza,"fajl2.txt",sep="   SEPARATOR   ")
# 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")