Andmetüübid ja objektitüübid

Vaatlused ja tunnused

Tüüpilised andmete saamise viisid on:

  • introspektsioon
  • intervjuu
  • küsitlused
  • (teksti)kogud, korpused, andmebaasid jne
  • katsed

Sellel kursusel tegeleme põhiliselt küsitluste ja andmebaaside andmetega, mida hoitakse tabelkujul ning mille ridades olevaid vaatlusi (ingl observation) iseloomustatakse teatud tulpades asuvate tunnuste (ingl variable) abil. Tabeli lahtrites omakorda on iga vaatluse iga tunnuse väärtus (ingl value).


Wickham, Çetinkaya-Rundel, Grolemund (2023). R for Data Science (2e)


Näiteks võime iseloomustada inimesi nende pikkuse, kaalu, silmavärvi, hariduse jpm tunnuste põhjal. Sõnu jällegi võib iseloomustada nende graafilise pikkuse, silpide arvu, välte, tähendusklassi, sõnaliigi, sageduse jms tunnuste põhjal.


Tunnused/muutujad aitavad niisiis andmeid kirjeldada ja jagunevad uuritavateks/sõltuvateks tunnusteks (see, mida uurime ja mille kohta tahame midagi väita) ja seletavateks/sõltumatuteks tunnusteks (need, mille kaudu uuritavat tunnust iseloomustame). Inglise keeles viidatakse neile sageli vastavalt kui dependent variable / response (variable) / outcome (variable) ja independent variable / predictor (variable) / explanatory variable.
Näiteks võime uuritava tunnusena käsitleda inimese kaalu ning seletavate tunnustena inimese pikkust, füüsilist aktiivsust (nt minutites nädalas), unetundide arvu jms. Sõnade puhul võib meil olla näiteks hüpotees, et sagedasemad sõnad on lühemad, mispuhul saame uuritavaks tunnuseks võtta sõna pikkuse ja seletavaks tunnuseks sõna sageduse. Kas võiks ka vastupidi?

Mis on järgmistes näidetes uuritav ja mis seletav tunnus?

  • Kuidas mõjutavad sugu ja vanus erakondlikku eelistust?
  • Kuidas sõltub hinnang oma söögitegemisoskusele programmeerimisoskusest?



Tunnuste jagunemine

See, et andmeanalüüs on kvantitatiivne, ei tähenda, et kõik andmed ise peaksid tingimata olema arvulised. Laiemalt jagunevadki tunnused kvalitatiivseteks ja kvantitatiivseteks.

  • Kvalitatiivsed/mittearvulised:
    • nominaalskaalal: kaks või enam kategooriat, mis teineteist välistavad. Peetakse kõige ebatäpsemaks ja vähem informatiivseks tunnusetüübiks. Samas on just nominaalskaala tunnused humanitaar- ja sotsiaalteaduste andmestikes väga levinud.
      Nt sugu(mees/naine), tegusõna sihilisus (transitiivne/intransitiivne), kääne (nominatiiv/genitiiv/partitiiv), nimi, kogumispunkt, teema jne.
    • ordinaalsel e järjestusskaalal: kategooriad on mingil alusel järjestatud, aga väärtuste vahe ei pruugi olla ühesugune.
      Nt haridus (alg-/põhi-/kesk-/kõrgharidus), nõustumine (ei nõustu üldse / pigem ei nõustu / pigem nõustun / nõustun täielikult).
  • Kvantitatiivsed/arvulised:
    • intervalli- e vahemikskaalal: esitab võrdseid erinevusi skaala punktide vahel.
      Nt temperatuur.
    • suhteskaalal: nagu intervalliskaala, aga tähendusliku nullpunktiga.
      Nt sõnasagedused, sõnade graafilised/silbilised pikkused, reaktsiooniaeg.
    • kvantitatiivsed tunnuseid võib jagada ka
      • pidevateks e mõõdetavateks (temperatuur kraadides, pikkus sentimeetrites, reaktsioon millisekundites, valuutakurss dollarites, vanus aastates)
      • diskreetseteks e loendatavateks (sõnasagedused korpuses, laste arv peres, külastajate arv etendusel).

Eri skaalal tunnused võimaldavad erineval hulgal tehteid.

  • Kõige piiratumalt saab opereerida nominaalskaala tunnustega: nende väärtusi saab võrrelda ainult kvalitatiivselt (nt kass ei ole koer).
  • Järjestusskaala tunnuste väärtuseid saab lisaks võrrelda ka sellel alusel, et mingi väärtus on suurem/rohkem kui mingi teine (nt keskharidus tähendab rohkem haridust kui põhiharidus, pigem nõustun tähendab rohkem nõustumist kui pigem ei nõustu).
  • Intervalliskaalal tunnustega saab teha kõiki neid võrdlusi, mida nominaal- ja järjestusskaala tunnustega (nt 3 kraadi ei ole 2 kraadi ja 3 kraadi on rohkem kui 2 kraadi), ent lisaks saab öelda ka, kui palju (ehk kui mitme intervalli võrra) üks väärtus teisest suurem/väiksem on (nt 3 kraadi on 1 kraadi võrra rohkem kui 2 kraadi).
  • Suhteskaala tunnused võimaldavad kõige rohkem tehteid. Lisaks kõikidele eelnimetatutele saab neid tunnuseid võrrelda ka sellel alusel, kui mitu korda on mingi väärtus teisest väärtusest suurem või väiksem (nt 80-aastane on 4 korda vanem kui 20-aastane, aga 80 kraadi ei ole 4 korda soojem kui 20 kraadi).
