5  Põhikasutus

Käesolevas peatükis tutvume lühidalt R keele kasutamisega.

5.1 Käsurida

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.

5.2 Objektid ja funktsioonid

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...
kama <- 2
kama
[1] 2
# ...aga ka sõnu või lauseid.
pesa <- 'muna'
pesa
[1] "muna"
# Trükitav nö nool ei tohi sisaldada tühikuid, 
# sest vastasel juhul käsitletakse käsku võrdlusena.
kama < - 2
[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:

    • üksik väärtus on element,
    • mitu väärtust on vektor,
    • tabelina vormistatud väärtused on andmetabel (data frame).

    Väärtuse klass sõltub sellest, mis kujul me andmed sisestame.

    # Element
    kaks <- 3
    kaks
    [1] 3
    # Vektor
    nimed <- c('Alar', 'Kaja', 'Jüri')
    nimed
    [1] "Alar" "Kaja" "Jüri"
    # Andmetabel
    õpilased <- data.frame(nimi = nimed, 
                           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.

    Fibonacci <- c(1,NA,2,3,NA)
    # 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
    Note

    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.

    5.3 Laiendused

    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.

    5.4 Sisestamine

    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
    thi <- read.csv('C:/Users/kasutajanimi/Desktop/thi.csv', header = TRUE)
    Caution

    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().

    thi <- read_excel('C:/Users/kasutajanimi/Desktop/thi.xlsx')
    Tip

    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/')
    thi <- read.csv('thi.csv')
    Warning

    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.

    5.5 Ülevaade objektist

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

    5.6 Valimine

    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
    Fibonacci[3]
    [1] 2
    # Andmetabel esimese rea ja neljanda veeru väärtus
    thi[1, 4]
    [1] 105.58
    # Andmetabeli veeru Tarbijahinnaindeks esimene rida
    thi$Tarbijahinnaindeks[1]
    [1] 105.58
    # Andmetabel esimese rea ja kõikide veergude väärtused
    thi[1, ]
      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
    Fibonacci[c(3,4)]
    [1] 2 3
    # Kolmas ja neljas väärtus tõeväärtusena
    Fibonacci[c(FALSE,FALSE,TRUE,TRUE,FALSE)]
    [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
    thi[thi$Tarbijahinnaindeks < 100 & thi$Kaubagrupp != 'Side', ]
        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
    thi[thi$Kuu == 'Jaanuar' & thi$Kaubagrupp == 'Kokku', 
        c('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
    Note

    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:

    • võrdub == (kaks võrdusmärki),
    • ei võrdu !=,
    • suurem kui >,
    • väiksem kui <,
    • suurem või võrdne kui >=,
    • väiksem või võrdne kui <=.

    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:

    • mitte x (!x)
    • x ja y (x & y),
    • x või y (x | y),
    • x ja mitte y (x & !y).

    5.6.1 Valimine andmetabelist

    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
    thi <- filter(thi, Aasta >= 2020)

    5.7 Kokkuvõtted

    Väärtuste kokku võtvaks kirjeldamiseks on väga palju viise ja neile vastavaid funktsioone, aga alustuseks vaatame liitmist, keskmist ja äärmuslikke väärtusi.

    Fibonacci <- c(0,1,1,2,3,5,8,13,21,34,55,89)
    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

    5.8 Torutamine

    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
    eluase <- filter(thi, Kaubagrupp == 'Eluase')
    eluase <- filter(eluase, Aasta == 2022)
    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?
    thi %>% filter(Tarbijahinnaindeks > 400) 
       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

    5.9 Salvestamine

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

    5.10 Korratav analüüs

    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:

    • kui soovime sisestatud käsu tühistada, siis saame jooksutada uuesti eelnevad käsud;
    • kui avastame hiljem, et tegime vea või soovime midagi tehtud analüüsis muuta, siis piisab käsulehel muudatuse tegemisest ja käsulehe uuesti jooksutamisest;
    • saame hiljem üle vaadata, kuidas täpselt andmetöötluses mingi tulemuseni jõudsime;
    • teised saavad veenduda meie tulemuste õigsuses, rakendades meie koosatud käsulehte mingitel andmetel.
    Note

    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:

    1. töökausta määramine,
    2. laienduste laadimine,
    3. andmete sisestamine,
    4. andmetöötlus,
    5. tulemuse salvestamine andmefailide, tabelite, jooniste või muul kujul.

    5.11 Aruanded R keeles

    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.