Фактри се користе када податке желимо да сврстамо у категорије.
Пример 1: мушки и женски пол
Најчешеће се описују бројевима (нпр. 0 за мушки, 1 за женски). Сваки фактор има неколико категорија односно нивоа (level). На примеру пола, нивои су мушки и женски и описани су бројевима 0 и 1, па када у подацима видимо 0 односно 1, знамо на који пол се податак односи.
pol<-c(0,0,1,0,1)
fpol<-factor(pol,levels=0:1) #команда којом кажемо да пол посматрамо како фактор, чије су могуће нумеричке вредности 0 и 1
fpol
## [1] 0 0 1 0 1
## Levels: 0 1
levels(fpol)<-c("muski","zenski") #додељујемо значење нивоима фактора
#поновно исписивање вектора fpol:
fpol
## [1] muski muski zenski muski zenski
## Levels: muski zenski
levels(fpol)
## [1] "muski" "zenski"
#ф-ја as.numeric приказује како су нивои кодирани, увек почиње од 1 (1,2,..):
as.numeric(fpol)
## [1] 1 1 2 1 2
Пример 2: степен бола
#вектор за 5 пацијената, где су елементи степени бола
bol<-c(0,3,2,2,1)
#ово хоћемо да третирамо као променљиву са категоријама, па правимо фактор
fbol<-factor(bol,levels=0:3)
#додајмо имена нивоима да бисмо знали како да интерпретирамо бројеве
levels(fbol)<-c("nema","slab","umeren","jak")
fbol
## [1] nema jak umeren umeren slab
## Levels: nema slab umeren jak
as.numeric(fbol) #доделио је нивоима 1,2,3,4
## [1] 1 4 3 3 2
Листа представља колекцију објеката скупљених у један сложен објакат.
Пример прављења листе од два вектора: ф-јa кoја креира је LIST:
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<-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
Ф-ja која враћа имена елемената:
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")
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)) #правимо листу од два елемента
lista
## [[1]]
## [1] 1 2 3
##
## [[2]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
#додавање преко индекса
lista[[3]]<-"treci"
Могуће је додавати нови елемент и преко имена:
lista$cetvrti<-"cet"
lista #сада само четврти елемент листе има име и додат је на крај
## [[1]]
## [1] 1 2 3
##
## [[2]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## [[3]]
## [1] "treci"
##
## $cetvrti
## [1] "cet"
Брисање елемената:
lista[-1] #приказује листу без првог елемента
## [[1]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## [[2]]
## [1] "treci"
##
## $cetvrti
## [1] "cet"
Брисање елемената, преко услова:
lista[lista!="treci"] #приказује листу без елемената идентички једнаких речи "treci"
## [[1]]
## [1] 1 2 3
##
## [[2]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## $cetvrti
## [1] "cet"
Уколико желимо да сачувамо измену, додељујемо листи измењену верзију:
lista<-lista[lista!="treci"]
lista
## [[1]]
## [1] 1 2 3
##
## [[2]]
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## $cetvrti
## [1] "cet"
(data matrix, data set - матрица података)
База података је листа вектора исте дужине, тако да су елементи са истим индексом повезани. Личи на матрицу, где су у једној врсти нпр. подаци о једном елементу узорка (субјекту у експерименту).
Имена врста су јединствена (по томе се разликују елементи).
Креирање базе података из постојећих података, нпр. вектора:
brojevi<-1:12
slova<-letters[1:12]
#креира се ф-јом DATA.FRAME:
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
## Levels: 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
## Levels: a b c d e f g h i j k l
Коришћењем функције attach, елементима можемо да приступамо без навођења имена базе.
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
## Levels: a b c d e f g h i j k l
#уколико већ имамо променљиву kol1 нпр, ван базе, онда ће се при позиву kol1 исписати она (masking)
kol1<-"kolona"
kol1
## [1] "kolona"
#за поништавање ф-је ATTACH користи се ф-ја DETACH:
detach(d)
Индескирање базе података
Још један начин издвајања података из базе је преко матричне нотације d[i,j]:
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]
## [1] a
## Levels: a b c d e f g h i j k l
d[1,] #враћа прву врсту
## kol1 kol2
## 1 1 a
d[1] #враћа базу података која садржи прву колону 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[,1] #враћа саму ту колону
## [1] 1 2 3 4 5 6 7 8 9 10 11 12
Условна селекција у бази података
d[d$kol1<5,]
## kol1 kol2
## 1 1 a
## 2 2 b
## 3 3 c
## 4 4 d
Додавање вектора у базу података
Користићемо ургађену базу SLEEP.
data(sleep) #учитава базу у текући session у R-у
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
#додајемо колону бројева 20,19,18,...1:
cbind(sleep,seq(20,1,-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))
## 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
За приказ уопштених података о бази користи се функција SUMMARY.
data(InsectSprays)
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
За веће базе, могу се користити функције head и tail, за приказ првих, односно последњих шест редова:
head(InsectSprays)
## count spray
## 1 10 A
## 2 7 A
## 3 20 A
## 4 14 A
## 5 14 A
## 6 12 A
tail(InsectSprays)
## count spray
## 67 13 F
## 68 10 F
## 69 26 F
## 70 26 F
## 71 24 F
## 72 13 F
Ако желимо да издвојимо неки подскуп, можемо користити ф-jу SUBSET:
subset(InsectSprays,spray=="A")
## 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
Ако желимо да трансформишемо неку од колона, можемо користити ф-ју TRANSFORM:
transform(sleep,abs.extra=abs(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
За сортирање базе података користи се функција order(), именовањем једног или више поља на основу којих би требало извршити сортирање.
data(trees)
d <- trees
d[order(d$Height, d$Girth),]
## Girth Height Volume
## 3 8.8 63 10.2
## 20 13.8 64 24.9
## 2 8.6 65 10.3
## 7 11.0 66 15.6
## 14 11.7 69 21.3
## 1 8.3 70 10.3
## 19 13.7 71 25.7
## 4 10.5 72 16.4
## 24 16.0 72 38.3
## 16 12.9 74 22.2
## 23 14.5 74 36.3
## 8 11.0 75 18.2
## 10 11.2 75 19.9
## 15 12.0 75 19.1
## 12 11.4 76 21.0
## 13 11.4 76 21.4
## 25 16.3 77 42.6
## 21 14.0 78 34.5
## 11 11.3 79 24.2
## 9 11.1 80 22.6
## 22 14.2 80 31.7
## 28 17.9 80 58.3
## 29 18.0 80 51.5
## 30 18.0 80 51.0
## 5 10.7 81 18.8
## 26 17.3 81 55.4
## 27 17.5 82 55.7
## 6 10.8 83 19.7
## 17 12.9 85 33.8
## 18 13.3 86 27.4
## 31 20.6 87 77.0
Сортирање на основу већег броја критеријума врши се прослеђивањем вишеструких аргумената функцији order(). Друга променљива се користи када се о уређењу не може одлучити на основу прве променљиве. Сортирање се по default-у врши у растућем поретку. Поредак сортирања може се променити, тј. може се вршити сортирање у опадајућем поретку, додавањем знака минус испред променљиве.
d[order(d$Height, -d$Girth),]
## Girth Height Volume
## 3 8.8 63 10.2
## 20 13.8 64 24.9
## 2 8.6 65 10.3
## 7 11.0 66 15.6
## 14 11.7 69 21.3
## 1 8.3 70 10.3
## 19 13.7 71 25.7
## 24 16.0 72 38.3
## 4 10.5 72 16.4
## 23 14.5 74 36.3
## 16 12.9 74 22.2
## 15 12.0 75 19.1
## 10 11.2 75 19.9
## 8 11.0 75 18.2
## 12 11.4 76 21.0
## 13 11.4 76 21.4
## 25 16.3 77 42.6
## 21 14.0 78 34.5
## 11 11.3 79 24.2
## 29 18.0 80 51.5
## 30 18.0 80 51.0
## 28 17.9 80 58.3
## 22 14.2 80 31.7
## 9 11.1 80 22.6
## 26 17.3 81 55.4
## 5 10.7 81 18.8
## 27 17.5 82 55.7
## 6 10.8 83 19.7
## 17 12.9 85 33.8
## 18 13.3 86 27.4
## 31 20.6 87 77.0
Табеларни подаци у текстуалном документу се могу учитати као база података помоћу функциjе read.table(“putanja/ime_fajla.txt”,header=T). Аргумент header=T означава да прву врсту не пoсматра као податке већ као header.
Уколико су подаци у CSV документу, односно Excel-у, користи се функција read.csv(), односно read.xls().
Код експерименталних података често се поjављуjу категоричке променљиве, коjе указуjу на неку потподелу података у групе. Њих у R-у означавамо као факторе (factors). Исправност многих анализа у R-у зависи од коректног препознавања фактора, нпр. функциjа table() ради само са категоричким променљивим.
table(trees$Height) #добија се табела са бројевима дрвећа у узорку одговарајуће висине
##
## 63 64 65 66 69 70 71 72 74 75 76 77 78 79 80 81 82 83 85 86 87
## 1 1 1 1 1 1 1 2 2 3 2 1 1 1 5 2 1 1 1 1 1
Графичке могућности су важна и изузетно разноврсна компонента R-овог окружења. Обезбеђене су функциjе за генерисање различитих статистичких графика од података, као и флексибилно окружење за модификовање детаља на графицима.
share = c(.2090,.1980,.1210,.0930,.3780)
names(share)<-("brand"=c("Samsung","Apple","Huawei","Xiaomi","Other"))
share
## Samsung Apple Huawei Xiaomi Other
## 0.209 0.198 0.121 0.093 0.378
pie(share, main="")
pie(share, col = rainbow(5), clockwise = TRUE, main = "pitica")
library(plotrix)
pie3D(share, explode = 0.2, main = "3D pitica", labels= names(share), labelcex = 1)
VADeaths
## Rural Male Rural Female Urban Male Urban Female
## 50-54 11.7 8.7 15.4 8.4
## 55-59 18.1 11.7 24.3 13.6
## 60-64 26.9 20.3 37.0 19.3
## 65-69 41.0 30.9 54.6 35.1
## 70-74 66.0 54.3 71.1 50.0
barplot(VADeaths)
barplot(t(VADeaths), col=rainbow(10))
Ако су x и y вектори, plot(x, y) за резултат има тачкасти график (scatterplot) y-а у зависности од x-а. Исти учинак може се произвести прослеђивањем само jедног аргумента xy функциjи plot(), коjи jе, у том случаjу, листа са два вектора или матрица са две колоне.
plot(cbind(trees$Girth, trees$Height), xlab="Obim", ylab="Visina")
Ако jе x временска сериjа (time series), резултат jе граф временске сериjе; ако jе x нумерички вектор на излазу се добиjа график вредности тог вектора у зависности од индекса у вектору.
data(AirPassengers)
AP<-AirPassengers
plot(AP, xlab="vreme", ylab="Broj putnika na letovima (u hiljadama)")
За генериcање distribution plots променљивих у бази:
plot(trees)
а може се користити и функција pairs()
pairs(trees, col=rainbow(3))
Хистограм jе наjjедноставниjа непараметарска “оцена” густине расподеле. Функциjа hist(x), где jе x нумерички вектор jе наредба за исцртавање хистограма. То jе посебна врста графика са bar-овима, коjа се користи за приказ расподеле фреквенциjа низа (непрекидних) нумеричких вредности.
Од опционалних аргумената важно jе издвоjити:
nclass постављањем на одређену вредност корисник може да препоручи жељени (разуман) броj bar-ова;
breaks (breaks= “Sturges” / breaks=“Scott” / breaks=“Freedman-Diaconis”) могу се тачно задати броj bar-ова, односно граничне тачке bar-ова;
prob=T вредности на y-оси представљаjу релативне, а не апсолутне фреквенциjе.
hist(airquality$Ozone)
hist(airquality$Ozone, breaks=15, prob=T, ylim=c(0, 0.025), ylab="Relativna frekvencija")
mean.ozone <- mean(airquality$Ozone, na.rm=T)
sd.ozone <- sd(airquality$Ozone, na.rm=T)
hist(airquality$Ozone, breaks=15, prob=T, ylim=c(0, 0.025), xlab="Ozone", ylab="Gustina", main="Histogram sa grafikom gustine normalne raspodele")
curve(dnorm(x, mean=mean.ozone, sd=sd.ozone), add=T)