pilt
Levshina 2015: 18


Tunnuseid on võimalik teisendada ühest klassist teise, ent ainult suunal suhteskaala -> nominaalskaala ehk ratio -> nominal!
Näiteks sõnasagedus on intervalliskaala tunnus, aga võime sõnad jagada ka klassidesse harvad, keskmise sagedusega ja sagedased, mispuhul on tegemist järjestusskaala tunnusega. Vastupidi ei ole aga võimalik tunnuseid teisendada.

Küsitluses, millele vastasid, olid järgmised küsimused. Millised neist on kvalitatiivsed ja millised kvantitatiivsed? Millisel skaalal tunnused on?

##                                                                    
## Q2  "Mis on sinu sünniaasta?"                                      
## Q3  "Millisel õppekaval õpid?"                                     
## Q4  "Mitu aastat oled käinud ülikoolis?"                           
## Q5  "Kas sul on varasemaid kogemusi kvantitatiivsete meetoditega? "
## Q6  "Kirjelda oma programmeerimisoskusi (ükskõik mis keeles)"      
## Q7  "Kui tõenäoline on, et läbid selle kursuse?"                   
## Q8  "Kohv või tee?"                                                
## Q9  "Hinda oma söögitegemisoskusi"                                 
## Q10 "Vali loom"

Nominaalskaalal tunnused

Nominaalskaalal tunnused?

Ordinaalskaalal tunnused

Intervalliskaalal tunnused

Suhteskaalal tunnused

Objektitüübid

Saame R-is töötada erinevat tüüpi andmetega. Suhte- ja intervallskaala väärtused on tüüpiliselt arvud, nominaal- ja järjestusskaala väärtused on tüüpiliselt tekst. Viimaseid tuleb R-is kirjutada jutumärkide vahele.

68
## [1] 68
1.7^1.7
## [1] 2.464695
"kass"
## [1] "kass"
"kass ja koer"
## [1] "kass ja koer"

Võime toimetada R-is niisiis küll ka konkreetsete arvude või tekstijärjenditega, aga enamasti tekib meil vajadus neid väärtusi või erinevate tehete tulemusi hilisemaks kasutamiseks talletada. Objektiks võimegi nimetada elementi, mis talletab mingit tüüpi andmeid (teksti/tekste, arve, tabeleid, maatrikseid jne). Objektile saab väärtusi omistada kas võrdusmärgiga = või noolekesega <-. Sellel kursusel eelistame noolekest, et selgemalt eristada objektidele ja funktsiooni argumentidele väärtuste omistamist.

a <- 1.7

68 -> b # noolekese ots peab olema suunatud objekti suunas
68 <- b # ei tööta
## Error in 68 <- b: invalid (do_set) left-hand side to assignment
c <- b/(a^2)
d <- "kass"

Sellisel juhul ilmub objekt R-i keskkonda (Environment paneeli), aga konsooli teda ei trükita. Konsooli trükkimiseks saab kasutada lihtsalt objekti nime.

c
## [1] 23.52941

Objektide kasutamine teeb esiteks meie koodi paremini loetavaks, kuna objektidele saab anda tähenduslikke nimesid. Piiranguks nimetamisel on vaid see, et objekti nimi ei tohi alata numbriga ega tohi sisaldada tühikuid ega kirjavahemärke peale alakriipsu ja punkti.

pikkus_m <- 1.7 # loome objekti, mille väärtus on 1.7
kaal_kg <- 68 # loome objekti, mille väärtus on 68

KMI <- kaal_kg/(pikkus_m ^ 2) # loome objekti, mille väärtus on objekti 'kaal_kg' väärtus jagatud objekti 'pikkus_m' väärtuse ruuduga
KMI # trükime objekti 'KMI' väärtuse konsooli
## [1] 23.52941

Teiseks saab üht ja sama objekti koodis korduvalt kasutada ja selle väärtusi (nt vastavalt kasutaja sisendile) muuta. Sellest saab paremini aru, kui hakkame andmetabelitega tegelema.

Igat objekti iseloomustavad tüüp ja klass.

Objektitüüp (vahel nimetatakse ka andmetüübiks) ütlebki meile seda, mis sorti andmetega on tegemist. Põhilised objektitüübid on R-is niisiis

  • arv (numeric)
    nt 123.456 või 1234
  • tekst (character)
    nt "Tere!", "Number 2", "123.456"
  • tõeväärtus (logical)
    nt TRUE ja FALSE



Arvud

Arvud (numeric), nagu oleme juba näinud, kirjutatakse lihtsalt numbritega. Arvulise väärtusega muutujatega saab teha matemaatilisi tehteid (liita-lahutada jne).

4 # see trükitakse välja, objekti ei teki
## [1] 4
arv1 <- 4 # objektile 'arv1' omistatakse väärtus 4, aga midagi välja ei trükita
arv2 <- 5

arv3 <- sqrt((arv1 + arv2)^3) # ^-märk tähistab siin astendamist, sqrt() on ruutjuure leidmise funktsioon
arv3 # see trükitakse välja
## [1] 27

Arvud võivad omakorda jaguneda täisarvudeks (integer) ja murdarvudeks/ujukomaarvudeks (double). Murdarvus kasutatakse R-is koma asemel punkti (nt 2.7, mitte 2,7)!

Tekst

