13 + 8 # Liitmine
[1] 21
8 - 5 # Lahutamine
[1] 3
21 / 3 # Jagamine
[1] 7
5 * 3 # Korrutamine
[1] 15
2^3 # Astendamine
[1] 8
9^(1/2) # Ruutjuur
[1] 3
13 + (8 - 5) * 9^(1/2)
[1] 22
Käesolevas peatükis tutvume lühidalt R keele kasutamisega.
Käsureal (command line) esitatud käsu alusel teeb R rakendus vastavalt R keele loogikale arvutused ja esitab vastuse. Nii saab käsurida kasutada ka lihtsalt kalkulaatorina ja sealjuures saab korraga teha ka mitu tehet.
13 + 8 # Liitmine
[1] 21
8 - 5 # Lahutamine
[1] 3
21 / 3 # Jagamine
[1] 7
5 * 3 # Korrutamine
[1] 15
2^3 # Astendamine
[1] 8
9^(1/2) # Ruutjuur
[1] 3
13 + (8 - 5) * 9^(1/2)
[1] 22
R keele võimekus avaldub aga siis, kui kasutame käske salvestamaks väärtused objektidesse ja rakendamaks neil erinevaid funktsioone.
Mõnikord väljastab R käsu sisestamisel veateate. Teatega “Error” kaasneb käsu täitmata jätmine, samas kui teade “Warning” tähendab, et käsk küll täideti, aga teatud tingimustel.
To understand computations in R, two slogans are helpful:
Everything that exists is an object.
Everything that happens is a function call.
- John Chambers
Andmete töötlemiseks on vaja need kuidagi salvestada. Väärtusi saab R keeles salvestada objektidena. Sealjuures väärtused, mis ei ole arvud, tuleb ümbritseda jutumärkidega.
# Objekti võib salvestada arve...
<- 2
kama kama
[1] 2
# ...aga ka sõnu või lauseid.
<- 'muna'
pesa pesa
[1] "muna"
# Trükitav nö nool ei tohi sisaldada tühikuid,
# sest vastasel juhul käsitletakse käsku võrdlusena.
< - 2 kama
[1] FALSE
Objekte võib nimetada kuidas iganes1, aga nimetused peavad algama tähega ega tohi sisaldada teatud kirjavahemärke ega tühikuid.
1 Objektidele nime valimine võtab sageli rohkem aega kui peaks: “There are only two hard things in Computer Science: cache invalidation and naming things.”
Väärtuste klasse on R keeles väga palju, aga olulisimaks võib pidada nendest kolme:
Väärtuse klass sõltub sellest, mis kujul me andmed sisestame.
# Element
<- 3
kaks kaks
[1] 3
# Vektor
<- c('Alar', 'Kaja', 'Jüri')
nimed nimed
[1] "Alar" "Kaja" "Jüri"
# Andmetabel
<- data.frame(nimi = nimed,
õpilased hinne = c(5,4,2))
õpilased
nimi hinne
1 Alar 5
2 Kaja 4
3 Jüri 2
Nagu näha, siis rohkem kui ühe elemendi esitamiseks peame kasutama vastavat funktsiooni.
Samuti ilmneb, et funktsiooni nimetuse järele sulgudesse tuleb sisestada funktsiooni argumendid. Esimene argument on enamasti objekt ja järgnevad argumendid täpsustused.
<- c(1,NA,2,3,NA)
Fibonacci # Kuna vektor sisaldab teadmata väärtusi,
# siis ei väljasta funktsioon vektori summat.
sum(Fibonacci)
[1] NA
# Saame täpsustada, et soovime summa arvutada ilma puuduvate väärtusteta.
sum(Fibonacci, na.rm = TRUE)
[1] 6
Iga funktsiooni kõikide argumentide teada saamiseks saab kuvada vastava funktsiooni abilehe. Selleks tuleb sisestada käsk, milles funktsiooni nimetusele eelneb küsimärk.
?sum
R keele kasutamine on põhimõtteliselt väga lihtne: see on lihtsalt funktsioonide rakendamine objektidel. Kogu keerukus seisneb objektide ja funktsioonide tundmises ning nende omavahel kombineerimises.
R keele paigaldamisel tuleb kaasa palju funktsioone, mis võimaldavad rakendada põhilisi andmetöötluse ja statistilise analüüsi protseduure. Võimaluste lisamiseks on aga paljud R keele kasutajad kirjutanud ise funktsioone ja koondanud need laiendustesse või pakkidesse (packages), mis on saadaval ka teistele kasutajatele2. Selleks, et neid laiendusi kasutada tuleb need esmalt arvutisse paigaldada ja seejärel töölauale laadida.
2 Ametlikult tunnustatud R keele laiendused on CRAN hoidlas.
# Laadime laienduse alla ja paigaldame arvutisse.
install.packages('tidyverse')
# Laienduse kasutamiseks tuleb see esmalt R töölauale laadida.
library('tidyverse')
Eelnevate käskudega paigaldatud ja laaditud laiendus tidyverse
sisaldab tegelikult palju teisi laiendusi, mille funktsioonid lihtsustavad käskude kirjutamist R keeles. Edaspidi kasutame paljusid antud laienduses sisalduvaid funktsioone.
Mõistagi ei pea andmed R töölauale sisestama üksikute väärtuste kaupa nii nagu eelnevas näites. Lisatavates lainedustes olevate funktsioonide abil on R võimeline lugema andmeid peaaegu misiganes vormingus. Siiski on soovitatav kasutada R keelega kaasas olevaid funktsioone, mis tunnevad eelkõige lihttekstina salvestatud andmeid. Üheks selliseks andmevorminguks on CSV (comma separated value), mis on lihtsalt teksti sisaldav fail, milles väärtused on eraldatud komadega.
CSV vormingus andmete R töölauale laadimiseks saab kasutada funktsiooni read.csv()
, mille argumendiks on andmefaili koht failisüsteemis. Kui andmete esimene rida sisaldab veergude nimetusi, siis tuleb seda argumendiga täpsustada argumendiga header = TRUE
.
# Loeme objekti "thi" töölaua kaustas olevast failist "thi.csv"
# Need on tarbijahinnaindeksi (THI) andmed Statistikaameti tabeli IA02 alusel
<- read.csv('C:/Users/kasutajanimi/Desktop/thi.csv', header = TRUE) thi
Kui salvestada tabel CSV vormingus Microsoft Exceli abil, siis on väärtuse eraldajateks hoopis semikoolonid. Sellisel juhul loeb funktsioon read.csv()
andmeid valesti. Lahenduseks on kasutada funktsiooni read.csv2()
, mis arvestab väärtuste eraldajatena semikoolonit ja komakohtade eraldajatena komasid.
CSV aluseks on USA standard, milles arvude komakohad eraldatakse punktiga. Kuna Euroopas eraldatakse arvudes komakohad komaga, siis ei saa komasid kasutada väärtuse eraldamiseks ja Excel eraldab väärtused hoopis semikoolonitega.
Faililaiendiga .xlsx
nö tabelarvutuse vihikutes ei pruugi andmed olla vormistatud korrektse andmetabelina ja võivad sisaldada tabelist väljaspool olevaid väärtusi. Nt tühjade ridade või veergudega tabelid ilmuvad statistikarakendustesse või R töölauale laadides sageli vigaselt. Selliste vigade kõrvaldamine on enamasti keerulisem võrreldes CSV vormingu kasutamisega. Sellepärast on ka soovitatav kasutada CSV vormingut. Kui on siiski vajadus laadida töölauale .xlsx
vormingus olevad andmed, siis selleks saab kasutada funktsiooni read_excel()
.
<- read_excel('C:/Users/kasutajanimi/Desktop/thi.xlsx') thi
Kui andmed on mingi muu faililaiendiga (nt .xlsx
), siis on soovitatav need esmalt CSVna salvestada ja alles seejärel R töölauale laadida.
Kui soovime kõik loetavad ja salvestatavad failid koondada ühte kausta, siis võime määrata selle vaikimisi kaustaks. Sel juhul ei pea me faili täielikku asukohta sisestama, vaid piisab faili nimest ja -laiendist.
setwd('C:/Users/kasutajanimi/Desktop/')
<- read.csv('thi.csv') thi
R keel tunnistab failide asukoha kirjes kaustade eraldajatena paremale kaldu olevaid kaldkriipse (/
). See vastab MacOS ja Linuxi failisüsteemile. Microsoft Windows kasutab aga vasakule kaldu olevaid kaldkriipse (\
). Seega tuleb Windowsi süsteemis faili asukoha kopeerimisel R keelde kaldkriipsud vastavalt ära muuta.
Andmete sisestamisel on hea mõte veenduda, et andmed laaditi töölauale õigesti. Selleks saame kasutada funktsiooni head()
, mis kuvab esimesed viis rida.
head(thi)
Aasta Kaubagrupp Kuu Tarbijahinnaindeks
1 1998 Kokku Jaanuar 105.58
2 1998 Kokku Veebruar 106.59
3 1998 Kokku Märts 107.43
4 1998 Kokku Aprill 107.90
5 1998 Kokku Mai 108.28
6 1998 Kokku Juuni 108.48
Kõikidest andmetabeli tunnustest saame ülevaate funktsiooni str()
abil. Samuti kuvab funktsioon vaatluste ja tunnuste arvu.
str(thi)
'data.frame': 3991 obs. of 4 variables:
$ Aasta : chr "1998" "1998" "1998" "1998" ...
$ Kaubagrupp : chr "Kokku" "Kokku" "Kokku" "Kokku" ...
$ Kuu : chr "Jaanuar" "Veebruar" "Märts" "Aprill" ...
$ Tarbijahinnaindeks: num 106 107 107 108 108 ...
Tabelarvutuses saab vajalike lahtrite valimiseks kasutada kursorit, aga käsureal ei saa valikud vormistada muul viisil kui käsuna. Selleks kõige lihtsam viis on sisestada soovitud väärtuste asukoht objekti järel nurksulgudesse.
# Vektori kolmas väärtus
Fibonacci
[1] 1 NA 2 3 NA
3] Fibonacci[
[1] 2
# Andmetabel esimese rea ja neljanda veeru väärtus
1, 4] thi[
[1] 105.58
# Andmetabeli veeru Tarbijahinnaindeks esimene rida
$Tarbijahinnaindeks[1] thi
[1] 105.58
# Andmetabel esimese rea ja kõikide veergude väärtused
1, ] thi[
Aasta Kaubagrupp Kuu Tarbijahinnaindeks
1 1998 Kokku Jaanuar 105.58
Enamasti ei soovi me aga vajalikke väärtusi valida mitte nende asukoha alusel, vaid mingi teise tunnuse väärtuse alusel. Sellisel juhul saame esitada valiku tõeväärtusena.
# Kolmas ja neljas väärtus asukoha alusel
c(3,4)] Fibonacci[
[1] 2 3
# Kolmas ja neljas väärtus tõeväärtusena
c(FALSE,FALSE,TRUE,TRUE,FALSE)] Fibonacci[
[1] 2 3
Tõeväärtused võivad sisaldada ka mitut tingimust.
# Read, mille korral THI oli vähem kui 100 ja kaubagrupp ei olnud side
$Tarbijahinnaindeks < 100 & thi$Kaubagrupp != 'Side', ] thi[thi
Aasta Kaubagrupp Kuu Tarbijahinnaindeks
176 1999 Toit ja mittealkohoolsed joogid August 99.40
177 1999 Toit ja mittealkohoolsed joogid September 99.12
178 1999 Toit ja mittealkohoolsed joogid Oktoober 99.89
# Aasta ja THI väärtused jaanuarikuus kõikide kaupade arvestuses
$Kuu == 'Jaanuar' & thi$Kaubagrupp == 'Kokku',
thi[thic('Aasta', 'Tarbijahinnaindeks')]
Aasta Tarbijahinnaindeks
1 1998 105.58
157 1999 110.44
313 2000 114.01
469 2001 120.63
625 2002 125.70
781 2003 128.94
937 2004 129.55
1093 2005 135.03
1249 2006 141.31
1405 2007 148.54
1561 2008 164.88
1717 2009 171.58
1873 2010 170.39
2029 2011 179.34
2185 2012 187.38
2341 2013 193.84
2497 2014 195.95
2653 2015 193.40
2809 2016 192.31
2965 2017 197.58
3121 2018 204.44
3277 2019 209.98
3433 2020 213.40
3589 2021 213.88
3745 2022 238.13
3901 2023 282.40
Tõeväärtuse abil saame objektist valida väärtused mingi teise objekti väärtuse alusel. Selle teise objekti väärtused tuleb määrata võrdlusoperaatori abil. Mitme võrdluse korral peame võrdlused eraldama loogikaoperaatoritega.
Võrdlusoperaatorite (relational operators) abil saame tekitada tõeväärtuse, mille alusel saame valida soovitud väärtuse mingi muu objekti väärtuse järgi. Võrdlusoperaatoreid on kuus:
==
(kaks võrdusmärki),!=
,>
,<
,>=
,<=
.Loogikaoperaatorite (logical operators) abil saame ühendada mitu võrdlust. Lihtsamaid loogikaoperaatoreid on kolm (!
, &
, |
) ja neid saab kasutada võrdluste liitmisel tõeväärtuste moodustamiseks nt järgnevalt:
!x
)x & y
),x | y
),x & !y
).Eelneva kirjelduse alusel võib väärtuste valimine tunduda keeruline ja tülikas. Seda saab teatud mõttes lihtsustada, kui kasutame varem paigaldatud laienduses sisalduvaid funktsioone. Ridade valimiseks on funktsioon filter()
ja veergude valimiseks select()
.
# THI aastal 2020
filter(thi, Aasta == 2020 & Kaubagrupp == 'Kokku')
Aasta Kaubagrupp Kuu Tarbijahinnaindeks
1 2020 Kokku Jaanuar 213.40
2 2020 Kokku Veebruar 214.45
3 2020 Kokku Märts 212.94
4 2020 Kokku Aprill 212.09
5 2020 Kokku Mai 210.67
6 2020 Kokku Juuni 212.57
7 2020 Kokku Juuli 212.57
8 2020 Kokku August 213.94
9 2020 Kokku September 213.32
10 2020 Kokku Oktoober 212.24
11 2020 Kokku November 212.49
12 2020 Kokku Detsember 212.50
# THI veerg andmetabeli esimesel viiel real
select(head(thi), Tarbijahinnaindeks)
Tarbijahinnaindeks
1 105.58
2 106.59
3 107.43
4 107.90
5 108.28
6 108.48
Tehtud valiku salvestamiseks tuleb saadud tulemus lihtsalt sisestusoperaatori abil objekti salvestada.
# Jätame alles vaid read alates aastast 2020
<- filter(thi, Aasta >= 2020) thi
Väärtuste kokku võtvaks kirjeldamiseks on väga palju viise ja neile vastavaid funktsioone, aga alustuseks vaatame liitmist, keskmist ja äärmuslikke väärtusi.
<- c(0,1,1,2,3,5,8,13,21,34,55,89)
Fibonacci sum(Fibonacci) # Summa
[1] 232
mean(Fibonacci) # Aritmeetiline keskmine
[1] 19.33333
median(Fibonacci) # Mediaan
[1] 6.5
min(Fibonacci) # Väikseim väärtus
[1] 0
max(Fibonacci) # Suurim väärtus
[1] 89
range(Fibonacci) # Väikseima ja suurima väärtuse vahe
[1] 0 89
length(Fibonacci) # Väärtuste arv
[1] 12
Koodi kirjutamise ja eriti hiljem lugemise lihtsustamiseks saab kasutada paljudes programmeerimiskeeltes kasutusel olevat toru (pipe). Torude abil saame ühe funktsiooni tulemuse suunata järgmisesse funktsiooni, mis muudab koodi selgemaks. Kokku on kolm viisi, kuidas funktsioone omavahel ühendada.
# Oletame, et soovime uurida eluaseme THI muutust 2022. aastal
## Iga iga funktsiooni tulemuse saab järjest objekti salvestada
<- filter(thi, Kaubagrupp == 'Eluase')
eluase <- filter(eluase, Aasta == 2022)
eluase select(eluase, Kuu, Tarbijahinnaindeks)
Kuu Tarbijahinnaindeks
1 Jaanuar 452.08
2 Veebruar 439.13
3 Märts 456.10
4 Aprill 538.55
5 Mai 557.34
6 Juuni 587.38
7 Juuli 623.25
8 August 683.04
9 September 659.76
10 Oktoober 585.75
11 November 592.23
12 Detsember 589.07
## Nö pesastamist kasutades tõstame funktsiooni tulemuse järgmise funktsiooni sisse
select(filter(filter(thi, Kaubagrupp == 'Eluase'), Aasta == 2022), Kuu, Tarbijahinnaindeks)
Kuu Tarbijahinnaindeks
1 Jaanuar 452.08
2 Veebruar 439.13
3 Märts 456.10
4 Aprill 538.55
5 Mai 557.34
6 Juuni 587.38
7 Juuli 623.25
8 August 683.04
9 September 659.76
10 Oktoober 585.75
11 November 592.23
12 Detsember 589.07
## Torutamise käigus saadame funktsiooni tulemuse järgmisesse funktsiooni
%>%
thi filter(Kaubagrupp == 'Eluase') %>%
filter(Aasta == 2022) %>%
select(Kuu, Tarbijahinnaindeks)
Kuu Tarbijahinnaindeks
1 Jaanuar 452.08
2 Veebruar 439.13
3 Märts 456.10
4 Aprill 538.55
5 Mai 557.34
6 Juuni 587.38
7 Juuli 623.25
8 August 683.04
9 September 659.76
10 Oktoober 585.75
11 November 592.23
12 Detsember 589.07
Nagu näha, siis arvestab torule järgnev funktsioon kõige esimese argumendina eelneva funktsiooni tulemust.
Ühendades nüüd oskused andmetabelist andmeid valida ja kokku võtta saame juba hakata vastama mitmesugustele küsimustele.
# Millal ja mis kaubagrupis oli THI pärast 2020. aastat kõige kõrgem?
filter(thi, Aasta >= 2021) %>%
filter(Tarbijahinnaindeks == max(Tarbijahinnaindeks))
Aasta Kaubagrupp Kuu Tarbijahinnaindeks
1 2022 Eluase August 683.04
# Mis juhtudel on THI suurenenud 1997. aastaga võrreldes vähemalt 4 korda?
%>% filter(Tarbijahinnaindeks > 400) thi
Aasta Kaubagrupp Kuu Tarbijahinnaindeks
1 2021 Eluase September 400.24
2 2021 Eluase November 405.27
3 2021 Eluase Detsember 484.44
4 2022 Eluase Jaanuar 452.08
5 2022 Eluase Veebruar 439.13
6 2022 Eluase Märts 456.10
7 2022 Eluase Aprill 538.55
8 2022 Eluase Mai 557.34
9 2022 Eluase Juuni 587.38
10 2022 Eluase Juuli 623.25
11 2022 Eluase August 683.04
12 2022 Eluase September 659.76
13 2022 Eluase Oktoober 585.75
14 2022 Eluase November 592.23
15 2022 Eluase Detsember 589.07
16 2022 Söömine väljaspool kodu, majutus Juuli 426.74
17 2022 Söömine väljaspool kodu, majutus August 416.38
18 2023 Eluase Jaanuar 594.75
19 2023 Eluase Veebruar 581.33
20 2023 Eluase Märts 581.58
21 2023 Eluase Aprill 627.92
22 2023 Eluase Mai 626.18
23 2023 Eluase Juuni 628.28
24 2023 Eluase Juuli 614.56
25 2023 Söömine väljaspool kodu, majutus Veebruar 404.10
26 2023 Söömine väljaspool kodu, majutus Märts 410.81
27 2023 Söömine väljaspool kodu, majutus Aprill 409.45
28 2023 Söömine väljaspool kodu, majutus Mai 415.23
29 2023 Söömine väljaspool kodu, majutus Juuni 434.64
30 2023 Söömine väljaspool kodu, majutus Juuli 441.37
Nii nagu andmete R keskkonda lugemise korral on ka nende salvestamiseks soovitatav kasutada CSV vormingut. Selleks on funktsioon write.csv()
, aga kui soovime hiljem selle faili avada Excelis, siis tuleb enamasti kasutada funktsiooni write.csv2()
.
write.csv(thi, 'andmed/thi.csv')
Kuna R keele kasutamisel teeme kõik tehted käskude alusel, siis saame kõik käsud salvestada käsulehele (script). Käsulehe kasutamine annab palju võimalusi:
R keelt kasutades ei ole võimalik käske tühistada või tagasi võtta (undo). Kõik muudatused andmetes on lõplikud. Eelneva analüüsi sammu juurde tagasi minemiseks peame andmed uuesti R töölauale sisestama.
Käsulehel on andmetöötluse tegevused enamasti teatud järjekorras:
Lisaks käsulehele saab analüüsi vormistada ka terve aruandena. Rakenduses RStudio saab selleks kõik käsud ja sinna juurde kuuluvad selgitused vormistada lihttekstina vastavalt Quarto eeskirjadele. Vastavaid .qmd
faililaiendiga lihtteksti faile saab salvestada paljudes erinevates vormingutes, sh PDFi, HTMLi ja Microsoft Wordi dokumentidena. Teksti vormistamiseks tuleb sealjuures kasutada Markdown märgistuskeelt.