Tekst (character) tuleb kirjutada jutumärkides (kas ühe- või kahekordsetes). Ka numbreid võib esitada tekstina. Tekstiga matemaatilisi tehteid teha ei saa, küll aga saab eri funktsioonide abil näiteks tekstiosi omavahel kombineerida või tekstijada (ingl string) pikkust pärida.

"Tartu" # see trükitakse konsooli, objekti ei teki
## [1] "Tartu"
pärisnimi <- "Tartu" # objektile 'pärisnimi' omistatakse väärtus "Tartu", aga midagi välja ei trükita
üldnimi <- 'ülikool' # ühekordsed jutumärgid töötavad samaväärselt
arv <- "104" # objektile 'arv' omistatakse tekstiväärtus "104"
paste(pärisnimi, üldnimi, arv, sep= " ") # kleebime kolme objekti väärtused kokku (paste = kleebi)
## [1] "Tartu ülikool 104"
nchar(üldnimi) # leia objekti 'üldnimi' väärtuse tähemärkide arv (n = number, char = characters)
## [1] 7
substr(üldnimi, 4, 7) # võta välja objekti üldnimi väärtuse 4.-7. tähemärk (substr = substring)
## [1] "kool"
# mis juhtub tekstiga matemaatilisi tehteid proovides?
pärisnimi + üldnimi 
## Error in pärisnimi + üldnimi: non-numeric argument to binary operator
arv^2
## Error in arv^2: non-numeric argument to binary operator

Küsimus R-i testist

Tõeväärtused

Tõeväärtus (logical) on binaarne muutuja, millel on kaks võimalikku väärtust: TRUE ja FALSE, need sisestatakse suurtäheliselt ilma jutumärkideta, töötab ka ainult esitähega T/F.

Milleks tõeväärtusi vaja on?

Tõeväärtused saame vastuseks, kui testime, kas mingi tingimus on täidetud. Tingimuste kontrolli läheb meil vaja siis, kui meil on näiteks suuremast andmestikust vaja leida kindlatele tunnustele vastav alamosa (näiteks võtta tabelist välja ainult read, kus tulbas Sugu on väärtus mees, või read, kus tulbas Vanus on suurem väärtus kui 50). Tõeväärtustega saab ka matemaatilisi tehteid teha.

üks <- 1 # objektile 'üks' omistatakse väärtus 1, midagi välja ei trükita
kaks <- 2
üks > kaks # Kas objekti 'üks' väärtus on suurem kui objekti 'kaks' väärtus?
## [1] FALSE
3 == üks + kaks # Kas arv 3 võrdub objekti 'üks' väärtuse ja objekti 'kaks' väärtuse summaga?
## [1] TRUE
"koer" == "kass" # Kas tekst "koer" on sama mis "kass"?
## [1] FALSE
TRUE == 1 # Kas TRUE on võrdne ühega?
## [1] TRUE
FALSE == 0 # Kas FALSE on võrdne nulliga?
## [1] TRUE
FALSE + TRUE + FALSE
## [1] 1
400 * TRUE
## [1] 400

Tundmatu väärtus

Lisaks on R-is oluline tundmatu väärtus ehk NA (not applicable, not available, no answer). Kõigi objektitüüpide hulgas võib olla tundmatuid väärtusi, näiteks kui me ei tea kõikide oma andmestiku katseisikute vanuseid, mõni mõõtmistulemus on läinud untsu või mõni kategooria pole üldse kõikide vaatluste puhul relevantne. Tundmatu väärtusega tehteid tehes on tulemuseks samuti tundmatu väärtus.

tundmatu <- NA
3 + NA
## [1] NA
is.na(tundmatu)
## [1] TRUE

Objekti tüübi küsimine

Objektide tüüpi saab küsida käsuga mode() või class().

mode(arv1)
## [1] "numeric"
class(arv1)
## [1] "numeric"
mode(pärisnimi)
## [1] "character"
class(pärisnimi)
## [1] "character"
mode(tundmatu)
## [1] "logical"
class(tundmatu)
## [1] "logical"

Samuti võib küsida, kas objekt on mingit konkreetset tüüpi.

is.numeric(arv1)
## [1] TRUE
is.character(pärisnimi)
## [1] TRUE
is.logical(tundmatu)
## [1] TRUE

Ülesanne 1

Loo üks objekt nimi, millele omistad väärtuseks oma eesnime, teine objekt vanus, millele omistad väärtuseks oma vanuse, ning kolmas objekt hinnang, mis võib saada väärtuseks ainult kas sõna juba või sõna alles.

Jooksuta seejärel allolevat paste() käsku, et lasta R-il sind sobivalt tutvustada.

paste("Minu nimi on ", nimi, " ja ma olen ", hinnang, " ", vanus, "-aastane!", sep = "")

Objektiklassid

Objektiklass tähistab andmestruktuuri ehk seda, kuidas andmed objektis on korrastatud. Objektiklasse on küll ka rohkem ja spetsiifilisemaid, aga esialgu võiks meil tulla tegemist 4 põhilise klassiga:

  • vektorid (vector)
    nt 1, 1:10, c(1:10), c(1,400,800), "Tere!", c("Tere!", "Head aega!"), TRUE, c(TRUE, FALSE, TRUE, TRUE), vector("character", length = 10)
  • listid (list)
    nt list(1:10), list(1:10, 10:5), list(1:10, "a", list(c(TRUE, FALSE), TRUE))
  • maatriksid (matrix)
    nt matrix(1:9), matrix(1:9, nrow = 3), matrix(c(TRUE, TRUE, FALSE, FALSE), ncol = 2)
  • tabelid (data.frame)
    nt data.frame(nimi = c("Anu", "Mart", "Sipsik"), pikkus = c(145, 160, 30), kaal = c(40, 58, 2)), as.data.frame(matrix(1:9, nrow = 3))

Vektorid on ühemõõtmelised objektid, mis võivad sisaldada ainult üht tüüpi elemente, nt ainult arve, ainult teksti või ainult tõeväärtuseid.
Maatriksid on kahemõõtmelised (= ridade ja tulpadega) objektid, mis võivad sisaldada ainult üht tüüpi elemente, nt ainult arve, ainult teksti või ainult tõeväärtuseid.
Tabelid on kahemõõtmelised objektid, mis võivad veergudes sisaldada erinevat tüüpi elemente (nt tekstivektoreid, arvuvektoreid, tõeväärtusvektoreid).
Listid on komplekssed, struktureerimata objektid, mis võivad sisaldada erinevat tüüpi elemente, sh tabeleid ja teisi liste, funktsioone jm.

Kõige rohkem pöörame sellel kursusel tähelepanu just vektoritele ja tabelitele. Tabelite (ja maatriksite) puhul on oluline ära märkida, et R-is peaks tabel olema kindlasti sümmeetriline, st igas reas on ühepalju tulpasid ja igas tulbas ühepalju ridu (nn tidy andmestruktuur). Selline Exceli-tüüpi tabel, kus ühe ruudulise lehe peal võib olla mitu tabelit, on R-ile raskesti seeditav. Ka erinevad stiliseeritud ja pesastatud tabelid, kus ühes lahtris toimub omakorda jagunemine väiksemateks lahtriteks, võivad tekitada omajagu tüli (vt ka nt https://www.r-bloggers.com/2020/05/what-it-takes-to-tidy-census-data/).
Keerulisema struktuuriga objektidega, nagu on R-is list, me täna ei tegele, aga näeme neid rohkem siis, kui hakkame mudelite väljundeid vaatama.

Vektorid

R-i põhiline objektiklass on vektor. Kõik teised objektid koosnevad vektoritest, st nende osi saab käsitleda vektoritena.

Vektor on ühemõõtmeline objekt, millel võib olla üks või enam üht tüüpi väärtust. Kõige lihtsam vektor koosnebki ainult ühest elemendist, st tal on üks väärtus. Näiteks kui sisestada üks arv või üks sõna, siis see on vektor, millel on üks element.

4
## [1] 4
length(4) # käsk `length()` annab vastuseks vektori elementide arvu.
## [1] 1

Vektoris võib olla ka rohkem kui üks väärtus. Funktsioon c() (concatenate) kombineerib üksikud väärtused kokku vektoriks (erinevate väärtuste loendiks).

arvuvektor <- c(3,6,8,11,24)
tekstivektor <- c("nina", "kõrvad", "silmad")

Järjestikuste arvude jada saab luua ka kooloniga.

arvuvektor2 <- c(1,2,3,4,5) 
# on sama, mis
arvuvektor3 <- 1:5

Kui mõelda pisut etteruttavalt andmetabelite peale, siis põhimõtteliselt iga andmetabeli tulp, mis sidaldab üksikute vaatluste konkreetse tunnuse väärtusi (nt vanuseid), on sisuliselt üks vektor.

Proovi nüüd nende loodud vektorite peal funktsiooni length(), mis ütleb, mitu väärtust vektoris on.

Ühes vektoris on kõik elemendid sama tüüpi (nt ainult arvud, ainult tekst, ainult loogilised väärtused). Vektori tüüpi saab jällegi küsida käsuga mode() või class().

class(arvuvektor)
## [1] "numeric"

Kui püüda samasse vektorisse kokku panna eri tüüpe elemente, siis arvude ja loogiliste väärtuste kombineerimisel teisendatakse loogilised väärtused arvudeks (0 või 1), nende kombineerimisel tekstiga omakorda teisendatakse kõik elemendid tekstiks.

Küsimused R-i testist


Käsk c() võib omavahel kokku kombineerida mitte ainult mitu üksikut väärtust, vaid ka mitu mitmest elemendist koosnevat vektorit.

veel_üks_arvuvektor <- c(arvuvektor, arvuvektor2, 20:30)
veel_üks_arvuvektor
##  [1]  3  6  8 11 24  1  2  3  4  5 20 21 22 23 24 25 26 27 28 29 30
length(veel_üks_arvuvektor)
## [1] 21

Vektoritega tehete tegemisel rakendatakse tehet (nt liitmine) elementide kaupa. Kui vektorid on eri pikkusega, siis lühemat vektorit taaskasutatakse.

# ühepikkused vektorid
arvuvektor + arvuvektor2 # liida 3+1, 6+2, 8+3, 11+4, 24+5
## [1]  4  8 11 15 29
# erineva pikkusega vektorid
1:10 * c(3,0) # 1*3, 2*0, 3*3, 4*0 jne
##  [1]  3  0  9  0 15  0 21  0 27  0

Ja kui pikem vektor ei jagu täpselt lühemaga, siis lühemat küll taaskasutatakse nii, et kõik pikema vektori elemendid saaksid endale paarilise, aga kõik lühema vektori elemendid ei saa võrdselt kordusi, mille kohta antakse ka hoiatus.

1:10 * c(3,0,1) # 1*3, 2*0, 3*1 ... 10*3
## Warning in 1:10 * c(3, 0, 1): longer object length is not a multiple of shorter
## object length
##  [1]  3  0  3 12  0  6 21  0  9 30

Vektorist saab üksiku väärtuse või mingi osa kätte indeksite abil. Indeksid on tegelikult ise ka vektorid. Indeks kirjutatakse vektori nime järele nurksulgudesse:

tekstivektor2 <- c("kala", "kana", "kaja", "kava", "kaba", "kada", "kaka", "kaua", "kama")
tekstivektor2[3] # vektori kolmas element
## [1] "kaja"
tekstivektor2[2:4] # vektori teine, kolmas ja neljas element
## [1] "kana" "kaja" "kava"
tekstivektor2[c(5,1)] # vektori viies ja esimene element
## [1] "kaba" "kala"

Küsimus R-i testist

Omamoodi indeksitena saab kasutada ka võrratusi, mispuhul indeksitena kasutatav vektor on tõeväärtuste vektor.

tekstivektor2 == "kana" # küsi iga tekstivektori elemendi kohta, kas see võrdub sõnaga "kana"
## [1] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
tekstivektor2[tekstivektor2 == "kana"] # küsi vektorist ainult neid elemente, mis võrduvad sõnaga "kana"
## [1] "kana"
arvuvektor > 10 # küsi iga arvuvektori elemendi kohta, kas see on suurem kui 10
## [1] FALSE FALSE FALSE  TRUE  TRUE
arvuvektor[arvuvektor > 10] # küsi vektorist ainult neid elemente, mis on suuremad kui 10
## [1] 11 24

Vektori eritüüp on faktor. Faktor (factor) on piiratud hulga väärtustega nominaalne vektor.

vanus <- factor(c("vana","noor","noor"), levels=c("noor","vana"))

Miks faktoreid vaja on?
1) faktori väärtuseid saab järjestada, see on oluline näiteks järjestusskaalaga muutujate puhul (“vana” > “keskealine” > “noor”);
2) on arvutuslikult ökonoomsem, sest ehkki faktori taseme (level) nimi võib koosneda mitmest tähemärgist (nt noor, keskealine), on iga tase/klass tegelikult kodeeritud unikaalse arvuga (nt 1, 2).

Faktori tasemed märgivad faktori unikaalseid väärtusi. Faktori tasemed on alati mingil moel järjestatud, ent vaikimisi tähestiku järjekorras või arvude puhul väiksemast suuremani. Faktori tasemeid saab küsida käsuga levels().

haridus <- factor(c("põhi", "kesk", "põhi", "kesk", "kõrg"))
arvud <- factor(c(9,3,6,2,1,1,2,2))
levels(haridus)
## [1] "kesk" "kõrg" "põhi"
levels(arvud)
## [1] "1" "2" "3" "6" "9"

Küsimus R-i testist

Faktoreid saab ümber järjestada näiteks factor()-funktsioonis argumendi levels abil.

haridus <- factor(haridus, levels = c("põhi", "kesk", "kõrg"))
arvud <- factor(arvud, levels = c(9,6,3,2,1))
levels(haridus)
## [1] "põhi" "kesk" "kõrg"
levels(arvud)
## [1] "9" "6" "3" "2" "1"

Kui vektorite puhul annavad käsud mode() ja class() sama väljundi, siis keerukamate andmestruktuuride puhul näeme nende kasutuses juba erinevusi. Näiteks faktorite puhul ütleb class() seda, milline on andmestruktuur, mode() aga seda, mis tüüpi andmetest see struktuur koosneb.

class(haridus)
## [1] "factor"
mode(haridus)
## [1] "numeric"

Eraldi faktori liik on järjestatud faktor (ordered factor), mille puhul on eksplitsiitne ka see, et iga järgmine faktori tase on eelmisest suurem/kõrgem/rohkem/tähtsam.

haridus <- factor(haridus, ordered = TRUE)
haridus
## [1] põhi kesk põhi kesk kõrg
## Levels: põhi < kesk < kõrg
class(haridus)
## [1] "ordered" "factor"
mode(haridus)
## [1] "numeric"

Tabelid

Tabel on kahemõõtmeline objekt: on read ja veerud, aga oluline on see, et igas reas on sama palju veerge ja vastupidi, ehkki lahtrites võib olla ka puuduvaid väärtusi.

Siin kursusel kasutame kõige rohkem tabeleid, mille klass on data.frame, mingites olukordades ka maatriksit (matrix). Maatriksi ja data.frame’i vahe R-is on see, et maatriksis saab olla ainult ühte tüüpi andmeid (nt ainult arvud), aga data.frame’is võib iga tulp olla erinevat tüüpi.

matrix(20:28, # arvud, mis tabelisse lähevad
       ncol = 3, # tulpade arv, millesse arvud jagatakse
       dimnames = list(c("1", "2", "3"), # reanimed
                       c("Arvud1", "Arvud2", "Arvud3"))) # tulbanimed
##   Arvud1 Arvud2 Arvud3
## 1     20     23     26
## 2     21     24     27
## 3     22     25     28
data.frame(Arvud = c(20,21,22), # esimese tulba nimi ja väärtused
           Tekst = c("a", "b", "c"), # teise tulba nimi ja väärtused
           Tõeväärtused = c(TRUE, FALSE, FALSE)) # kolmanda tulba nimi ja väärtused
##   Arvud Tekst Tõeväärtused
## 1    20     a         TRUE
## 2    21     b        FALSE
## 3    22     c        FALSE

Nagu näeme, saab R-is andmeid ka vektoritest data.frame() käsuga tabeliks kokku panna, aga üldjuhul saame data.frame’i kujulise objekti nii, et loeme tabelina struktureeritud andmeid mingist failist.

Kui andmestik on R-is korrastatud ja RData formaadis salvestatud, siis neid andmestikke saab avada käsuga load(). Näiteks sellisel kujul on Moodle’is failis kysimustik_2024.RData korrastatud vastused küsimustikule, mida eelmises praktikumis täitsite. Lisaks on seal ka varasemate aastate vastused. Kui laadite RData andmestiku alla ja panete selle oma kursuse andmestike kausta (nt kausta nimega andmestikud, andmed, data vmt).

load("data/kysimustik_2024.RData")

Selle käsurea rakendamisest justkui ei juhtugi midagi, aga töölauale tekkis objekt nimega kysimustik, mille klassiks on data.frame.

class(kysimustik)
## [1] "data.frame"

Nüüd oleks vaja saada natuke aimu, mida see tabel endast kujutab. Selleks proovime käske:

  • dim()
  • View()
  • head()
  • tail()
  • summary()
  • str()
dim(kysimustik) # mitu rida ja mitu tulpa on tabelis?
View(kysimustik) # vaata tervet andmetabelit
head(kysimustik) # näita tabeli esimesi ridu
tail(kysimustik) # näita tabeli viimaseid ridu
summary(kysimustik) # näita ülevaadet tabeli tunnustest
str(kysimustik) # näita tabeli struktuuri

Kui andmetabel ei ole RData-formaadis (enamasti ei ole), saab selle sisselugemiseks kasutada paljusid muid funktsioone, mis algavad üldjuhul sõnaga read. csv- või txt-formaadis tabeleid saab lugeda näiteks järgmiste käskudega, mis erinevad põhiliselt selle poolest, millised on erinevate argumentide (nt header, sep) vaikeväärtused:

kysimustik_csv <- read.table("data/kysimustik_2024.csv", header = TRUE, sep = "\t", encoding = "UTF-8")
kysimustik_csv <- read.delim("data/kysimustik_2024.csv", encoding = "UTF-8")
kysimustik_csv <- read.csv("data/kysimustik_2024.csv", sep = "\t", encoding = "UTF-8")
kysimustik_csv <- read.csv2("data/kysimustik_2024.csv", sep = "\t", encoding = "UTF-8")

Failil kysimustik_2024.csv on tulbanimedega päis (header), tulpasid eraldavad tabulaatorid (\t) ning faili kodeering on UTF-8. Kuna funktsioonide vaikeväärtused on erinevad (näiteks read.table() eeldab vaikimisi, et tabelil ei ole tulbanimesid), peame eri funktsioonidega andmeid sisse lugedes täpsustama erinevaid asju, vastavalt oma andmestiku struktuurile.

Küsimused R-i testist

R-i saab erinevate pakettide abil laadida ka muus formaadis faile, näiteks Exceli, SPSSi, SASi, STATA, JSONi või XMLi faile.

# Exceli failid
# install.packages("readxl")
library(readxl)
kysimustik_xlsx <- read_excel("data/kysimustik_2024.xlsx")
# SPSSi, SASi, STATA failid
# install.packages("haven")
library(haven)
kysimustik_sav <- read_sav("data/kysimustik_2024.sav") # SPSS
kysimustik_sas7bdat <- read_sas("data/kysimustik_2024.sas7bdat") # SAS
kysimustik_dta <- read_stata("data/kysimustik_2024.dta") # STATA
# JSONi fail
# install.packages("jsonlite")
library(jsonlite)
kysimustik_json <- fromJSON("data/kysimustik_2024.json")
# XMLi fail
# install.packages("xml2")
library(xml2)
kysimustik_xml <- as.data.frame(read_xml("data/kysimustik_2024.xml"))


Tabelist saab selle osi pärida samamoodi indeksite abil nagu vektorist, aga nüüd peab arvestama, et nurksulgudes tuleb märkida nii ridade kui ka veergude indeksid. Ridade indekseid täpsustame kantsulgude sees enne koma ja tulpade indekseid pärast koma.

kysimustik[1,] # küsimustiku 1. rida
kysimustik[c(1,3,5,7),] # küsimustiku 1., 3., 5. ja 7. rida

kysimustik[,5] # küsimustiku 5. tulp
kysimustik[,1:2] # küsimustiku 1. ja 2. tulp

kysimustik[3, 5] # küsimustiku 3. rea 5. tulba väärtus
kysimustik[1:10, 5] # küsimustiku esimese 10 rea 5. tulba väärtused

Kui me tahame tabelist nime järgi välja võtta ühe terve tulba, siis seda saab ka nii:

kysimustik$lemmikjook
##   [1] Kohv Kohv Kohv Kohv Kohv Kohv Tee  Tee  Kohv Kohv Tee  Tee  Tee  Tee  Tee 
##  [16] Tee  Kohv Tee  Tee  Kohv Tee  Kohv Kohv Tee  Kohv Tee  Kohv Tee  Tee  Tee 
##  [31] Tee  Tee  Kohv Tee  Kohv Tee  Kohv Tee  Kohv Kohv Kohv Tee  Kohv Kohv Tee 
##  [46] Tee  Kohv Kohv Kohv Kohv Tee  Tee  Kohv Tee  Kohv Kohv Kohv Tee  Kohv Kohv
##  [61] Kohv Kohv Tee  Tee  Kohv Kohv Tee  Kohv Kohv Kohv Kohv Kohv Kohv Tee  Kohv
##  [76] Kohv Kohv Kohv Kohv Kohv Tee  Kohv Tee  Kohv Kohv Tee  Kohv Kohv Tee  Kohv
##  [91] Kohv Tee  Tee  Tee  Kohv Tee  Kohv Kohv Tee  Kohv Tee  Kohv Tee  Kohv
## Levels: Kohv Tee
# või
kysimustik[,"lemmikjook"]
##   [1] Kohv Kohv Kohv Kohv Kohv Kohv Tee  Tee  Kohv Kohv Tee  Tee  Tee  Tee  Tee 
##  [16] Tee  Kohv Tee  Tee  Kohv Tee  Kohv Kohv Tee  Kohv Tee  Kohv Tee  Tee  Tee 
##  [31] Tee  Tee  Kohv Tee  Kohv Tee  Kohv Tee  Kohv Kohv Kohv Tee  Kohv Kohv Tee 
##  [46] Tee  Kohv Kohv Kohv Kohv Tee  Tee  Kohv Tee  Kohv Kohv Kohv Tee  Kohv Kohv
##  [61] Kohv Kohv Tee  Tee  Kohv Kohv Tee  Kohv Kohv Kohv Kohv Kohv Kohv Tee  Kohv
##  [76] Kohv Kohv Kohv Kohv Kohv Tee  Kohv Tee  Kohv Kohv Tee  Kohv Kohv Tee  Kohv
##  [91] Kohv Tee  Tee  Tee  Kohv Tee  Kohv Kohv Tee  Kohv Tee  Kohv Tee  Kohv
## Levels: Kohv Tee

See üks tulp on tegelikult ka vektor. Tulba või üksikud väärtused saab suunata ka eraldi uude objekti, tulba väärtusi omakorda indeksite abil välja võtta jne.

Nii nagu vektoreid võib ka tabelitest elemente (ridu või tulpasid) välja võtta ka võrratuste abil.

# tabel
kysimustik[kysimustik$synniaasta > 1999,] # read, kus sünniaasta väärtus on suurem kui 1999
##     synniaasta                        oppekava kaua_opid kogemused_kvant
## 42        2000   semiootika ja kultuuriteooria         2             Jah
## 48        2001                      filosoofia         1              Ei
## 52        2000 eesti ja soome-ugri keeleteadus         3             Jah
## 55        2001 eesti ja soome-ugri keeleteadus         1             Jah
## 58        2000                         ajalugu         3             Jah
## 65        2000                    inglise keel         2              Ei
## 66        2001                       usuteadus         3             Jah
## 68        2001                         ajalugu         2              Ei
## 78        2002        matemaatiline statistika         1             Jah
## 181       2001                    inglise keel         2             Jah
## 191       2000                      filosoofia         2              Ei
## 110       2003                    inglise keel         3             Jah
## 210       2001                     keeleteadus         3             Jah
## 310       2001                    inglise keel         3             Jah
## 410       2001                geenitehnoloogia         3             Jah
## 610       2000     euroopa keeled ja kultuurid         4             Jah
## 710       2002                    inglise keel         3             Jah
## 111       2000                    inglise keel         3             Jah
## 121       2000                         ajalugu         4              Ei
## 141       2001                     romanistika         3              Ei
## 151       2001                         ajalugu         3             Jah
## 161       2000                     keeleteadus         4              Ei
## 171       2001                     keeleteadus         4              Ei
## 211       2000                     keeleteadus         4             Jah
## 221       2001                         ajalugu         2              Ei
##                                                programmeerimisoskus
## 42                                         Saan mingid asjad tehtud
## 48                                         Saan mingid asjad tehtud
## 52                                         Saan mingid asjad tehtud
## 55                                         Saan mingid asjad tehtud
## 58                                         Saan mingid asjad tehtud
## 65                                         Saan mingid asjad tehtud
## 66                 Olen püüdnud õppida, aga külge pole palju jäänud
## 68                                         Saan mingid asjad tehtud
## 78  a='dream';b='I';c='code';d='in';while(TRUE){cat(b,a,d,c,'\\n')}
## 181 a='dream';b='I';c='code';d='in';while(TRUE){cat(b,a,d,c,'\\n')}
## 191 a='dream';b='I';c='code';d='in';while(TRUE){cat(b,a,d,c,'\\n')}
## 110                                        Saan mingid asjad tehtud
## 210                Olen püüdnud õppida, aga külge pole palju jäänud
## 310                                        Saan mingid asjad tehtud
## 410                                        Saan mingid asjad tehtud
## 610                                        Saan mingid asjad tehtud
## 710                Olen püüdnud õppida, aga külge pole palju jäänud
## 111                                        Saan mingid asjad tehtud
## 121                                                        Puuduvad
## 141                Olen püüdnud õppida, aga külge pole palju jäänud
## 151                                        Saan mingid asjad tehtud
## 161                                        Saan mingid asjad tehtud
## 171                Olen püüdnud õppida, aga külge pole palju jäänud
## 211                                        Saan mingid asjad tehtud
## 221                                        Saan mingid asjad tehtud
##     kursuse_labimine lemmikjook soogitegemisoskus         lemmikloom aasta
## 42                 5        Tee                 3         Kaelkirjak  2021
## 48                 4       Kohv                 5         Kaelkirjak  2022
## 52                 5        Tee                 2               Koer  2022
## 55                 5       Kohv                 3 Glaucus atlanticus  2022
## 58                 5        Tee                 2         Kaelkirjak  2022
## 65                 5       Kohv                 3               Koer  2023
## 66                 4       Kohv                 3         Kaelkirjak  2023
## 68                 4       Kohv                 3 Glaucus atlanticus  2023
## 78                 4       Kohv                 1               Koer  2023
## 181                4        Tee                 4               Koer  2023
## 191                5       Kohv                 3               Koer  2023
## 110                4        Tee                 4               Koer  2024
## 210                4       Kohv                 3         Kaelkirjak  2024
## 310                4       Kohv                 4               Koer  2024
## 410                4        Tee                 3               Koer  2024
## 610                5       Kohv                 3               Koer  2024
## 710                4        Tee                 3         Kaelkirjak  2024
## 111                5        Tee                 4 Glaucus atlanticus  2024
## 121                2        Tee                 4         Kaelkirjak  2024
## 141                3        Tee                 4         Kaelkirjak  2024
## 151                4       Kohv                 3               Koer  2024
## 161                5       Kohv                 3 Glaucus atlanticus  2024
## 171                5        Tee                 4         Kaelkirjak  2024
## 211                5        Tee                 2 Glaucus atlanticus  2024
## 221                4       Kohv                 3         Kaelkirjak  2024
# vektor
kysimustik[kysimustik$kogemused_kvant == "Jah",]$kaua_opid # "kaua_opid" tulba väärtused ridadel, kus "kogemused_kvant" väärtus on "Jah"
##  [1] 10  6  5 25  9  4  6  4  5  8 12  1  4  7  8  6 15  7 10  4 16  3  5  5 13
## [26]  8  2  2  1  2  3 13  3  1  7  1  5  3  4  2  7  3 13  3  5 13 10  6 18 13
## [51] 14  1  7  8  2  3  3  3  3  8  4  3 15  7  2  3  7  3  8  4

Ülesanded

  1. Võta andmestikust kysimustik välja mõni intervalliskaalal tunnus/tulp (kasuta arvulist indeksit).
  2. Võta andmestikust kysimustik välja sama tulp tulbanime järgi (kasuta $-märki).
  3. Suuna andmestiku kysimustik tulp kogemused_kvant eraldi objekti nimega kogemused. Mis tüüpi objekti saad?
  4. Korrasta objekti kogemused tasemed nii, et esimene tase oleks “Jah” ja teine “Ei”.
  5. Lisa objekti kogemused väärtus “Võib-olla” (kasuta funktsiooni c()). Mis juhtub?

Lõpetuseks

Kui sul on tunne, et vajad pikemat sissejuhatust R-i alustesse, siis vaata sissejuhatava kursuse materjale või uuri R-i paketti Swirl.

Järgmises praktikumis arvulised andmed ja nende visualiseerimine.

Funktsioonide sõnastik

  • c() - concatenate, kombineerib üksikud väärtused või mitmest elemendist koosnevad vektorid üheks vektoriks
  • class() - küsib objekti andmestruktuuri/andmetüüpi
  • data.frame() - kombineerib üksikud vektorid või maatriksid kokku andmetabeliks
  • dim() - küsib kahemõõtmelise R-i objekti (maatriksi või tabeli) ridade ja tulpade arvu
  • factor() - teeb tavalisest vektorist piiratud hulga väärtustega faktori
  • head() - kuvab R-i objekti esimesi elemente (andmetabelis nt vaikimisi esimest 6 rida)
  • is.character() - küsib, kas objekti andmetüüp on tekst
  • is.logical() - küsib, kas objekti andmetüüp on loogiline väärtus
  • is.numeric() - küsib, kas objekti andmetüüp on arv
  • length() - küsib, mitu elementi vektoris on. Kui kasutada data.frame’il, siis annab tabeli tulpade arvu
  • levels() - küsib, millised on faktori tasemed ehk unikaalsed väärtused
  • list() - teeb listi või muudab olemasoleva(d) objekti(d) listiks
  • load() - laadib RData formaadis salvestatud andmestikke
  • matrix() - teeb maatriksi või muudab olemasoleva(d) objekti(d) (nt vektori(d)) maatriksiks
  • mode() - küsib objekti andmetüüpi
  • paste() - kleebib üksikud väärtused või vektorid kokku üheks tekstijadaks (string’iks)
  • read.csv() - loeb failist (nt) txt- või csv-formaadis andmetabeli
  • read.csv2() - loeb failist (nt) txt- või csv-formaadis andmetabeli
  • read.delim() - loeb failist (nt) txt- või csv-formaadis andmetabeli
  • read.table() - loeb failist (nt) txt- või csv-formaadis andmetabeli
  • summary() - annab R-i objektist ülevaate (andmetabelite puhul nt kõikide tunnuste/tulpade kokkuvõtted)
  • str() - kuvab R-i objekti sisemise struktuuri ja struktuuris kasutatavad andmetüübid
  • tail() - kuvab R-i objekti viimaseid elemente (andmetabelis nt vaikimisi viimast 6 rida)
  • vector() - teeb vektori
  • View() - kuvab andmetabeli eraldi vaates