Alustuseks

See käsileht täiendab Tartu Ülikooli kursust HVEE.04.006 “Sissejuhatus R-i ja andmestruktuuridesse”. Kursuse muud materjalid (R-i skriptid, andmestikud jms) on kättesaadavad TÜ Moodli keskkonnas kursusele registreerunudtele. Muist andmestikke on pärit avalikest repositooriumidest, neile on siin ka otse lingid.

Kursus on jagatud viieks teemaks:

  1. R-i sĂĽntaksi alused: funktsioonid, muutujad ja nende tĂĽĂĽbid;
  2. Andmete importimine R-i, nende esmane ĂĽlevaade ja eksportimine R-ist;
  3. Tekstiandmete töötlemine, regulaaravaldised;
  4. Arvandmed, statistika;
  5. Joonised.

Kõige mahukam on ehk 3. teema, samas 4. teema leiab siin kursusel väga põgusa sissejuhatuse ja kindlasti soovitan võtta täiendavaid statistikakursuseid.

Installi tarkvara

Arvutiklassi arvutites on see juba olemas. Installimiseks on sul tõenäoselt vaja arvuti administraatori õigusi.
- R https://cran.r-project.org
- RStudio https://www.rstudio.com
- Soovitatav on installida ka mõni tekstiredaktor nagu Notepad++ https://notepad-plus-plus.org/ või kui oled Maci kasutaja, siis BBEdit https://www.barebones.com/products/bbedit/download.html (varasema nimega TextWrangler), Sublime Text https://www.sublimetext.com või Atom https://atom.io.

RStudio on ainult abiprogramm R kasutamise hõlbustamiseks, seetõttu peab arvutisse installitud olema ka R, nii et esimesed kaks on kindlasti vajalikud. Tekstiredaktorit on hea kasutada näiteks selleks, et muuta või ühtlustada tekstifailide kodeeringut, aga tingimata selle kursuse jooksul ei pruugi vaja minna ja midagi saab teha ka Windowsis tavalise Notepad’iga või Macis TextEdit’iga, mis on nende OP-süsteeminde vaikimisi tekstiredaktorid.

Soovitatav kirjandus:

  • Stefan Gries, 2009. Quantitative Corpus Linguistics with R: A Practical Introduction.
  • Natalia Levshina, 2015. How to do Linguistics with R. Data exploration and statistical analysis.
  • Keith Johnson, 2008. Quantitative methods in linguistics.
  • Stefan Gries, 2009, 2013. Statistics for linguistics with R.
  • R. Harald Baayen, 2008. Analyzing Linguistic Data. A Practical Introduction to Statistics using R.
  • Richard McElreath, 2015. Statistical Rethinking. A Bayesian Course with Examples in R and Stan.

HITSA logo

HITSA logo

1. Funktsioonid, muutujad ja nende tĂĽĂĽbid

Ava RStudio

R Stuudio ekraan on jagatud 4 paneeliks:

  • vasakul all on konsool ehk R ise, sinna kirjutatud käsud rakenduvad rea kaupa
  • vaskaul ĂĽleval on skriptiaken, kus saad käsuridu toimetada; Ctr-Enter abil rakendada
  • paremal ĂĽleval Environment sakk on töölaud
  • paremal all: failid, joonised, paketid, manuaal

Siin käsilehel on R-i käsud esitatud halli taustaga kastikestes. R-i vastused neile on käsule järgneval real samasugustes kastikestes ja algavad kahe hashtag’iga. Trellid e hashtag’i sümbol # tähistab R-is kommentaare, st tekst, mida R ei loe käsuna. Nii saab R-i skriptis endale märkmeid lisada või ka pikemas skriptis teha muudatusi, et ajutiselt mingi käsk kustutamise asemel välja lülitada. Kommentaar võib ka käsuga samal real olla, alates # sümbolist R ignoreerib.

Funktsioonid

Põhilised matemaatilised funktsioonid nagu kalkulaatoris: liitmine, lahutamine, korrutamine, jagamine:

## [1] 8
## [1] 1.5
## [1] 3

R rakendab käske rea kaupa. Ühele reale võib olla kombineeritud ka rohkem käske. Üksteisest sõltumatuid käske ühel real esitades tuleb nad eristada semikooloniga. Trellid tähistavad kommentaare. Alates trellidest kuni järgmise reani R ignoreerib.

## [1] 8
## [1] -7

Astendusmärk “^” on Windowsi eesti klaviatuuriga AltGr-ä (Macis eesti klaviatuuril pole). Nt kolm ruudus:

## [1] 9

Ăśldine funktsiooni sĂĽntaks: funktsioon(argument), nt sqrt(4), sum(4,4,4)

## [1] 3
## [1] 18
## [1] 2.828427

See on väike triviaalne fakt, mida ei ole tegelikult üldjuhul tarvis, aga et näitlikustada üldsit R süntaksit, siis ka liitmis- ja lahutamistehteid saab fuktsioon(argument)-süntaksiga väljendada, nt “liida 5 ja 4”:

## [1] 9

Keerukamad funktsioonid: funktsioon(arg1, arg2, arg3), nt quantile(1:10, 0.5, na.rm=T) keerukamate funktsioonide puhul kasulik argumente eksplitsiitselt välja kirjutada: quantile(x = 1:10, probs = 0.5, na.rm=T). Või näiteks rnorm() käsk, mis genereerib etteantud hulga (n) juhuslikke arve normaaljaotusest, mis on määratud keskmise ja standardhälbe väärtuste kaudu. Genereerime näiteks 10 arvu, keskmine väärtus on 5 ja standardhälve 0.5:

##  [1] 4.920560 5.027572 5.437309 5.042310 5.086713 5.028550 5.183403 4.750413
##  [9] 4.528219 4.193508
##  [1] 4.566310 4.896892 5.039848 4.900214 3.975294 5.695974 4.472095 4.910240
##  [9] 4.868228 5.318984
##  [1] 5.553553 4.368729 5.191596 5.128946 4.915631 5.684946 4.599409 5.402276
##  [9] 5.349076 3.996261

Esimesel ja teisel real on argumendid vaikimisi järjekorras ja nende välja kirjutamine ei ole tingimata vajalik. Sellegi poolest annab see käsk iga kord erinevad tulemused: selle pärast, et tegemist on juhuslike arvudega ja iga käsu rakendamine genereerib uue juhusliku valiku.

Tühikuid R ei loe, neid võib käskude, argumentide ja väärtuste ümber panna maitse järgi, et endal oleks hea vaadata.

Funktsioonid funktsiooni argumentidena: paneme ühe käsu teise sisse, siis välimise käsu sisendiks on sisemise käsu väljund. Näiteks sum() käsk arvutab arvujada summa ning sqrt() arvutab selle summa ruutjuure:

## [1] 12

või näiteks rnorm() genereerib 10 juhuslikku arvu ja quantile() arvutab nende arvude kvartiilväärtused:

##       0%      25%      50%      75%     100% 
## 4.170725 4.880297 5.032259 5.076668 5.339153

R on küll tekstikeskne, aga see ei tähenda, et kõik tekst tuleb tuimalt ja aeganõudvalt sisse tippida. Kui hakata käsureale midagi kirjutama, tippida sisse paar esimest tähte ning siis vajutada tabulatsiooniklahvi (TAB klahv, Q-st vasakul), siis kuvab R võimalikud käsud, mille hulgast saab noolte ja enteriga sobiv valida. Sama moodi aitab R lõpetada käsu sees argumentide nimesid. Aga kust ma tean, mis on mingi käsu argumendid ja mida nad teevad? Seda saab manuaalist vaadata. Manuaali leiab RStudio parempoolsest alumisest aknaruudust, aga mingi kindla käsu peatüki saab kiiresti lahti nii, et kirjutad käsureale käsu nime ette küsimärgi:

Harjutus 1.1

  1. Arvuta, mitu inimest istub arvutiklassi ĂĽhes reas keskmiselt.

  2. Korruta saadud arv 3-ga ja jaga kahega ning võta saadud arvust ruutjuur.

Muutujad

Mis on muutuja? Vikipeedia: “Muutuja on matemaatikas suurus, mis võib omada väärtusi.” Näiteks: a ja b, x, y, z, või pi.

Muutujale omistatakse väärtus kas võrdusmärgiga (=) või noolega (<-), mille RStudios saab klahvikombinatsiooniga Alt-. Võrdusmärgi suund on alati sama (muutuja = väärtus), kriips-noole suunda saab ka teistpidi esitada (väärtus -> muutuja).

Kui tippida käsureale muutuja nimi, siis näidatakse vastuseks tema väärtust:

## [1] 4

Muutujatega saab teha tehteid

## [1] 9
## [1] 38

ja muutuja väärtuseks võib anda mingi käsurea vastuse:

Kui enne trükkis R meile ekraanile käsu vastuse, siis nüüd muutujate nimetamisel midagi nagu ei juhtugi. Tehe toimus ja vastus on muutuja d väärtus, selle saab jällegi kätte nii, et tippida käsureale muutuja nimi. Muutuja väärtus on tehte tulemus, mitte tehe ise. RStudios näeb muutujaid ja nende väärtusi ka GUI paremal ülemises aknaruudus Environment sakil.

Muutuja on arbitraarse nimega objekt, millele saab omistada väärtusi. R-i reeglite kohaselt peab muutuja nimi algama tähemärgiga (ei saa alata numbriga või olla ainult number) ja nimi ei saa sisaldada matemaatilisi funktsioone ja tühikuid; muus osas on nime panemine täiesti vaba: a, b, x, muutuja1, Toomas, Minu_katseisiku_vanus…

Muutuja tĂĽĂĽbid

Muutuja tüüp (mode): väärtused võivad olla kas arvud, tekst, faktorid või tõeväärtused. numeric, character, factor, logical; NA

Arvud kirjutame lihtsalt numbritega:

## [1] 4

character ehk tekstistring. Väärtus jutumärkides

## [1] "Tartu"

Kui muutuja sisaldab teksti, siis sellega aritmeetilisi tehteid teha ei saa.

Kahte tekstivektorit saab omavahel kombineerida käsuga paste()

## [1] "Tartu ĂĽlikool"

factor on järjestatud (piiratud hulga) väärtustega nominaalne muutuja. Miks faktoreid vaja on? Faktori väärtuseid saab järjestada (nt “vanem”, “keskmine”, “noorem”). Faktoritega tegeleme edaspidi rohkem, praegu ehk piisab teadmisest, et nad on.

logical: tõeväärtused - binaarne muutuja, millel on kaks võimalikku väärtust: TRUE/FALSE. Milleks seda vaja on? Näiteks siis, kui me kasutame võrratusi, on vastuseks tõeväärtus. Võrratusi läheb meil vaja hiljem, kui meil on näiteks suuremast andmestikust vaja leida kindlatele tunnustele vastav alamosa.

## [1] TRUE
## [1] FALSE

Tundmatud väärtused, NA.

Käsu mode() abil saab küsida, mis tüüpi muutuja on.

## [1] "numeric"
## [1] "character"
## [1] "logical"

Muutujale võib väärtuseks omistada ka käsurea tulemuse. Kui muidu käsu rakendamisel tulemus trükitakse ekraanile, siis nüüd, kui käsk muutuja väärtuseks omistada, seda ekraanile ei trükita, aga ta muutuja koos väärtusega jääb töölauale, teda saab nime järgi välja kutsuda ja uutes tehetes kasutada.

Muutuja klassid. Vektor

Neli põhilist objekti klassi R-is on vector, list, matrix, data.frame.

R-i põhiobjekt on vektor. Ka ühest elemendist koosnev objekt on vektor. Vektor on ühemõõtmeline objekt, millel võib olla mitu väärtust.

## [1] "numeric" "vector"

Käsk c() kombineerib väärtused kokku vektoriks:

Vektori järjestikuste arvude jadaga saab ka kooloniga ja ei pea kõiki väärtusi välja kirjutama:

Ühes vektoris on kõik elemendid sama tüüpi. Objekti tüüpi ja klassi saab küsida käskudega mode() ja is().

## [1] "numeric"
## [1] "numeric" "vector"
## [1] 5

Käsk c() kombineerib omavahel kokku ka mitu muutujat.

Tehted vektoritega. Tehteid rakendatakse elementide kaupa. Kui vektorid on eri pikkusega, siis lĂĽhemat vektorit taaskasutatakse.

## [1]  7  9 11 13 15
##  [1]  3  0  9  0 15  0 21  0 27  0
## 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

Harjutus 1.2

  1. Käsuga paste() saab kokku kleepida teksti. Proovi omavahel kokku panna sõnad “tere” ja “hommikust”.

  2. Vaata manuaalist, mis on paste() käsu argumendi sep vaikimisi väärtus. Kuidas saaks nii, et sõnad kleepuks kokku ilma tühikuta?

  3. Anna muutujale nimega nädalapäevad väärtuseks vektor nädalapäevade nimedega nii, et paste() käsu abil kleebid kokku liitsõnade esimesed pooled ja sõna “päev” (ignoreerime korraks seda, et “reede” ei ole päev-lõpuline liitsõna :)

  4. Käsk nchar() loeb kokku tähemärkide arvu. Proovi näiteks mitu tähemärki on sõnas “vastastikustatamatutagi”.

  5. Anna muutujale sõnapikkused väärtuseks vektor nädalapäevade nimede pikkustega.

Muutuja klassid. Mitmemõõtmelised objektid

Tabelid on mitmemõõtmelised objektid, üldjuhul kahemõõtmelised: neil on read ja tulbad. Maatriks on mitmemõõtmeline objekt (tabel), mis koosneb sama tüüpi elementidest (nt arvud, tekst, tõeväärtused). Maatriksi read ja tulbad moodustuvad vektoritest. Teeme ühe maatriksi käsuga matrix()

##      [,1] [,2] [,3] [,4] [,5]
## [1,]    1    6   11   16   21
## [2,]    2    7   12   17   22
## [3,]    3    8   13   18   23
## [4,]    4    9   14   19   24
## [5,]    5   10   15   20   25

Mis saab siis, kui maatriksi sisendiks on vektor, mis ei jagune võrdselt tulpade ja ridade vahel?

## Warning in matrix(nädalapäevad, ncol = 3): data length [7] is not a sub-multiple
## or multiple of the number of rows [3]
##      [,1]        [,2]        [,3]       
## [1,] "esmaspäev" "neljapäev" "pühapäev" 
## [2,] "teisipäev" "reedepäev" "esmaspäev"
## [3,] "kolmapäev" "laupäev"   "teisipäev"

data.frame on mitmemõõtmeline objekt (tabel), mis võib koosneda eri tüüpi elementidest. Paneme käsuga data.frame() kokku ühe tabeli Harjutus 1.2 loodud vektoritest

## [1] "data.frame" "list"       "oldClass"   "vector"

list on objekt, mille elemendid võivad olla erinevate mõõtmetega objektid. Listina on võimalik kokku panna kõike seda, mis ei ole piisavalt korrapäraselt struktureeritud, et oleks vektor või tabel. Esialgu siin kursusel me liste väga palju ei kasuta.

Indeksid

Objekti elementide indekseerimine: objekt[indeks]; tabel[rida,veerg]; list[[]]

Indeksid on objekti elementide nn järjekorranumbrid. Vektoril on üks dimensioon, iga element on tähistatud ühe indeksnumbriga; tabelil on kaks dimensiooni, seega igal elemendil on reaindeks ja veeruindeks. Proovime: vektori nädalapäevad 1. element:

## [1] "esmaspäev"

Sama vektori kuues element:

## [1] "laupäev"

Indeksid on omakorda vektorid ja nende abil võib korraga mitut elementi pärida:

## [1] "neljapäev" "reedepäev" "laupäev"
## [1] "laupäev"   "esmaspäev" "kolmapäev"

Vektori elementidel võivad olla nimed. vektor[“nimi”]

## esmaspäev teisipäev kolmapäev neljapäev reedepäev   laupäev  pühapäev 
##         9         9         9         9         9         7         8
## [1] "integer"             "double"              "numeric"            
## [4] "vector"              "data.frameRowLabels"
## neljapäev 
##         9

Tabel on kahemõõtmeline objekt ja tabeli puhul saab/tuleb indeksiga määrata nii read kui tulbad, st nurksulgudesse läheb kaks numbrit, mis on eristatud komaga. Kui tahta ühe rea väärtuseid kõikides tulpades, võib jätta indeksi teise (tulbaindeksi) välja tühjaks, aga koma peab olema. Tabeli ridadel ja tulpadel võivad olla nimed. tabel$tulp; tabel[“rida”, “tulp”]

## [1] 9
##   sõnapikkused nädalapäevad
## 3            9    kolmapäev
## 4            9    neljapäev
## 5            9    reedepäev
## 6            7      laupäev
## [1] "kolmapäev" "neljapäev" "reedepäev"
## [1] 9 9 9 9 9 7 8
## [1] 9 9 9 9 9 7 8

Muutujatel saab indekseid kasutades ka üksikute elementide väärtuseid üle kirjutada.

Harjutus 1.3

  1. Tee üks maatriks, kus on 5 tulpa väärtustega 1-20. Seda, kas vektor jagatakse ridade või tulpade kaupa, kontrollib argument byrow.

  2. Liida maatriksile arvud 1-5. Mis suunas tehe toimus?

  3. Mis arvud on neljandas tulbas?

  4. Mis väärtused on 3. reas tulpades 2 ja 5?

  5. Anna maatriksi tulpadele ja ridadele ilusad sõnalised nimed kasutades käske rownames() ja colnames().

  6. Mis on kõige ilusam tulba nimi, mis on kõige keskpärasem rea nimi? Kasuta neid nimesid, et leida väärtus vastavas lahtris.

Väärtuste võrdlemine, tõeväärtused

Tõeväärtused, operaatorid ==, !=, >, <, >=, <=

## [1] FALSE
## [1] TRUE

Üksikute väärtuste puhul see ei tundu väga vajalik, sest eks me ju tea nagunii, et 3 on väiksem kui 4 ja ei ole sellega võrdne. Aga võrdlemist läheb vaja siis, kui üks võrreldavatest on muutuja, mille väärtus võib mingist teisest käsureast tulenevalt varieeruda. Ja/või kui üks võrreldavatest on vektor, millel on rohkem kui üks element:

## esmaspäev teisipäev kolmapäev neljapäev reedepäev   laupäev  pühapäev 
##      TRUE      TRUE      TRUE      TRUE      TRUE     FALSE      TRUE

Kui võrdleme vektoreid, millel on rohkem kui üks element, siis võrreldakse mõlema vektori sama indeksiga elemente. Juhul, kui üks vektor on pikem ja teine lühem, siis korratakse lühemat nii, et iga pikema vektori element saaks millegagi võrreldud.

## [1] FALSE  TRUE FALSE FALSE
## [1]  TRUE FALSE FALSE FALSE

Teksti puhul saab ainult võrrelda, kas on või ei ole sama, aga ei saa küsida seda, kas üks tekst on suurem või väiksem kui teine

## [1] TRUE
## [1] FALSE FALSE  TRUE FALSE FALSE FALSE FALSE

Ja väärtuste võrdlemist saab kasutada indekseerimiseks. Näiteks võtame nädalapäevade vektorist välja ainult need väärtused, mis on/pole “kolmapäev”.

## [1] "kolmapäev"
## [1] "esmaspäev" "teisipäev" "neljapäev" "reede"     "laupäev"   "pühapäev"

Või tabelist need read, mille sõnapikkuste tulbas on väärtus suurem kui 7:

##   nädalapäevad sõnapikkused
## 1    esmaspäev            9
## 2    teisipäev            9
## 3    kolmapäev            9
## 4    neljapäev            9
## 7     pühapäev            8

Sessiooni lõpetamine

Kui RStudio kinni paned, siis küsitakse, kas soovid töölaual olevad andmed salvestada. Kui salvestad, kirjutatakse need su töökataloogi .RData faili ja kui RStudio uuesti avad, siis peaks töölaual olema samad objektid, mis eelmise sessiooni ajal.

Kui soovid töölaua puhtaks pühkida, st kustutada ära kõik, mis seal on, siis:

Käsk ls() teeb nimekirja töölaual olevatest objektidest

##  [1] "a"                     "b"                     "d"                    
##  [4] "minu_list"             "minu_maatriks"         "Minu_muutuja_number_7"
##  [7] "minu_muutuja1"         "minu_vektor"           "nädalapäevad"         
## [10] "sõnapikkused"          "tabel1"                "tekst1"               
## [13] "tekst2"                "tundmatu"              "vek1"                 
## [16] "vek2"                  "vek3"

Käsk rm() kustutab muutujaid ära töölaualt. Näiteks kustutame muutuja nimega Minu_muutuja_number_7 (sellise nimega objekt peab töölaual olemas olema muidugi, muidu saab vastuseks veateate)

Kui nüüd ls() käsku korrata, siis näeb, et Minu_muutuja_number_7 on nimekirjast läinud.

##  [1] "a"             "b"             "d"             "minu_list"    
##  [5] "minu_maatriks" "minu_muutuja1" "minu_vektor"   "nädalapäevad" 
##  [9] "sõnapikkused"  "tabel1"        "tekst1"        "tekst2"       
## [13] "tundmatu"      "vek1"          "vek2"          "vek3"

Kombineerides käske ls() ja rm(), saab kustutada töölaualt kõik ära:

2. Andmete import-eksport ja esmane ĂĽlevaade

TĂ–Ă–KATALOOG

RStudio’s parempoolses alumises paneelis on sakk Files. Seal saad navigeerida oma arvuti failisüsteemis. Paneeli paremas ülemises servas “…” nupule vajutades saab ka OS-i kataloogivalimisakna esile kutsuda ja kataloogi valida. Seejärel vajuta hammasratta ikooniga More > Set as Working Directory. Alternatiiv on muidugi seda teha käsurealt. Näiteks kui projekti töökaust on C:\Users\partel\Desktop\R_kursus, siis selle kausta töökaustaks seadmiseks:

Mõistlik on ühe projekti failid tõsta kõik ühte kataloogi ja seada see töökataloogiks. Siis saab kõik failid lugeda R-i sealt kataloogist ilma kausta täisaadressi täpsustamata. Samuti saab sinna kausta salvestada selle projekti töölaua (Workspace) ja skrptid.

Käsk dir() näitab töökataloogis olevate failide nimesid.

TĂ–Ă–LAUD

Nn töölaud on R-is objektid, mis on selle R-i sessiooni ajal R-is kasutusel. Kõik muutujad (olgu nende sisu vektorid või tabelid) jäävad töölauale kuni R-i sessiooni lõpuni, või kuni me nad sealt ära kustutame. Sessiooni lõpp on siis, kui me R-i (või RStudio) kinni paneme. R-i sessiooni saab ka salvestada ja teine kord uuesti avada. Töölaual olevat näeb RStudio’s paremal ülemises paneelis sakil Environment. Üldiselt RStudios sessiooni lõpus (kui paned programmi kinni) salvestatakse töölaud töökataloogi ja kui järgmine kord avad seal kataloogis salvestatud R skripti, siis avaneb automaatselt ka sinna kataloogi salvestatud töölaud. Erinevate projektide jaoks saab hoida töölauad lahus, iga projekti töölaua saab salvestada eraldi vastavasse töökataloogi.

TEKSTIANDMETE R-i lugemine

Käsk scan() loeb enam-vähem ükskõik mis teksti vektoriks. Olulised argumendid:

  • file – failinimi;
  • what – mis tĂĽĂĽpi andmed on, teksti puhul peaks olema character();
  • sep – tähemärk, mis loetakse väljaeristajaks ja mille alusel jagatakse tekst vektori elementideks (nt tĂĽhik " “, reavahetus”\n");
  • encoding – tekstifaili kodeering, nt “UTF-8”.

Moodlist leiad 2. teema alt zip-kataloogi, kuhu on kokku pandud jutu “Põhjatuul ja päike” tekst eri formaatides (txt, pdf, Wordi failina, loetud kujul wav failina koos selle juurde Praati TextGrid failiga jne).

Proovime lugeda faili “pohjatuul.txt” nii, et sep oleks reavahetus

## [1] "Põhjatuul ja päike"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
## [2] "Ükskord vaidlesid põhjatuul ja päike selle üle, kumb neist on tugevam. Just siis tuli mööda teed rändaja, seljas soe mantel. Põhjatuul ja päike leppisid kokku, et see, kellel esimesena õnnestub sundida rändajat mantlit seljast võtma, on teisest tugevam. Põhjatuul puhuski kõigest jõust, aga mida rohkem ta puhus, seda enam koomale tõmbas rändaja oma mantli hõlmad. Lõpuks loobus põhjatuul katsest. Siis hakkas aga päike nii soojalt paistma, et rändaja kohe oma mantli seljast võttis. Ja nõnda pidigi põhjatuul tunnistama, et päike on tast tugevam."

… vaikimisi on sep = "" ehk white-space, mis tähendab, et iga sõna on eraldi vektorielement:

##  [1] "Põhjatuul"   "ja"          "päike"       "Ükskord"     "vaidlesid"  
##  [6] "põhjatuul"   "ja"          "päike"       "selle"       "üle,"       
## [11] "kumb"        "neist"       "on"          "tugevam."    "Just"       
## [16] "siis"        "tuli"        "mööda"       "teed"        "rändaja,"   
## [21] "seljas"      "soe"         "mantel."     "Põhjatuul"   "ja"         
## [26] "päike"       "leppisid"    "kokku,"      "et"          "see,"       
## [31] "kellel"      "esimesena"   "õnnestub"    "sundida"     "rändajat"   
## [36] "mantlit"     "seljast"     "võtma,"      "on"          "teisest"    
## [41] "tugevam."    "Põhjatuul"   "puhuski"     "kõigest"     "jõust,"     
## [46] "aga"         "mida"        "rohkem"      "ta"          "puhus,"     
## [51] "seda"        "enam"        "koomale"     "tõmbas"      "rändaja"    
## [56] "oma"         "mantli"      "hõlmad."     "Lõpuks"      "loobus"     
## [61] "põhjatuul"   "katsest."    "Siis"        "hakkas"      "aga"        
## [66] "päike"       "nii"         "soojalt"     "paistma,"    "et"         
## [71] "rändaja"     "kohe"        "oma"         "mantli"      "seljast"    
## [76] "võttis."     "Ja"          "nõnda"       "pidigi"      "põhjatuul"  
## [81] "tunnistama," "et"          "päike"       "on"          "tast"       
## [86] "tugevam."

Loetud objektist ülevaate saamiseks vaatame seda käskudega

  • summary() - kokkuvõte
  • head(), tail() - trĂĽkivad ekraanile vastavalt objekti algusest või lõpust mingi hulga vektori elemente. Vaikimisi 6, seda saab muuta argumendiga n
  • length() - vektori pikkus, st mitu elementi vektoris on (mitte teksti tähemärkide või sõnade pikkus)
  • table() - sagedustabel
##    Length     Class      Mode 
##        86 character character
##  [1] "Põhjatuul" "ja"        "päike"     "Ükskord"   "vaidlesid" "põhjatuul"
##  [7] "ja"        "päike"     "selle"     "üle,"      "kumb"      "neist"    
## [13] "on"        "tugevam."  "Just"      "siis"      "tuli"      "mööda"    
## [19] "teed"      "rändaja,"
##  [1] "Ja"          "nõnda"       "pidigi"      "põhjatuul"   "tunnistama,"
##  [6] "et"          "päike"       "on"          "tast"        "tugevam."
## pohja
##         aga        enam   esimesena          et      hakkas     hõlmad. 
##           2           1           1           3           1           1 
##          ja          Ja        Just      jõust,    katsest.      kellel 
##           3           1           1           1           1           1 
##        kohe      kokku,     koomale        kumb     kõigest    leppisid 
##           1           1           1           1           1           1 
##      loobus      Lõpuks     mantel.      mantli     mantlit        mida 
##           1           1           1           2           1           1 
##       mööda       neist         nii       nõnda         oma          on 
##           1           1           1           1           2           3 
##    paistma,      pidigi      puhus,     puhuski   põhjatuul   Põhjatuul 
##           1           1           1           1           3           3 
##       päike      rohkem     rändaja    rändaja,    rändajat        seda 
##           5           1           2           1           1           1 
##        see,      seljas     seljast       selle        siis        Siis 
##           1           1           2           1           1           1 
##         soe     soojalt     sundida          ta        tast        teed 
##           1           1           1           1           1           1 
##     teisest    tugevam.        tuli tunnistama,      tõmbas   vaidlesid 
##           1           3           1           1           1           1 
##      võtma,     võttis.    õnnestub     Ükskord        üle, 
##           1           1           1           1           1
## [1] 86

Vaatame, mis juhtub siis, kui scan() käsuga lugeda doc või pdf faili:

## Warning in scan("pohjatuul.pdf", what = character()): embedded nul(s) found in
## input
##  [1] "%PDF-1.3"                                                                                                                                                                                           
##  [2] "%\xc4\xe5\xf2\xe5\xeb\xa7\xf3\xa0\xd0\xc4\xc6"                                                                                                                                                      
##  [3] "4"                                                                                                                                                                                                  
##  [4] "0"                                                                                                                                                                                                  
##  [5] "obj"                                                                                                                                                                                                
##  [6] "<<"                                                                                                                                                                                                 
##  [7] "/Length"                                                                                                                                                                                            
##  [8] "5"                                                                                                                                                                                                  
##  [9] "0"                                                                                                                                                                                                  
## [10] "R"                                                                                                                                                                                                  
## [11] "/Filter"                                                                                                                                                                                            
## [12] "/FlateDecode"                                                                                                                                                                                       
## [13] ">>"                                                                                                                                                                                                 
## [14] "stream"                                                                                                                                                                                             
## [15] "x\001\xa5X\xc1n\xe36\020\xbd\xeb+\xb8\xb5\xb3\x91\023\x99\026)Q\022\xb7\xdd-Т\x97\xde\0260\xd0C\xbd\xa7\xa0=\024H\x81m\xfe\037\xe8\033>\x92\xa2l+\xeb\xa6\b"                                        
## [16] "\xc9\xe2h8|\xf3\xe6q\x98\xaf\xea\xb3\xfa\xaaĚ \xa7\x9e\u05f6\xed\x94\033\x8c\xee\x8c\xf7jj'>\xfc\xf3\x87\xfaM\xfd\xad\016?\xbf\030\xf5\xf4\xa2\xda\xf0\xf7\xf2\x84O[m{\xfe\x96\a\xdby\xed;7\xaa\xd1"  
## [17] "\xba\xed\xab\xa7g\xf5\xd3\0216\xf0ک\xe3\x93rS\xb0\x8d\xb7\xe3\xb3:\034\x8fV\031u\xfcS\xfd\xae\xeaw\xdfm\xb6;\xfc\xaa\xefއ\xdb\xfd\xfd\xa9\016\017\xa7\u076e\xb2\xaa\x8e\x83\xf8\xa5\xf0\xeb\xe1\xb1"
## [18] "\x83{\xbdS_\xd4\xf1W\xf5\xcb1,f\031Q\x87@\xdc\u051b\030\x91zz\xae\020\xd1+q\xd4\xe2\xfe\xf8\xd7uo\xa3ŐŁ\xf3ŢŞ\xd1v\xda\fq}\u05fc\001NYU\xfdn\u0759\001\xba\xe2M"                                       
## [19] "\0361O%X\xe3\032X\xd1-\xc0"                                                                                                                                                                         
## [20] "X\001\x86\xcd]@\001\x88\xe1\xc7}x~\xb7\xab\xf6="

Tulemuseks on sigri-migri, kus tekst on peidus faili kĂĽljenduse koodi sees.

Käsuga scan() võib ükskõik mis teksti kujul olevaid andmeid R-i tuua, ka otse veebist. Aga kui tegemist on veebilehega, siis muidugi tuleb huvipakkuvat teksti sealt pärast html-koodist taga otsida.

##  [1] "<!DOCTYPE html>"                                                                                                                                                                                                                                                
##  [2] "<html lang=\"et\">"                                                                                                                                                                                                                                             
##  [3] "<head>"                                                                                                                                                                                                                                                         
##  [4] "\t<!--"                                                                                                                                                                                                                                                         
##  [5] "Tere arendaja - me otsime oma tegusasse meeskonda nii backend (php/js/...) kui ka frontend arendajaid (html/css/..). Kui oled huvitatud, palun anna endast märku konkurss@ekspressmeedia.ee. Tööd saab alati kohaldada vastavalt võimetele - võta aga ühendust."
##  [6] "Kuulutus ei aegu :)"                                                                                                                                                                                                                                            
##  [7] "Hetkel aktiivsed kuulutused leiad siit:"                                                                                                                                                                                                                        
##  [8] "http://www.delfi.ee/misc/too/"                                                                                                                                                                                                                                  
##  [9] "-->"                                                                                                                                                                                                                                                            
## [10] "<meta http-equiv=\"X-UA-Compatible\" content=\"IE=9; IE=8; IE=7; IE=EDGE\" />"                                                                                                                                                                                  
## [11] "<link rel=\"dns-prefetch preconnect\" href=\"//g1.nh.ee\" crossorigin>"                                                                                                                                                                                         
## [12] "<link rel=\"dns-prefetch preconnect\" href=\"//g2.nh.ee\" crossorigin>"                                                                                                                                                                                         
## [13] "<link rel=\"dns-prefetch preconnect\" href=\"//g3.nh.ee\" crossorigin>"                                                                                                                                                                                         
## [14] "<link rel=\"dns-prefetch preconnect\" href=\"//g4.nh.ee\" crossorigin>"                                                                                                                                                                                         
## [15] "<link rel=\"dns-prefetch preconnect\" href=\"//g.delfi.ee\" crossorigin>"                                                                                                                                                                                       
## [16] "<link rel=\"dns-prefetch preconnect\" href=\"//t.delfi.ee\" crossorigin>"                                                                                                                                                                                       
## [17] "<link rel=\"dns-prefetch preconnect\" href=\"//delfiadee.hit.gemius.pl\" crossorigin>"                                                                                                                                                                          
## [18] "<link rel=\"dns-prefetch preconnect\" href=\"//gaee.hit.gemius.pl\" crossorigin>"                                                                                                                                                                               
## [19] "<link rel=\"dns-prefetch preconnect\" href=\"//h.delfi.ee\" crossorigin>"                                                                                                                                                                                       
## [20] "<link rel=\"preload\" as=\"font\" crossorigin=\"crossorigin\" type=\"font/woff2\" href=\"//g1.nh.ee/misc/common/fonts/roboto/roboto-v15-latin_latin-ext_cyrillic-regular.woff2\" />"                                                                            
## [21] "<link rel=\"preload\" as=\"font\" crossorigin=\"crossorigin\" type=\"font/woff2\" href=\"//g1.nh.ee/misc/common/fonts/roboto/roboto-v15-latin_latin-ext_cyrillic-500.woff2\" />"                                                                                
## [22] "<link rel=\"preload\" as=\"font\" crossorigin=\"crossorigin\" type=\"font/woff2\" href=\"//g1.nh.ee/misc/common/fonts/roboto/roboto-v15-latin_latin-ext_cyrillic-700.woff2\" />"                                                                                
## [23] "\t<title>DELFI VIDEO DOHAST | Kirt: olen medali üle ääretult õnnelik, kuid selline lõpp hooajale ei olnud kõige meeldivam"                                                                                                                                      
## [24] " - Sport"                                                                                                                                                                                                                                                       
## [25] "</title>"                                                                                                                                                                                                                                                       
## [26] "\t"                                                                                                                                                                                                                                                             
## [27] "\t\t\t"                                                                                                                                                                                                                                                         
## [28] "\t"                                                                                                                                                                                                                                                             
## [29] "\t\t\t\t\t\t\t\t\t\t"                                                                                                                                                                                                                                           
## [30] "\t\t<meta property=\"og:image\" content=\"https://g1.nh.ee/images/pix/magnus-kirt-87670491.jpg\">"                                                                                                                                                              
## [31] "\t<meta property=\"og:image:width\" content=\"740\" />"                                                                                                                                                                                                         
## [32] "\t<meta property=\"og:image:height\" content=\"409\" />"                                                                                                                                                                                                        
## [33] "<meta property=\"og:title\" content=\"DELFI VIDEO DOHAST | Kirt: olen medali üle ääretult õnnelik, kuid selline lõpp hooajale ei olnud kõige meeldivam\">"                                                                                                      
## [34] "\t"                                                                                                                                                                                                                                                             
## [35] "<meta property=\"og:url\" content=\"https://sport.delfi.ee/a/87668473\">"                                                                                                                                                                                       
## [36] "\t<meta property=\"og:type\" content=\"article\">"                                                                                                                                                                                                              
## [37] "<meta property=\"og:site_name\" content=\"Sport\" />"                                                                                                                                                                                                           
## [38] "<meta property=\"og:description\" content=\"Odaviskaja Magnus Kirti valdasid pärast tänast teise kohaga lõppenud võistlus MM-il vastakad tunded.\">"                                                                                                            
## [39] "<meta property=\"article:published_time\" content=\"1570401271\">"                                                                                                                                                                                              
## [40] "\t\t\t<meta property=\"article:tag\" content=\"Kergejõustiku MM 2019 Dohas\">"

Failis on uudise pealkiri 33. real ja tekst algab umbes 38. reast.

Failinime käsureale tippimise asemel saab avada ka operatsioonisüsteemi graafilise failisüsteemi dialoogiakna kaudu hiirega navigeerides. See avaneb käsuga file.choose()

Või clipboard’ilt kopeeritud tekst (st kuskil tekstiredaktoris vms teed enne Ctrl+C; see võimalus tihti millegi pärast ei tööta).

Pakettide installimine

R-i baaspaketis ei ole head käsku doc ja pdf failidest teksti lugemiseks. Käsuga scan() sisse loetud pdf-failist on vaja sodi-koodi seest teksti otsida, seda saaks teha regulaaravaldisi kasutades, aga on küllaltki tüütu. Aga on olemas pakett textreadr, kus on pdf ja doc failidest teksti lugemiseks sobivad käsud olemas. Tuleb ainult see pakett alla laadida ja installida.

RStudios on pakettide haldamiseks graafilises kasutajaliideses paremal all paneelis sakk Packages. Nupp Install > tipi paketi nimi. Alternatiiviks on rakendada käsurida:

Installimise käigus tõmmatakse internetist vastav tarkvarajupike alla ja salvestatakse kohalikku arvutisse, vajalik on internetiühendus. (Võib ka juhtuda, et vaja on ka arvuti administraatori õigusi süsteemikataloogi failide kirjutamiseks; kui õigusi ei ole, siis leiab guugeldades juhiseid, et seada pakettide installimiseks mingi muu kataloog.) Installida tuleb paketti ühes arvutis ühe korra (võib-olla peale R-i versiooniuuendust tuleb seda uuesti teha).

Aga iga sessiooni alguses tuleb installitud paketid uuesti aktiveerida (kui neis olevaid käske on tarvis kasutada) käsuga library().

## Warning: package 'textreadr' was built under R version 4.0.2

Proovime nüüd uuesti lugeda seda pdf faili, mida enne scan() käsuga üritasime avada. textreadr paketis on selle lugemiseks käsk read_pdf(), mis on mõeldud pdf-failist teksti lugemiseks.

Vaatame is() ja dim() käskudega, mis laadi objektiga tegu on.

## Table: [1 x 3]
## 
##   page_id element_id text                                     
## 1 1       1          Põhjatuul ja päike\n       Ükskord vaidle
## . ...     ...        ...
##     page_id    element_id     text          
##  Min.   :1   Min.   :1    Length:1          
##  1st Qu.:1   1st Qu.:1    Class :character  
##  Median :1   Median :1    Mode  :character  
##  Mean   :1   Mean   :1                      
##  3rd Qu.:1   3rd Qu.:1                      
##  Max.   :1   Max.   :1
## [1] "textreadr"
## [1] 1 3

Ehk siis: selle käsuga loetud objekt on tabel, kus on kolm tulpa: lehekülje number, rea number ja vastav tekst. Seega on tabelis info ka selle kohta, kus tekst küljendatud failis asus. See pakett käitub ootuspäraselt Windowsi süsteemis, kus üks tabeli rida vastab teksti reale. Mingil põhjusel Mac (milles see instruktsioon on genereeritud) paneb kogu lehekülje ühele reale.

Kasutame indekseerimist, et saada kätte ainult tekst.

## [1] "Põhjatuul ja päike\n       Ükskord vaidlesid põhjatuul ja päike selle üle, kumb neist on\ntugevam. Just siis tuli mööda teed rändaja, seljas soe mantel. Põhjatuul ja\npäike leppisid kokku, et see, kellel esimesena õnnestub sundida rändajat\nmantlit seljast võtma, on teisest tugevam.\n       Põhjatuul puhuski kõigest jõust, aga mida rohkem ta puhus, seda\nenam koomale tõmbas rändaja oma mantli hõlmad. Lõpuks loobus\npõhjatuul katsest. Siis hakkas aga päike nii soojalt paistma, et rändaja kohe\noma mantli seljast võttis. Ja nõnda pidigi põhjatuul tunnistama, et päike on\ntast tugevam."

Tekstifaili salvestamine

Käsuga cat(); olulised argumendid:

  • file - failile antav nimi,
  • sep - tähemärk, mida kasutatakse vektori elementide eristajana tekstis.

Harjutus 2.1

  1. Tõmba Digarist alla Juhan Liivi kogutud teoste pdf: http://www.digar.ee/id/nlib-digar:277269

  2. Loe see fail R-i.

  3. Raamat algab küllaltki pika eessõnaga ja lõppeb sisukorraga. Otsi üles, kust algavad ja lõppevad luuletused. Tee uus objekt, mis sisaldaks ainult luuletusi ja ainult teksti.

  4. Salvesta luuletused tekstifailina.

TABELID

Tabel on tekstifail, kus andmed on korrastatud nii, et igas reas on kindel hulk veerge ja veerud on eristatud kindla sümboliga. Kui Excelist kopeerida tabel tekstifaili, siis on veeru eristamise sümbol tabuatsioon (“\t”). csv-failis on veeru eristaja koma või semikoolon.

Exceli .xls fail sisaldab lisaks tabelis näha olevatele andmetele ka metainfot. Pealegi võib ühes Exceli failis olla mitu erinevate mõõtmetega tabelit erinevatel lehekülgedel. R-i baaspaketis ei ole xls failide lugemiseks käsku, aga leidub pakette, kus on. Aga üldjuhul on lihtsam tabelid Excelist kas tekstifaili kopeerida või csv-formaadis salvestada.

  • Ăśldine käsk read.table(); tab-separated ehk tabulatsioonidega eristatud väljade jaoks read.delim(); CSV-faili jaoks read.csv() (komadega eristatud väljad) või read.csv() (semikoolonitega).
  • Tabelis peab olema kindlasti igal real sama palju veerge, kui ei ole, saad veateate!
  • Pane tähele, mis on su andmestikus komakoha eristaja, kas punkt või koma! R-is on selleks punkt. Kui failis on kasutatud koma, siis kasuta argumenti dec.
  • Andmestikule osutamiseks kas “failinimi”, “clipboard” või file.choose()

Moodlist 2. teema alt leiad faili afrikaadid_näiteandmestik.xls, kus on tükikene minu magistritöös kasutatud võru afrikaatide andmestikust. Kui tegin oma magistritööd ja kasutasin selleks Excelit, siis korrastasin andmeid nii, et iga keelejuhi andmed olid eraldi lehel ja ühel lehel oli kindla rühmitusaluse järgi palju väikseid erineva struktuuriga tabelikesi. Iga tabelikese lõpus oli kokkuvõttev keskmiste rida. R-iga lugemiseks peaks andmed struktureerima hoopis teisiti. Eri tabelikeste ja keelejuhtide kategoriseerimiseks peaks lisama ühe tulba, mis vastavaid kategoriseeringuid sisaldavad. Selliselt olen ümber struktureerinud selle andmestiku ja kopeerinud faili afrikaadid.txt.

Proovime lugeda tabelit failist afrikaadid.txt käsuga read.table(). Lisaks failinimele tuleb selle käsuga lugemisel lisada argumendid:

  • header = T - kui tabelil on päis ehk esimesel real tulpade nimed (vaikimisi F)
  • sep = "\\t" - kui väljade ersitaja on tabulatsioonimärk (vaikimisi tĂĽhik)
  • dec = "," - kui komakoha eristaja on tabelis koma (nagu eesti sĂĽsteemis töötavas Excelis), mitte punkt
  • Kui vanemas R-i versioonis loeti kõik teksti sisaldavad tulbad tabelisse faktoritena, siis alates versioonist 4.0.0 (aprill 2020) kodeeritakse tekst vaikimisi character’na. Seega kui tekstitulpade sisu on pigem piiratud hulk korduvaid väärtusi, oleks mugavam neid käsitleda faktoritena, ja kui on unikaalsed, võib-olla ka pikemad tekstistringid, siis pigem jätta character’iks. Et tekst kodeeruks faktoriks, tuleks lisada argument stringsAsFactors = T.
  • Kui fail sisaldab ka mitte-ASCII sĂĽmboleid (täpitähed jms), siis võib olla vaja ka täpsustada teksti kodeeringut, mis natuke sõltub operatsioonisĂĽsteemist. Windows töötab vaikimisi Latin1 kodeeringus ja kui failis on unicode-kodeering, siis tuleks lisada argument encoding = "UTF-8".

Selle tabeli saab natuke lihtsama vaevaga lugeda ka read.delim() käsuga, mis eeldab, et failil on päis (st esimesel real on tulpade nimed) ja välju eristab tabulatsioon.

Vaatame tabelit käskudega summary(), str(), dim(), head().

  • summary() – teeb kokkuvõtte tabeli igast tulbast: numbritest näitab jaotust, faktoritest sagedasemaid väärtuseid.
  • str() – kuvab tabeli struktuuri: tulpade nimed ja tĂĽĂĽbid ning esimeste ridade väärtused.
  • View() – Avab terve tabeli Rstudio ĂĽlemises parempoolses paneelis eraldi sakina. Sama saab hiireklikiga RStudio GUI-s, kui klõpsata Environment sakil tabeli nimel. Tabel on ainult vaatamiseks, seal väärtuseid muuta ei saa.
  • fix() – see käsk RStudios ei tööta, aga kui mingil põhjusel töötad R konsoolis, siis see käsk teeb sama mis View().

Käsk summary() teeb kokkuvõtte iga tulba andmete jaotusest. Kui tulbas on arvandmed, siis on välja toodud miinimum-maksimum, keskmine ja kvartiilid; kui on faktor, siis sagedasemate väärtuste esinemissagedus.

##   KJ     sugu      synniaeg    positsioon kvantiteet  haalik   
##  LT:84   M:84   Min.   :1924   C1  : 28   fort: 4    afr :128  
##  RT:84   N:84   1st Qu.:1924   C2  :103   len : 6    frik: 16  
##                 Median :1926   C3  : 10   Q1  :50    klus: 24  
##                 Mean   :1926   Cfin: 27   Q2  :35              
##                 3rd Qu.:1929              Q3  :18              
##                 Max.   :1929              NA's:55              
##                                                                
##               sona           t              ekspl            s         
##  1 esä          :  2   Min.   : 14.00   Min.   : 5.0   Min.   : 16.00  
##  1 veidĂĽq       :  2   1st Qu.: 60.00   1st Qu.:12.0   1st Qu.: 39.00  
##  1 üts´kõrd     :  2   Median : 81.00   Median :14.0   Median : 52.50  
##  10 võhladsitükk:  2   Mean   : 91.74   Mean   :15.9   Mean   : 60.22  
##  11 ihnatsit    :  2   3rd Qu.:112.00   3rd Qu.:19.0   3rd Qu.: 71.50  
##  12 latsõl      :  2   Max.   :222.00   Max.   :35.0   Max.   :197.00  
##  (Other)        :156   NA's   :23       NA's   :58     NA's   :52      
##      C_dur          t_s_suhe     
##  Min.   : 46.0   Min.   :0.3258  
##  1st Qu.:102.0   1st Qu.:0.9178  
##  Median :122.5   Median :1.2917  
##  Mean   :135.3   Mean   :1.5749  
##  3rd Qu.:161.5   3rd Qu.:2.0827  
##  Max.   :305.0   Max.   :5.8750  
##  NA's   :18      NA's   :57

Käsk str() teeb kokkuvõtte tabeli struktuurist: ridade ja tulpade arv ning iga tulba tüüp ning faktori puhul tasemete arv ning mingi hulk väärtuseid tabeli algusest.

## 'data.frame':    168 obs. of  12 variables:
##  $ KJ        : Factor w/ 2 levels "LT","RT": 1 1 1 1 1 1 1 1 1 1 ...
##  $ sugu      : Factor w/ 2 levels "M","N": 2 2 2 2 2 2 2 2 2 2 ...
##  $ synniaeg  : int  1929 1929 1929 1929 1929 1929 1929 1929 1929 1929 ...
##  $ positsioon: Factor w/ 4 levels "C1","C2","C3",..: 1 1 1 1 1 1 1 1 1 1 ...
##  $ kvantiteet: Factor w/ 5 levels "fort","len","Q1",..: NA NA NA NA NA NA NA NA NA NA ...
##  $ haalik    : Factor w/ 3 levels "afr","frik","klus": 1 1 1 1 1 1 1 1 1 1 ...
##  $ sona      : Factor w/ 85 levels "1 esä","1 veidüq",..: 55 76 7 10 13 18 22 33 34 35 ...
##  $ t         : int  42 60 82 NA 81 72 NA 58 158 77 ...
##  $ ekspl     : int  10 14 17 NA 23 12 NA 12 24 16 ...
##  $ s         : int  37 50 52 NA 60 41 NA 47 58 27 ...
##  $ C_dur     : int  79 110 134 NA 141 113 NA 105 216 104 ...
##  $ t_s_suhe  : num  1.14 1.2 1.58 NA 1.35 ...

Käsk dim() annab lihtsalt tabeli mõõtmed ehk ridade ja tulpade arvu.

## [1] 168  12

Käsk head() trükib ekraanile esimesed read (vaikimisi 6).

##   KJ sugu synniaeg positsioon kvantiteet haalik        sona  t ekspl  s C_dur
## 1 LT    N     1929         C1       <NA>    afr    5 tsõdsõ 42    10 37    79
## 2 LT    N     1929         C1       <NA>    afr    7 tsõdsõ 60    14 50   110
## 3 LT    N     1929         C1       <NA>    afr   13 tsõdsõ 82    17 52   134
## 4 LT    N     1929         C1       <NA>    afr  16 tsõdsõl NA    NA NA    NA
## 5 LT    N     1929         C1       <NA>    afr 19 tsireliq 81    23 60   141
## 6 LT    N     1929         C1       <NA>    afr 21 tsireliq 72    12 41   113
##   t_s_suhe
## 1 1.135135
## 2 1.200000
## 3 1.576923
## 4       NA
## 5 1.350000
## 6 1.756098

Tabeli saab töölaua külge kinnitada, nii et tulbad on ligipääsetavad eraldi vektoritena ja tabeli nime ei pea iga kord nimetama – see säästab pisut tippimisvaeva; sama moodi saab tabeli töölaualt lahti ühendada. attach() / detach()

## [1] 1.574851
## [1] 1.574851

Käsk detach(dat) ühendaks siis pärast tabeli töölaualt lahti. St et tabel ise jääks töölauale, aga kui selle tulpadele on vaja ligi saada, siis tuleb jälle koos tabeli nimega nimetada.

Kui tabel on edukalt loetud, siis tutvume andmetega:

Käsk colnames() näitab tulbanimesid, vt ka rownames()

##  [1] "KJ"         "sugu"       "synniaeg"   "positsioon" "kvantiteet"
##  [6] "haalik"     "sona"       "t"          "ekspl"      "s"         
## [11] "C_dur"      "t_s_suhe"
## [1] "synniaeg"
##  keelejuht sugu      synniaeg    positsioon kvantiteet  haalik   
##  LT:84     M:84   Min.   :1924   C1  : 28   fort: 4    afr :128  
##  RT:84     N:84   1st Qu.:1924   C2  :103   len : 6    frik: 16  
##                   Median :1926   C3  : 10   Q1  :50    klus: 24  
##                   Mean   :1926   Cfin: 27   Q2  :35              
##                   3rd Qu.:1929              Q3  :18              
##                   Max.   :1929              NA's:55              
##                                                                  
##               sona           t              ekspl            s         
##  1 esä          :  2   Min.   : 14.00   Min.   : 5.0   Min.   : 16.00  
##  1 veidĂĽq       :  2   1st Qu.: 60.00   1st Qu.:12.0   1st Qu.: 39.00  
##  1 üts´kõrd     :  2   Median : 81.00   Median :14.0   Median : 52.50  
##  10 võhladsitükk:  2   Mean   : 91.74   Mean   :15.9   Mean   : 60.22  
##  11 ihnatsit    :  2   3rd Qu.:112.00   3rd Qu.:19.0   3rd Qu.: 71.50  
##  12 latsõl      :  2   Max.   :222.00   Max.   :35.0   Max.   :197.00  
##  (Other)        :156   NA's   :23       NA's   :58     NA's   :52      
##      C_dur          t_s_suhe     
##  Min.   : 46.0   Min.   :0.3258  
##  1st Qu.:102.0   1st Qu.:0.9178  
##  Median :122.5   Median :1.2917  
##  Mean   :135.3   Mean   :1.5749  
##  3rd Qu.:161.5   3rd Qu.:2.0827  
##  Max.   :305.0   Max.   :5.8750  
##  NA's   :18      NA's   :57

Tabeli osade pärimine

Tabel mäletatavasti on kahemõõtmeline objekt, mille tulpasid on võimalik ükshaaval käsitleda vektoritena. Tulba indekseerimiseks on mitu varianti: tabel$tulp, tabel[,tulba_number], tabel[,“tulba_nimi”]

##   [1] LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT
##  [26] LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT
##  [51] LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT
##  [76] LT LT LT LT LT LT LT LT LT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT
## [101] RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT
## [126] RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT
## [151] RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT
## Levels: LT RT
##   [1] LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT
##  [26] LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT
##  [51] LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT LT
##  [76] LT LT LT LT LT LT LT LT LT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT
## [101] RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT
## [126] RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT
## [151] RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT RT
## Levels: LT RT
##   [1] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> Q1  
##  [16] Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1  
##  [31] Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q2   Q2   Q2   Q2   Q2   Q2  
##  [46] Q2   Q2   Q2   Q2   Q2   Q2   Q2   Q2   Q2   Q2   Q2   Q2   Q3   Q3   Q3  
##  [61] Q3   Q3   Q3   Q3   Q3   Q3   len  len  len  fort fort <NA> <NA> <NA> <NA>
##  [76] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
##  [91] <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> Q1   Q1   Q1   Q1   Q1   Q1   Q1  
## [106] Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1   Q1  
## [121] Q1   Q1   Q1   Q2   Q2   Q2   Q2   Q2   Q2   Q2   Q2   Q2   Q2   Q2   Q2  
## [136] Q2   Q2   Q2   Q2   Q2   Q3   Q3   Q3   Q3   Q3   Q3   Q3   Q3   Q3   len 
## [151] len  len  fort fort <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA> <NA>
## [166] <NA> <NA> <NA>
## Levels: fort len Q1 Q2 Q3

Tabelist saab välja võtta alamosi, kasutades reaindekseid. Nt rida 4 või read 7-12.

##   keelejuht sugu synniaeg positsioon kvantiteet haalik       sona  t ekspl  s
## 4        LT    N     1929         C1       <NA>    afr 16 tsõdsõl NA    NA NA
##   C_dur t_s_suhe
## 4    NA       NA
## [1] 25 tsitsidse     33 tsilku        34 tsibroh       35 tsill´okõisi 
## [5] 36 tsianahatsidõ 38 tsuugõ       
## 85 Levels: 1 esä 1 veidüq 1 üts´kõrd 10 võhladsitükk 11 ihnatsit ... sattõq
## [1] 25 tsitsidse     33 tsilku        34 tsibroh       35 tsill´okõisi 
## [5] 36 tsianahatsidõ 38 tsuugõ       
## 85 Levels: 1 esä 1 veidüq 1 üts´kõrd 10 võhladsitükk 11 ihnatsit ... sattõq

Aga ridu saab valida ka selle järgi, mis väärtused on mingis tulbas. Näiteks loome eraldi tabeli dat_afr, kus on kõik read, kus häälik on afrikaat:

See, mis me reaindeksiks kasutame, on vektor tõeväärtustest. Neid tingimusi saab omavahel kombineerida. Näiteks küsime, millised on read, kus haalik on afr ning C_dur on suurem kui 100 ms (kus see ei ole NA – käsk is.na() annab vasteks need read, kus on NA, aga ! käsu ees pöörab selle vastupidi). Read, mis neile kolmele tingimusele vastavad, saavad vastuseks TRUE.

##   [1] FALSE  TRUE  TRUE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [13] FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
##  [25] FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE
##  [37] FALSE FALSE FALSE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE
##  [49]  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE
##  [61]  TRUE  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE
##  [73]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE
##  [85] FALSE  TRUE FALSE FALSE  TRUE  TRUE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
##  [97] FALSE  TRUE FALSE  TRUE  TRUE FALSE FALSE  TRUE FALSE  TRUE FALSE  TRUE
## [109] FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
## [121] FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE  TRUE  TRUE  TRUE
## [133] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE
## [145]  TRUE FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE  TRUE FALSE  TRUE  TRUE
## [157]  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE FALSE  TRUE

Ja kui kasutada seda tõeväärtuste vektorit indeksina, siis tabelist dat valitakse need read, kus on indeksis TRUE:

##  keelejuht sugu      synniaeg    positsioon kvantiteet  haalik  
##  LT:43     M:45   Min.   :1924   C1  :18    fort: 3    afr :88  
##  RT:45     N:43   1st Qu.:1924   C2  :38    len : 4    frik: 0  
##                   Median :1924   C3  : 7    Q1  :11    klus: 0  
##                   Mean   :1926   Cfin:25    Q2  :17             
##                   3rd Qu.:1929              Q3  :10             
##                   Max.   :1929              NA's:43             
##                                                                 
##               sona          t              ekspl             s         
##  1 üts´kõrd     : 2   Min.   : 29.00   Min.   : 7.00   Min.   : 16.00  
##  10 võhladsitükk: 2   1st Qu.: 64.00   1st Qu.:12.00   1st Qu.: 44.00  
##  11 ihnatsit    : 2   Median : 81.50   Median :14.00   Median : 58.50  
##  12 latsõl      : 2   Mean   : 87.38   Mean   :15.59   Mean   : 65.56  
##  18 piitska     : 2   3rd Qu.:105.50   3rd Qu.:19.00   3rd Qu.: 76.50  
##  19 tsireliq    : 2   Max.   :199.00   Max.   :35.00   Max.   :197.00  
##  (Other)        :76                    NA's   :17                      
##      C_dur          t_s_suhe     
##  Min.   :102.0   Min.   :0.3258  
##  1st Qu.:114.5   1st Qu.:0.9196  
##  Median :136.5   Median :1.2758  
##  Mean   :152.9   Mean   :1.6013  
##  3rd Qu.:180.5   3rd Qu.:2.1055  
##  Max.   :305.0   Max.   :5.8750  
## 

Tabeli salvestamine

Kui on tarvis andmed R-ist välja viia, siis salvesta see tekstifaili käsuga write.table() Olulised argumendid:

  • sep - välju eristav sĂĽmbol (nt “\t” või “,”);
  • quote - T/F kas tekstile pannakse jutumärgid ĂĽmber;
  • row.names - T/F kas ridadele lisatakse nimede tulp;
  • dec - komakohta eristav sĂĽmbol, kui on kavas andmed viia edasi Excelisse, siis võid panna “,”.

Juhul, kui sep = "," võid panna failinime laiendiks .csv.

Harjutus 2.2

  1. Loe r-i fail http://datadoi.ut.ee/bitstream/handle/33/51/Lippus_etal_JPhon2013_dataset.txt

  2. Vaata dim(), head(), str(), summary(). Kas faili lugemine oli edukas? Tabelis peaks olema 1714 rida ja 43 tulpa. Kas kõik tulbad, mis justkui sisaldavad arve, on loetud numbritena?

  3. Tee uus objekt tabeli ridadest, kus “Quantity2” tulbas on “Q3vok”. Mis on keskmine väärtus “C1” tulbas?

  4. Salvesta see alamosa uue CSV-failina töökataloogi.

Vigane tabel

Tihti võib tekstifailis olla midagi sassi läinud ja probleemi avastamine nõuab pikka meelt ja terast silma :)

Moodlist leiad faili altern_kys_andmed_Rkursus.txt. Lae see alla ja loe R-i tabeli avamise käsuga:

Selles tabelis on ühe pilootkatse tulemused, kus uuriti alternatiivküsimuste eelistusjärjestust (Lippus ja Lindström, ettekanne “Muutuva keele päeval” 2006). Katse eesmärk oli testida, kas eesti keeles võiks alternatiivküsimusel (küsimus, mis sisaldab kahte valikuvarianti, nt “Kas soovid kohvi või teed?”) olla eelistusjärjestus (st ootuspärane vastusevariant võiks olla kas esimene või teine). Katses osales 6 katseisikut, neile esitati 40 alternatiivküsimust, millele nad pidid vastama ilma pikemalt mõtlemata ühesõnalise vastusega. Registreeriti katseisiku vastus ja mõõdeti reaktsiooniaega.

Andmestikus peaks olema 5 tulpa ja 6*40 rida. Vaatame head, str, summary…

##   kj jrk                         lause               raeg altern
## 1 PT w1. Kas arvuti v\xf5i televiisor?  714.6903123747281     x2
## 2 PT w2.       Kas Taavi v\xf5i Tuuli?  530.8997323190354     x2
## 3 PT w3.         Kas auto v\xf5i maja? 1171.9136831612352     x2
## 4 PT w4.     Kas v\xe4ike v\xf5i suur?  343.6436421241407     x2
## 5 PT w5.       Kas kahvel v\xf5i nuga?  466.8573034540966     x2
## 6 PT w6.  Kas puu v\xf5i p\xf5\xf5sas? 475.74188307502396     x2

Kui eelmise faili kodeering oli UTF-8 ja Windowsi arvutis on tarvis faili lugemisel kodeeringut täpsustada argumendiga encoding, et täpitähti normaalselt näeks, siis see fail on Windowsile tuttavas ISO-8859-1 ehk Latin1 kodeeringus, nii et Windowsi arvuti ilmselt näitab täpitähti normaalselt, aga Macis on nt õ asemel “\xf5” ja ä asemel “\xe4”. Seega aitab, kui lisada read.delim() käsule argument encoding = "latin1".

Tabeli algus head() käsuga näeb üsna normaalne välja: on 5 tulpa, aga summary() näitab, et reaktsiooniaja tulp on sisse loetud faktorina ja seal on kohati numbrite asemel tähised *x1 ja *x2, mis muidu peaks järgmises altern tulbas olema, seal omakorda on justkui kaks erinevat tähistust (tärniga ja ilma) ning on mingid salapärased 312 tühja rida.

##        kj                               jrk     
##  HL     : 40                              :156  
##  IT     : 40   Kas kahvel v\xf5i nuga?    :  4  
##  LP     : 40   Kas kana v\xf5i kukk?      :  4  
##  PT     : 40   Kas kand v\xf5i varvas?    :  4  
##  TT     : 40   Kas kapukas v\xf5i kokukas?:  4  
##  KA     : 39   Kas kartul v\xf5i tomat?   :  4  
##  (Other):156   (Other)                    :219  
##                            lause                     raeg     altern   
##                               :156                     :157      :312  
##  Kas arvuti v\xf5i televiisor?:  3   *x1               : 86   *x1: 19  
##  Kas auto v\xf5i maja?        :  3   *x2               : 69   *x2: 24  
##  Kas Taavi v\xf5i Tuuli?      :  3   341.6490379197086 :  2   x1 : 15  
##  Kas kahvel v\xf5i nuga?      :  2   1153.659734176344 :  1   x2 : 25  
##  Kas kana v\xf5i kukk?        :  2   1171.9136831612352:  1            
##  (Other)                      :226   (Other)           : 79

Kui vaadata tabelit View(altern) käsuga, mis avab tabeli RStudio vasakul ülemises aknas uue sakina, siis näeb, et alates 85 reast on esimese ja teise tulba vahel reavahetus, nii et iga rea järgmised tulbad on nihkes. Et neist reavahetustest lahti saada, oleks üks lihtsam variant avada see fail hoopis tekstina näiteks Notepad++ programmiga ja reavahetused ära kustutada. Ja et mitte käia läbi kõik read ja vajutada 155 korda Delete klahvi, võiks seda teha nii, et käsuga Find otsida “\t\n” ehk tabulatsiooni ja reavahetuse järjendit ja asendada see “\t” ehk ainult tabulatsioonimärgiga ning rakendada Replace all. Siis võiks faili salvestada (uue nimega) ja uuesti R-is avada:

##   kj          jrk                             lause    
##  HL:40   w1.    :  6   Kas arvuti või televiisor?:  6  
##  IT:40   w10.   :  6   Kas auto või maja?        :  6  
##  KA:39   w11.   :  6   Kas kahvel või nuga?      :  6  
##  LP:40   w12.   :  6   Kas kana või kukk?        :  6  
##  PT:40   w13.   :  6   Kas kand või varvas?      :  6  
##  TT:40   w14.   :  6   Kas kapukas või kokukas?  :  6  
##          (Other):203   (Other)                   :203  
##                  raeg     altern   
##  341.6490379197086 :  2      :  1  
##  *x1               :  1   *x1:105  
##  1015.824393008188 :  1   *x2: 93  
##  1043.6297099418111:  1   x1 : 15  
##  1076.4581210412132:  1   x2 : 25  
##  1084.4775965164358:  1            
##  (Other)           :232

Summary’st paistab, et ikka on üks rida, kus reaktsiooniaja tulbas on “x1”. Uurime, kus reas see on ja vaatame, mis seal reas toimub:

## [1] 141
##     kj  jrk                      lause raeg altern
## 141 KA w21. Kas maasikas või vaarikas?  *x1

Tundub, et reas 141 on mingil põhjusel reaktsiooniaeg puudu. Kuna vastusevariant on olemas, siis tervet rida eemaldada poleks tarvis, aga oleks vaja nihutada vastus õigesse lahtrisse. Kuna me ei tea, mis reaktsiooniaja väärtus on ja tagantjärgi seda kuidagi taastada ei ole võimalik, siis on selle väärtus meile teadmata ehk NA. Kõige lihtsam see viga korda ajada oleks jälle avada fail Notepad++’ga, rullida reale 142 (sest tekstifailina avades on päis esimesel real ja reanumbrid nihkuvad ühe võrra edasi) ning “…?\t*x1” vahele pista üks tabulatsioon ja NA, salvestada fail uuesti ning taas R-is sisse lugeda:

##   kj          jrk                             lause          raeg        
##  HL:40   w1.    :  6   Kas arvuti või televiisor?:  6   Min.   :  83.39  
##  IT:40   w10.   :  6   Kas auto või maja?        :  6   1st Qu.: 416.29  
##  KA:39   w11.   :  6   Kas kahvel või nuga?      :  6   Median : 728.09  
##  LP:40   w12.   :  6   Kas kana või kukk?        :  6   Mean   : 911.60  
##  PT:40   w13.   :  6   Kas kand või varvas?      :  6   3rd Qu.:1204.28  
##  TT:40   w14.   :  6   Kas kapukas või kokukas?  :  6   Max.   :3194.71  
##          (Other):203   (Other)                   :203   NA's   :1        
##  altern   
##  *x1:106  
##  *x2: 93  
##  x1 : 15  
##  x2 : 25  
##           
##           
## 

Nüüd tundub juba kõik päris õige:

  • kj tulbas on katseisiku initsiaalid, sealt paistab 6 katseisikut, kellelt igalt ĂĽhelt on 40 rida (v.a ĂĽks, kellelt on millegi pärast ainult 39, ĂĽks on millegi pärast puudu);
  • KĂĽsimusi (mis on esindatud tulbas jrk järjekorranumbriga ja tulbas lause kĂĽsilausega), on kõiki 6, st igale katseisikule esitati sama kĂĽsimus ĂĽhe korra.
  • Tulbas raeg on reaktsiooniaeg, mis on number, see on kirjeldatud keskmise ja kvartiilväärtustega.
  • Ja lõpuks vastusevariant, kas katseisik eelistas 1. või 2. kĂĽsimuses esitatud paarilist. Selles tulbas on vastusevariandid sisestatud erinevalt, kohati on tärnid ja kohati ei ole. Seda võiks veel ka ĂĽhtlustada.

Tulbas altern on tärnid, neist oleks vaja lahti saada. Me võime väärtused üle kirjutada:

##     
##      *x1 *x2 x1 x2
##   HL   0   0 28 12
##   IT   0   0 16 24
##   KA   0   0 32  7
##   LP   0   0 10 30
##   PT   0   0 15 25
##   TT   0   0 20 20

Kuigi nüüd on väärtused ühtlustatud, figureerivad sagedustabelis ikka ka tärnidega vastusevariandid. See on selle pärast, et see tulp on faktor ja faktoril jäävad tasemed alles ka siis, kui selle tasemega väärtuseid ei ole. Kuidas muuta faktori tasemeid? Kõige lihtsam on uuesti faktoriseerida:

## [1] "*x1" "*x2" "x1"  "x2"
## [1] "x1" "x2"
##     
##      x1 x2
##   HL 28 12
##   IT 16 24
##   KA 32  7
##   LP 10 30
##   PT 15 25
##   TT 20 20

Sagedustabel: table() loeb kokku, kui palju mingi faktori tasemete kombinatsioone on. Esimene argument paigutub tabel ridadesse ja teine tulpadeks:

##     
##      x1 x2
##   HL 28 12
##   IT 16 24
##   KA 32  7
##   LP 10 30
##   PT 15 25
##   TT 20 20

Suhtelised sagedused saab siis, kui table() panna käsu prop.table() sisse.

##     
##              x1         x2
##   HL 0.11715481 0.05020921
##   IT 0.06694561 0.10041841
##   KA 0.13389121 0.02928870
##   LP 0.04184100 0.12552301
##   PT 0.06276151 0.10460251
##   TT 0.08368201 0.08368201
##     
##             x1        x2
##   HL 0.7000000 0.3000000
##   IT 0.4000000 0.6000000
##   KA 0.8205128 0.1794872
##   LP 0.2500000 0.7500000
##   PT 0.3750000 0.6250000
##   TT 0.5000000 0.5000000

Suhtelisest sagedusest saab protsent, kui väärtused 100-ga läbi korrutada. Käsk round() ümardab komakohad

##     
##        x1   x2
##   HL 70.0 30.0
##   IT 40.0 60.0
##   KA 82.1 17.9
##   LP 25.0 75.0
##   PT 37.5 62.5
##   TT 50.0 50.0

Kui tunnuseid on rohkem kui 2, siis on table() asemel parem kasutada käsku ftable(), mis paigutab ridadesse struktureeritult mitu tunnust.

##                                x1 x2
##                                     
## HL Kas arvuti või televiisor?   1  0
##    Kas auto või maja?           1  0
##    Kas kahvel või nuga?         1  0
##    Kas kana või kukk?           0  1
##    Kas kand või varvas?         1  0
##    Kas kapukas või kokukas?     0  1
##    Kas kartul või tomat?        1  0
##    Kas kilu või muna?           0  1
##    Kas kits või põder?          0  1
##    Kas kodus või võõrsil?       1  0
##    Kas kokukas või kapukas?     1  0
##    Kas koll või kull?           1  0
##    Kas koobas või mülgas?       1  0
##    Kas kukk või kana?           1  0
##    Kas kull või koll?           0  1
##    Kas kummut või mammut?       1  0
##    Kas lammas või lehm?         1  0
##    Kas lehm või lammas?         0  1
##    Kas maasikas või vaarikas?   1  0
##    Kas maja või auto?           0  1
##    Kas mammut või kummut?       1  0
##    Kas muna või kilu?           1  0
##    Kas mülgas või koobas?       1  0
##    Kas nuga või kahvel?         0  1
##    Kas oder või rukis?          1  0
##    Kas puu või põõsas?          1  0
##    Kas põder või kits?          0  1
##    Kas põõsas või puu?          1  0
##    Kas rukis või oder?          0  1
##    Kas suur või väike?          0  1
##    Kas Taavi või Tuuli?         1  0
##    Kas televiisor või arvuti?   1  0
##    Kas tomat või kartul?        1  0
##    Kas tuli või vesi?           1  0
##    Kas Tuuli või Taavi?         0  1
##    Kas vaarikas või maasikas?   1  0
##    Kas varvas või kand?         1  0
##    Kas vesi või tuli?           1  0
##    Kas võõrsil või kodus?       1  0
##    Kas väike või suur?          1  0
## IT Kas arvuti või televiisor?   0  1
##    Kas auto või maja?           0  1
##    Kas kahvel või nuga?         1  0
##    Kas kana või kukk?           0  1
##    Kas kand või varvas?         1  0
##    Kas kapukas või kokukas?     1  0
##    Kas kartul või tomat?        1  0
##    Kas kilu või muna?           0  1
##    Kas kits või põder?          1  0
##    Kas kodus või võõrsil?       0  1
##    Kas kokukas või kapukas?     1  0
##    Kas koll või kull?           0  1
##    Kas koobas või mülgas?       1  0
##    Kas kukk või kana?           0  1
##    Kas kull või koll?           0  1
##    Kas kummut või mammut?       1  0
##    Kas lammas või lehm?         0  1
##    Kas lehm või lammas?         1  0
##    Kas maasikas või vaarikas?   0  1
##    Kas maja või auto?           0  1
##    Kas mammut või kummut?       1  0
##    Kas muna või kilu?           1  0
##    Kas mülgas või koobas?       1  0
##    Kas nuga või kahvel?         1  0
##    Kas oder või rukis?          0  1
##    Kas puu või põõsas?          0  1
##    Kas põder või kits?          0  1
##    Kas põõsas või puu?          0  1
##    Kas rukis või oder?          1  0
##    Kas suur või väike?          0  1
##    Kas Taavi või Tuuli?         0  1
##    Kas televiisor või arvuti?   0  1
##    Kas tomat või kartul?        0  1
##    Kas tuli või vesi?           0  1
##    Kas Tuuli või Taavi?         0  1
##    Kas vaarikas või maasikas?   1  0
##    Kas varvas või kand?         0  1
##    Kas vesi või tuli?           0  1
##    Kas võõrsil või kodus?       1  0
##    Kas väike või suur?          0  1
## KA Kas arvuti või televiisor?   0  1
##    Kas auto või maja?           1  0
##    Kas kahvel või nuga?         0  1
##    Kas kana või kukk?           1  0
##    Kas kand või varvas?         0  1
##    Kas kapukas või kokukas?     0  1
##    Kas kartul või tomat?        0  1
##    Kas kilu või muna?           1  0
##    Kas kits või põder?          1  0
##    Kas kodus või võõrsil?       1  0
##    Kas kokukas või kapukas?     1  0
##    Kas koll või kull?           1  0
##    Kas koobas või mülgas?       1  0
##    Kas kukk või kana?           1  0
##    Kas kull või koll?           1  0
##    Kas kummut või mammut?       1  0
##    Kas lammas või lehm?         1  0
##    Kas lehm või lammas?         1  0
##    Kas maasikas või vaarikas?   1  0
##    Kas maja või auto?           1  0
##    Kas mammut või kummut?       1  0
##    Kas muna või kilu?           1  0
##    Kas mülgas või koobas?       0  0
##    Kas nuga või kahvel?         1  0
##    Kas oder või rukis?          1  0
##    Kas puu või põõsas?          1  0
##    Kas põder või kits?          0  1
##    Kas põõsas või puu?          1  0
##    Kas rukis või oder?          1  0
##    Kas suur või väike?          1  0
##    Kas Taavi või Tuuli?         1  0
##    Kas televiisor või arvuti?   1  0
##    Kas tomat või kartul?        1  0
##    Kas tuli või vesi?           0  1
##    Kas Tuuli või Taavi?         1  0
##    Kas vaarikas või maasikas?   1  0
##    Kas varvas või kand?         1  0
##    Kas vesi või tuli?           1  0
##    Kas võõrsil või kodus?       1  0
##    Kas väike või suur?          1  0
## LP Kas arvuti või televiisor?   0  1
##    Kas auto või maja?           0  1
##    Kas kahvel või nuga?         0  1
##    Kas kana või kukk?           0  1
##    Kas kand või varvas?         1  0
##    Kas kapukas või kokukas?     1  0
##    Kas kartul või tomat?        1  0
##    Kas kilu või muna?           1  0
##    Kas kits või põder?          0  1
##    Kas kodus või võõrsil?       0  1
##    Kas kokukas või kapukas?     0  1
##    Kas koll või kull?           0  1
##    Kas koobas või mülgas?       0  1
##    Kas kukk või kana?           0  1
##    Kas kull või koll?           0  1
##    Kas kummut või mammut?       1  0
##    Kas lammas või lehm?         0  1
##    Kas lehm või lammas?         0  1
##    Kas maasikas või vaarikas?   0  1
##    Kas maja või auto?           1  0
##    Kas mammut või kummut?       0  1
##    Kas muna või kilu?           0  1
##    Kas mülgas või koobas?       0  1
##    Kas nuga või kahvel?         0  1
##    Kas oder või rukis?          0  1
##    Kas puu või põõsas?          0  1
##    Kas põder või kits?          0  1
##    Kas põõsas või puu?          0  1
##    Kas rukis või oder?          0  1
##    Kas suur või väike?          0  1
##    Kas Taavi või Tuuli?         0  1
##    Kas televiisor või arvuti?   1  0
##    Kas tomat või kartul?        0  1
##    Kas tuli või vesi?           0  1
##    Kas Tuuli või Taavi?         1  0
##    Kas vaarikas või maasikas?   0  1
##    Kas varvas või kand?         0  1
##    Kas vesi või tuli?           1  0
##    Kas võõrsil või kodus?       1  0
##    Kas väike või suur?          0  1
## PT Kas arvuti või televiisor?   0  1
##    Kas auto või maja?           0  1
##    Kas kahvel või nuga?         0  1
##    Kas kana või kukk?           0  1
##    Kas kand või varvas?         1  0
##    Kas kapukas või kokukas?     0  1
##    Kas kartul või tomat?        0  1
##    Kas kilu või muna?           0  1
##    Kas kits või põder?          1  0
##    Kas kodus või võõrsil?       0  1
##    Kas kokukas või kapukas?     1  0
##    Kas koll või kull?           0  1
##    Kas koobas või mülgas?       1  0
##    Kas kukk või kana?           1  0
##    Kas kull või koll?           1  0
##    Kas kummut või mammut?       1  0
##    Kas lammas või lehm?         0  1
##    Kas lehm või lammas?         1  0
##    Kas maasikas või vaarikas?   1  0
##    Kas maja või auto?           0  1
##    Kas mammut või kummut?       1  0
##    Kas muna või kilu?           1  0
##    Kas mülgas või koobas?       0  1
##    Kas nuga või kahvel?         0  1
##    Kas oder või rukis?          0  1
##    Kas puu või põõsas?          0  1
##    Kas põder või kits?          0  1
##    Kas põõsas või puu?          0  1
##    Kas rukis või oder?          1  0
##    Kas suur või väike?          0  1
##    Kas Taavi või Tuuli?         0  1
##    Kas televiisor või arvuti?   0  1
##    Kas tomat või kartul?        0  1
##    Kas tuli või vesi?           0  1
##    Kas Tuuli või Taavi?         1  0
##    Kas vaarikas või maasikas?   0  1
##    Kas varvas või kand?         0  1
##    Kas vesi või tuli?           1  0
##    Kas võõrsil või kodus?       1  0
##    Kas väike või suur?          0  1
## TT Kas arvuti või televiisor?   0  1
##    Kas auto või maja?           0  1
##    Kas kahvel või nuga?         1  0
##    Kas kana või kukk?           1  0
##    Kas kand või varvas?         0  1
##    Kas kapukas või kokukas?     0  1
##    Kas kartul või tomat?        1  0
##    Kas kilu või muna?           0  1
##    Kas kits või põder?          0  1
##    Kas kodus või võõrsil?       1  0
##    Kas kokukas või kapukas?     1  0
##    Kas koll või kull?           0  1
##    Kas koobas või mülgas?       1  0
##    Kas kukk või kana?           1  0
##    Kas kull või koll?           1  0
##    Kas kummut või mammut?       0  1
##    Kas lammas või lehm?         1  0
##    Kas lehm või lammas?         0  1
##    Kas maasikas või vaarikas?   1  0
##    Kas maja või auto?           1  0
##    Kas mammut või kummut?       1  0
##    Kas muna või kilu?           1  0
##    Kas mülgas või koobas?       0  1
##    Kas nuga või kahvel?         0  1
##    Kas oder või rukis?          0  1
##    Kas puu või põõsas?          1  0
##    Kas põder või kits?          1  0
##    Kas põõsas või puu?          0  1
##    Kas rukis või oder?          1  0
##    Kas suur või väike?          0  1
##    Kas Taavi või Tuuli?         0  1
##    Kas televiisor või arvuti?   1  0
##    Kas tomat või kartul?        0  1
##    Kas tuli või vesi?           0  1
##    Kas Tuuli või Taavi?         1  0
##    Kas vaarikas või maasikas?   0  1
##    Kas varvas või kand?         1  0
##    Kas vesi või tuli?           1  0
##    Kas võõrsil või kodus?       0  1
##    Kas väike või suur?          0  1

Veel käske, mille abil andmestikku vaadelda

  • t() keerab tabeli read tulpadeks
  • hist() – histogramm
  • plot(), boxplot()

Tulpdiagramm sagedustabelist: barplot(table())

Vaikimis tehakse tabeli tulpadest postid ja ridadest postide sisemised jaotused, mis on tähistatud eri värvidega. Sellest sagedustabelist, kus on välja toodud 6 katseisiku vastusevariantide sagedused, oleks mõttekam, kui tunnused ära vahetada. Saaks sagedustabeli table() käsus argumentide järjekorra ära vahetada, aga käsuga t() saab ka lihtsalt tabelid keerata. käsk t() keerab tabelit, nii et read saavad tulpadeks.

Vahel on hea, kui heledad ja tumedad postiosad ei ole mitte üksteise otsas, vaid on paigutatud kõrvuti. Seda teeb argument beside=T. Samuti on võimalik lisada legend, mis selgitab värvide tähendust. Legendi sisendiks on teksti sisaldav vektor, millel on nii mitu taset, kui on legendis elemente. Sellele vastavad altern faktori tasemed, aga võiks ka lihtsalt tekstina sisestada nt legend.text=c(“Vastus 1”, “Vastus 2”)

  • Tabelist alamosa valimine, käsuga subset() ja indekseerimisega; vt ka which() ja is.na()
  • Keskmised, jaotused:
    • mean()
    • median()
    • quantile()
    • sd()
    • rowSums, colSums, min, max…
  • Apply käsud – nende juurde tuleme loodetavasti hiljem :)
    • apply(), tapply()

TSĂśKLID

Tsükkel kordab käsurida või -ridu ette antud arvu kordi. Tsükli alustamise käsk on for() ja argumentidena tuleb anda muutuja nimi, mis hakkab korduste ajal konkreetse korduse väärtust kandma ning vektor, milles olevate elementide arv on korduste arvuks. See võib-olla on veidi segaselt öeldud, aga teeme läbi paari näitega. Kõigepealt üks tsükkel, mis kordub 10 korda (vektoris 1:10 ehk ühest kümneni). Käsk, mida korratakse, on print(“Tere”). See tähendab, et tsükkel trükib 10 korda ekraanile sõna “Tere”.

## [1] "Tere"
## [1] "Tere"
## [1] "Tere"
## [1] "Tere"
## [1] "Tere"
## [1] "Tere"
## [1] "Tere"
## [1] "Tere"
## [1] "Tere"
## [1] "Tere"

Tsükli argument i saab iga tsükli ringi peal endale uue väärtuse. Kui “Tere” asemel trükkida i väärtus, trükitakse ekraanile numbrid ühest kümneni.

## [1] 1
## [1] 2
## [1] 3
## [1] 4
## [1] 5
## [1] 6
## [1] 7
## [1] 8
## [1] 9
## [1] 10

Korduseid määrav vektor võib olla muutujana varem defineeritud:

## [1] 3
## [1] 4
## [1] 5

Ja numbrid ei pea minema järjest:

## [1] 9
## [1] 100
## [1] 43

Ja käsk, mida tsüklis rakendatakse, võib olla midagi muud, kui lihtsalt print().

## [1] 81
## [1] 10000
## [1] 1849

Print on siin vajalik ainult selleks, et tsüklis muidu tulemusi ei trükita ekraanile. Üldjuhul seda polegi vaja, aga käesolevates näidetes tsükkel jookseks taustal ja midagi justkui ei juhtu. Järgmises näites enam ei ole print käsku kasutatud, tsüklis toimuv läheb muutujasse minu_vektor.

Tsükkel võib sisaldada mitut käsku, mille algus ja lõpp tähistatakse loogeliste sulgudega. Enne tsükli algust defineerime muutuja minu_vektor ja anname talle väärtuseks NULL ehk mitte midagi. See on vajalik selle pärast, et meil töölaual oleks vastava nimega muutuja, sest kui tsüklis tahame anda väärtust selle vektori esimesele või teisele elemendile ja objekti minu_vektor pole, saame veateate – ei saa luua objektide osi, kui objekti ennast ei ole.

## [1] 0.000000 1.386294 2.197225 2.772589

Käsk paste() käsk kleebib kokku vektori elemente üheks tekstiks. Kleebime kokku vektorid “Tere” ja “hommikust”. Kuigi need on lihtsalt jutumärkides sõnad, on nad siin praegu kaks ühest elemendist koosnevat vektorit.

## [1] "Tere hommikust"

Teine näide: kleebime kokku kaks vektorit, millest üks koosneb ühest elemendist “Tere”, ja teisel vektoril on kaks elementi. Lühemat vektorit taaskasutatakse nii mitu korda, et pikema vektori kõik elemendid saaksid paarilise.

## [1] "Tere hommikust" "Tere õhtust"

Siit tuleb nĂĽĂĽd tĂĽkike korrutustabelit:

## [1] "1 korda 1 on 1 ."
## [1] "2 korda 2 on 4 ."
## [1] "3 korda 3 on 9 ."
## [1] "4 korda 4 on 16 ."

Teeme ühe tsükli, mis loeb kataloogist faile. Kataloogis on ehk igasugu erinevaid faile, aga pattern argument piirab, et loetakse ainult need, mille alguses on sõna “POHJA” ja lõpus “txt”. Näiteks kui seal kataloogis on erinevaid sama algusmustriga tekstifaile. Muidugi kui seal kataloogis midagi sellist ei ole, siis tsükkel midagi ei tee kah. Aga tsükli viimane rida lisab iga faili sisu kokku vektorisse tekstid – st paneb kokku varasemalt muutuja “tekstid” sisu ja “temp” ehk sel tsükliringil sisse loetud faili sisu ja kirjutab tulemusega üle muutuja “tekstid”.

3. Tekstiandmete töötlemine, regulaaravaldised

Siin peatĂĽkis tegeleme probleemidega, kui meil on teksti sisaldav fail, millest tahame:

  1. otsida välja laused, mis sisaldavad mingit sõna või sõnaühendit;
  2. teha tekstis asendusi;
  3. leida sagedasemad sõnad;
  4. leida kahtlased sümbolid, mis näiteks varieeruvad või on vigased, et neid ühtlustada;
  5. teha seda kõike siis, kui faile on rohkem kui üks.

Käsud, mida põhiliselt vaja läheb:

  • tekstifaili lugemiseks scan(); kui on pdf või docx, siis peab otsime mõne paketi, nt textreadr
  • tolower(), strsplit() + unlist()
  • otsing grep()
  • tekstiasendused gsub()
  • kokkuvõte table() + sort()
  • teisendatud teksti salvestamiseks cat()
  • mitu faili dir(), for()

Regulaaravaldised

Regulaaravaldised töötavad väikeste erinevustega väga paljudes keskkondades. R-i grep() ja gsub() käskude regulaaravaldiste üks oluline ja veidi tüütu eripära on see, et “vastukaigas” peab olema topelt: nt kui otsid sümbolit “.” (punkt) ja tahad selle sümboli regulaaravaldise funktsiooni (ükskõik mis sümbol) välja lülitada, siis tavaliselt pannakse sellele ette üks längkriips e vastukaigas e backslash, aga R-is peab neid panema kaks tükki: “\\.”

Väikese ülevaate regulaaravaldistest leiab R-i manuaalist:

Vaata ka regulaaravaldiste peatĂĽkki Vikipeediast: https://et.wikipedia.org/wiki/Regulaaravaldis

Vaata ka Neeme Kahuski regulaaravaldiste kokkuvõtet tema Pythoni kursuselt: https://www.cl.ut.ee/inimesed/nkahusk/sissejuhatus-pythonisse/regulaaravaldised.html

Ja vaata ka väikest kokkuvõtet ptk 3a. Valik olulisemaid regulaaravaldise süntaksielemente

3.1. TEKSTIOTSINGUD

grep()-käsu katsetamiseks paneme kokku ühe lühikese vektori, mis sisaldab erinevat laadi tähemärgijadasid: tähemärgid, numbrid, kirjavahemärgid, täpitähed, suurtähed, väiketähed, tühikud.

grep() käsk otsib vektorist tekstimustreid ja annab vastuseks need vektorielemendid, kus tekst leidus. Vaikimisi on vastuseks vastet sisaldavate elementide indeksid. Otsime vektorist sõnad, kus esines tähemärk “e”:

## [1]  1  2  3  4  6  7 10 11
## [1] "tere"                   "tore"                   "võre"                  
## [4] "kolmkümmend kolm?"      "televiisor"             "Eile!   Täna?   Homme;"
## [7] "terehommikust"          "lõunaooteretsept"

Vaikimisi annab grep() vektori elementide indeksid, kus otsitav leidus. Selleks, et vaste oleks väärtus ise, tuleks lisada argument value = T.

## [1] "tere"                   "tore"                   "võre"                  
## [4] "kolmkümmend kolm?"      "televiisor"             "Eile!   Täna?   Homme;"
## [7] "terehommikust"          "lõunaooteretsept"

grep() käsu otsing on regulaaravaldis, st me ei pea otsima ühe sõna kaupa täpset tähemärgilist vastet vaid võime teha üldistusi või täpsustusi. Näiteks toru ehk püstkriips (eesti klaviatuuril kombinatsioon AltGr <) eristab alternatiivseid variante, leiab kas “Täna” või “kolmkü…”.

## [1] "kolmkümmend kolm?"      "Eile!   Täna?   Homme;"

Kuna grep() leiab otsitava sisaldumist, siis vahel oleks vaja kirjeldada otsingus tervet välja. Väli on vektori puhul üks vektori element. Näiteks kui me otsime “tere”, siis me saame kõik vasted, kus see tähejärjend sisaldub, aga kui me tahame ainult seda vektorielementi, mis sellest järjendist koosneks, siis oleks tarvis otsingut piirata. Sümbol ^ tähistab välja algust ja $ välja lõppu, väli on vektori puhul vektorielement.

## [1] "tere"             "terehommikust"    "lõunaooteretsept"
## [1] "tere"
## [1] "võre"
## [1] "1.234" "1234"
##  [1] "tere"                   "tore"                   "võre"                  
##  [4] "kolmkĂĽmmend kolm?"      "1.234"                  "televiisor"            
##  [7] "Eile!   Täna?   Homme;" "õä"                     "terehommikust"         
## [10] "lõunaooteretsept"
## [1] "tere"                   "tore"                   "võre"                  
## [4] "kolmkümmend kolm?"      "televiisor"             "Eile!   Täna?   Homme;"
## [7] "terehommikust"          "lõunaooteretsept"
## [1] "tere"                   "tore"                   "võre"                  
## [4] "kolmkümmend kolm?"      "televiisor"             "Eile!   Täna?   Homme;"
## [7] "õä"                     "terehommikust"          "lõunaooteretsept"
## [1] "kolmkümmend kolm?"      "1.234"                  "Eile!   Täna?   Homme;"

Loeme “Tõde ja õigust”

Võtame nüüd ühe veidi pikema teksti. Moodlis 3. teema all on Anton Hansen Tammsaare “Tõde ja Õigus” I osa tekstifailina. See fail on pärit ühe teise Tartu Ülikooli kursuse materjalidest ja on kättesaadav ka siit: https://courses.cs.ut.ee/2015/eprogalused/fall/uploads/Main/anton_hansen_tammsaare_tode_ja_oigus_i.txt

Otsime sõnakasutuse näiteid “Tõe ja õiguse” I osa tekstis. Kui see fail tekstiredaktoris (nt Notepad++) lahti võtta, siis näeb, et see on puhas tekstifail, kus ei ole mingit küljendamise koodi, tekst jookseb järjest lõikude kaupa, iga lõigu vahel on kaks reavahetust.

Loeme teksti vektoriks, kus reavahetus eristab vektori elemente (st lõigu kaupa). Peale edukat skännimist vaatame head() ja tail() käskudega faili teksti algust ja lõppu. Kogu teksti ekraanile kuvada ei ole mõistlik, sest see on selle jaoks liiga pikk.

Õigupoolest seda faili võib R-i lugeda ka otse veebilingilt ilma, et peaks faili alla laadima ja oma töökataloogi tõstma.

## [1] "See e-raamat on skaneeritud ja koostatud Tartu Linnaraamatukogus"                                                                                                                                                                                                                                                                                                                         
## [2] "Tartu, 2011"                                                                                                                                                                                                                                                                                                                                                                              
## [3] "I"                                                                                                                                                                                                                                                                                                                                                                                        
## [4] "See oli läinud aastasaja kolmanda veerandi lõpul. Päike lähenes silmapiirile, seistes sedavõrd madalas, et enam ei ulatunud valgustama ei mäkke ronivat hobust, kes puutelgedega vankrit vedas, ei vankril istuvat noort naist ega ka ligi kolmekümnelist meest, kes kõndis vankri kõrval."                                                                                               
## [5] "Varsti jõudsid teelised mäerinnakul nii kõrgele, et päikeses helendama lõid mehe nägu – laiavõitu, tugevate lõuapäradega, terassilmadega, lühikese, kuid tiheda musta habemega –, naise nukrad silmad, look ja hobuse kikkis kõrvadega pea."                                                                                                                                              
## [6] "«Seal ta ongi, see Vargamäe,» lausus mees ja näitas käega üle soo järgmise väljamäe poole, kus lömitas rühm madalaid hooneid. «Meie hooned paistavad, teiste omad seisavad mäe taga orus, sellest siis rahva suus Mäe ja Oru, mõisakirjas aga Eespere ja Tagapere. Paremat kätt see männitukk seal kõrges mäe otsas on meie oma: igavesed vanad jändrikud teised, mõned poolkuivad juba.»"
## [1] "Mitu päeva oli vihma udutanud, aga nüüd pöördus tuul ja taevas tõmbus selgeks. Kui Andres Võlla väljamäest hobusega üles ronis, paistis päike samuti, nagu ta oli paistnud millalgi ammu varemalt. Ainult siis oli kevadine, täna sügisene päike. Aiste vahel oli samasugune kõrb mära, aga ometi polnud ta enam endine, vaid selle poeg. Siis olid vankril puuteljed, nüüd raud– assid. Kevadel istus vankril nukrasilmaline Krõõt ja Andres ise kõndis kõrval, sundides hobust, et jõuaks enne päikeseveeru koju. Nüüd istus Andres ainuüksi oma vimmas seljaga kössis vankril ja tal oli üsna ükskõik, kas ta päikeseveeruks Vargamäele jõuab või mitte."                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
## [2] "Ta vaatas Vargamäe mände ja talle tuli meelde, et neil Krõõdaga tol korral neist juttu oli olnud. Krõõt oli ammugi kadunud, vaevalt mäletati teda veel Vargamäel, Andres ise vana, aga männid seisid endistena. Ainult oksad olid teistel nagu harvemaks muutunud. Kuid võimalik, et asi polnud männiokstes, vaid Andrese enda silmis, mis aasta–aastalt töntsimaks läksid."                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
## [3] "Vargamäe soosillal tuli Andresele meelde, mis nad Krõõdaga temast olid rääkinud. Ja otse uskumata valusalt pidi Andres tunnistama, et soosillaga oli sündinud Krõõda, mitte Andrese sõnade järgi. See oli seda valusam, et Krõõt ise oli nii varakult läinud, aga oma sõnad jättis ta Vargamäe soosilla üle valitsema kuni tänapäevani."                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 
## [4] "Kodus ei rääkinud Andres sõnagi. Ta jõi ainult mitu head janu õlut, jõi, kuni peas lõi kihama, sest ta kartis, et täna muidu und ei leia, ja puges siis magama. Aga öösel, kas õlle mõju vähenemise tõttu või mõnel muul põhjusel, ärkas ta asemel ja ronis sealt tasakesi välja. Esiteks mõtles ta uuesti õlleankru kallale minna, aga siis tegi ta kapiukse lahti, võttis sealt piibli, istus laua äärde ja hakkas Hiiobi lugu lugema, sest Hiiobi suu läbi tahtis ta kõnelda oma Issandaga. Aga siis sündis nõnda, et kuna Andrese silmad käisid Hiiobi sõnade kannul, mõtles ta ise oma mõtteid, sest need seisid nagu igal pool pühakirja ridade vahel. Ja viimaks tundus Andresele, et loetud Hiiobi sõnad muutuvad kuidagi tema enese tundmusteks ja mõteteks, tema enese muredeks ja vaevadeks, tema enese pettumuseks ja meeleheiteks. Silmad jätavad viimaks pühakirja lugemise ja suu kordab poja räägitud sõnu, nagu oleks neis koos kõik käsud ja prohvetid töö ja vaeva kohta: «Sina oled seda teind ja minu ema tegi, ega ta muidu nii vara surnd, aga armastus ei tulnd, teda põle tänapäevani Vargamäel.» Aga mis siis siin on? küsib Andres endalt ega tea vastust. Ning kui ta viimaks arvab vastuse leidvat, siis ei saa ta enam muud teha, kui kummuli piiblile langeda, kuhu ta jääb tükiks ajaks."
## [5] "Nõnda räägib Vargamäe Andres oma südamlikumad sõnad Issandaga südaööl ja neist saab Marigi sängis vaiba all aru. Küll tahaks tema tõusta ja Andrese kõrvale kummuli lauale langeda, aga ta ei tee seda, sest ta teab, et siis langeb Andrese süda lukku Issanda ja Mari ees, nagu ta läks kõvaks siiski, kui Mari läks kord seisma sängisamba najale, et aidata mehel nutta. Sellepärast jääb Mari vaikselt vaiba alla, nagu ei paneks ta Andrest laua ääres mikski. Aga kui see pärast sängi tagasi poeb, et magama heita, leiab ta, et peapadi on märjaks läinud. Nüüd alles mõistab ta, et Mari oma jumalaga on kõnelnud, nii alandlikult, et ta oma peadki ei söandanud vaiba alt välja pista."                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
## [6] "Lõpp."

Jätame esimesed kaks rida välja (sest seal on metainfo elektroonilise teksti kohta, mitte teose sisu)

## [1] "I"                                                                                                                                                                                                                                                                                                                                                                                        
## [2] "See oli läinud aastasaja kolmanda veerandi lõpul. Päike lähenes silmapiirile, seistes sedavõrd madalas, et enam ei ulatunud valgustama ei mäkke ronivat hobust, kes puutelgedega vankrit vedas, ei vankril istuvat noort naist ega ka ligi kolmekümnelist meest, kes kõndis vankri kõrval."                                                                                               
## [3] "Varsti jõudsid teelised mäerinnakul nii kõrgele, et päikeses helendama lõid mehe nägu – laiavõitu, tugevate lõuapäradega, terassilmadega, lühikese, kuid tiheda musta habemega –, naise nukrad silmad, look ja hobuse kikkis kõrvadega pea."                                                                                                                                              
## [4] "«Seal ta ongi, see Vargamäe,» lausus mees ja näitas käega üle soo järgmise väljamäe poole, kus lömitas rühm madalaid hooneid. «Meie hooned paistavad, teiste omad seisavad mäe taga orus, sellest siis rahva suus Mäe ja Oru, mõisakirjas aga Eespere ja Tagapere. Paremat kätt see männitukk seal kõrges mäe otsas on meie oma: igavesed vanad jändrikud teised, mõned poolkuivad juba.»"
## [5] "Nii palju tegi mees juttu, siis logises vanker endiselt tummas vaikuses."                                                                                                                                                                                                                                                                                                                 
## [6] "Naine silmitses ümbrust: siin mägi, seal mägi, kaugemal kolmas, pahemat kätt neljas, paremat viies ja nende taga kuues, seitsmes veel ning rohkemgi. Mägedel põllud ja hooned, mägede ümber, nende vahel aina soo, tükati raba, kaetud kidura võserikuga."
## [1] 5028

Mitu korda esineb tekstis “hele hääl”? Aga “hele jaal”?

## [1] "«Sul on niisama hele hääl nagu su kadund emal, Krõõdal. Isa räägib alati sinu ema heledast häälest. Kas mäletad, kudas ta sinu ema matuksel nuttis? Mina mäletan seda selgesti.»"                                                                                                                                                                                                                                                                                                                                                            
## [2] "Andrese mõtteid aimas ja hindas ehk ainult Oru Pearu õieti. Sellepärast ütles ta oma esimesele pojale, et kui tema Mäe Liisi võtab, pühkigu suu Oru kohast puhtaks, sest tema kingib Oru ennem vallasantidele, kui et laseks Andrese tütre Orule perenaiseks. Liisi enese vastu põle tal küll midagi. Liisi isegi meeldib talle, sest tal on niisama hele hääl, nagu oli Krõõdal, kuigi tal pole Krõõda silmi, mis on Maretil. Aga küsimus pole siin mitte Liisis, vaid Andrese sugukonnas, ja seda Oru Pearu ei kannata, ammugi mitte Orul."
## [1]  716  730 1618 1871 3803 4303

Mitu korda esines? lenght() loeb kokku, mitu elementi on vektoril

## [1] 6

Kuidas saada kätte sõnajärjend “hele hääl” kõigis käändevormides, aga nii, et meile ei näidataks lõike, kus “hele” ja “hääl” sisaldavad sõnad esinevad erinevates lausetes? Selleks on mitu võimalust. Näiteks võime otsingus asendada varieeruva osa hää/jaa punktidega, see tähendab, et punkti koha peal võib olla ükskõik mis sümbol, Et otsime järjendit "hele ___l“. Selle otsingu puudus on see, et punkt tähistab ükskõik mis sümbolit ja otsing leiaks vasteks ka näiteks”hele tool“,”hele orel" jms, kui sellist tekstis esineks.

## [1] 19

Kindlasti ainult soovitud vasted saame siis, kui kirjutame välja varieeruva osa kaks lubatud varianti.

## [1] 8

Ja selle natuke üldistatum variant: nurksulgudes esitatud tähejadast võib esineda üks. Loogelistes sulgudes number tähendab, et eelnev sümbol kordub nii mitu korda. See otsing leiaks variandid “hele hääl” ja “hele jaal”, aga ka “hele haal” ja “hele jääl”, kui neid tekstis esineks.

## [1] 8

3.2. TEKSTI ĂśMBERSTRUKTUREERIMINE

gsub() käsk on põhimõtteliselt nagu “Search and Replace”. Olulised argumendid on pattern ehk otsitav jada, replacement asendatav jada ja x ehk vektor, millele seda rakendatakse. Veel võib kasulik olla argument ignore.case, mille vaikimisi väärtus on FALSE, aga TRUE korral ei eristata otsingus suuri ja väikseid tähti.

Nagu ikka R-i käskude puhul, asendus ei muuda käsu sisendiks olnud muutujat, vaid tulemus kas trükitakse ekraanile või tuleb see omistada mingi muutuja väärtuseks.

Katsetame gsub()’i kõigepealt vektori sõnad peal, mis me siin eespool tekitasime.

##  [1] "tere"                   "tore"                   "võre"                  
##  [4] "kolmkĂĽmmend kolm?"      "1.234"                  "televiisor"            
##  [7] "Eile!   Täna?   Homme;" "1234"                   "õä"                    
## [10] "terehommikust"          "lõunaooteretsept"

Asendame kõik e-d ü-dega.

##  [1] "türü"                   "torü"                   "võrü"                  
##  [4] "kolmkĂĽmmĂĽnd kolm?"      "1.234"                  "tĂĽlĂĽviisor"            
##  [7] "Eilü!   Täna?   Hommü;" "1234"                   "õä"                    
## [10] "türühommikust"          "lõunaootürütsüpt"

Asendame re-d rĂĽ-dega:

##  [1] "terü"                   "torü"                   "võrü"                  
##  [4] "kolmkĂĽmmend kolm?"      "1.234"                  "televiisor"            
##  [7] "Eile!   Täna?   Homme;" "1234"                   "õä"                    
## [10] "terühommikust"          "lõunaooterütsept"

Asendame r-i järel olevad e-d ü-dega. Sulgudes olev otsingu osa vastab asenduses “\\1”-le.

##  [1] "terü"                   "torü"                   "võrü"                  
##  [4] "kolmkĂĽmmend kolm?"      "1.234"                  "televiisor"            
##  [7] "Eile!   Täna?   Homme;" "1234"                   "õä"                    
## [10] "terühommikust"          "lõunaooterütsept"

Asendame or või õr järjendile järgnevad e-d ü-dega

##  [1] "tere"                   "torü"                   "võrü"                  
##  [4] "kolmkĂĽmmend kolm?"      "1.234"                  "televiisor"            
##  [7] "Eile!   Täna?   Homme;" "1234"                   "õä"                    
## [10] "terehommikust"          "lõunaooteretsept"

Otsime järjendit, kus 1. sümbol on t või v, 2. e või õ ja 3. r. Asendame selle nii, et ainult 2. sümbol (vokaal) jääb alles, eelneva t/v asemele läheb järjend “#xXq” ja r-i asemele “$”.

##  [1] "#xXqe$e"                "tore"                   "#xXqõ$e"               
##  [4] "kolmkĂĽmmend kolm?"      "1.234"                  "televiisor"            
##  [7] "Eile!   Täna?   Homme;" "1234"                   "õä"                    
## [10] "#xXqe$ehommikust"       "lõunaoo#xXqe$etsept"

Muudame järjekorda. Asendustes numbrid tähistavad otsingus esinevate sulgude sisu, st \\1 on esimeste sulgude sisu, \\2 teiste sulgude sisu jne.

##  [1] "etre"                   "tore"                   "õvre"                  
##  [4] "kolmkĂĽmmend kolm?"      "1.234"                  "televiisor"            
##  [7] "Eile!   Täna?   Homme;" "1234"                   "õä"                    
## [10] "etrehommikust"          "lõunaooetretsept"

Otsime järjendit, kus 1. sümbol on t, 2. e, 3. on ükskõik mis sümbol ja 4. on e. Asendame nii, et 1. ja 3. jäävad oma kohale, aga 2. ja 4. asemel on ö:

##  [1] "törö"                   "tore"                   "võre"                  
##  [4] "kolmkümmend kolm?"      "1.234"                  "tölöviisor"            
##  [7] "Eile!   Täna?   Homme;" "1234"                   "õä"                    
## [10] "töröhommikust"          "lõunaootörötsept"

Lõikudena struktureeritud vektor lausete kaupa vektoriks

Nüüd kus oleme natuke regulaaravaldiste ja gsub() käsu süntaksiga tutvunud, läheme natuke sisukama ülesande juurde. Võtame jälle ette “Tõe ja õiguse” teksti ja jagame selle lausete kaupa vektoriks, et otsingu vasteks ei oleks terve lõik, vaid ainult üks lause.

Esimese sammuna otsime ühe sümboli, mida tekstis ei esine. Näiteks siin võiks olla “#”. Teeme ühe grep()-päringu, et veenduda, et sellist sümbolit tekstis ei ole.

## integer(0)

Lisame sümboli # lauselõpumärkide järele, et märkida ära koht kus lause lõppeb.

Lauselõpumärgid võiks olla .!?, punkt ja küsimärk tuleks ka varustada vastukaigastega, sest muidu tähistab punkt ükskõik mis sümbolit ja küsimärk eelneva sümboli esinemist 0 või 1 korda. Otsingus paneme sellele märkide loetelule ümber ka nurksulud, sest me ei otsi nende kolme märgi järjendit (mida tekstis tõenäoliselt ei esine), vaid tahame ühe päringuga kätte saada kõik juhtumid, kus korraga esineb neist üks.

Siin tekstis on kasutatud üldiselt » sümbolit lõppevate jutumärkide tähistamiseks ja et see lõppev jutumärk ei jääks üksi järgmise lause algusesse, paneme selle ka otsingusse. Küsimärk selle järel siis tähendabki seda, et lauselõpumärgi järel võib olla lõppev jutumärk, aga võib ka mitte olla (esineb 0-1 korda). See küsimärk siis on regulaaravaldise erimärk ja sellele vastukaikaid ette ei pane.

Ja nagu öeldud, käsk ei muuda midagi objektis aht, vaid trükib muudetud vektori ekraanile, kui seda mingi muutuja väärtuseks ei omista. Tekitame tulemusest uue objekti aht1, sest nii jääb muutmata kujul tekst alles ja vajadusel on võimalik sinna tagasi minna (nt kui tegime asenduse käsus mingi näpuka või mõne järgmise asja jaoks tahame asendusi teha kuidagi test moodi).

## [1] "I"                                                                                                                                                                                                                                                                                                                                                                                        
## [2] "See oli läinud aastasaja kolmanda veerandi lõpul.#Päike lähenes silmapiirile, seistes sedavõrd madalas, et enam ei ulatunud valgustama ei mäkke ronivat hobust, kes puutelgedega vankrit vedas, ei vankril istuvat noort naist ega ka ligi kolmekümnelist meest, kes kõndis vankri kõrval."                                                                                               
## [3] "Varsti jõudsid teelised mäerinnakul nii kõrgele, et päikeses helendama lõid mehe nägu – laiavõitu, tugevate lõuapäradega, terassilmadega, lühikese, kuid tiheda musta habemega –, naise nukrad silmad, look ja hobuse kikkis kõrvadega pea."                                                                                                                                              
## [4] "«Seal ta ongi, see Vargamäe,» lausus mees ja näitas käega üle soo järgmise väljamäe poole, kus lömitas rühm madalaid hooneid.#«Meie hooned paistavad, teiste omad seisavad mäe taga orus, sellest siis rahva suus Mäe ja Oru, mõisakirjas aga Eespere ja Tagapere.#Paremat kätt see männitukk seal kõrges mäe otsas on meie oma: igavesed vanad jändrikud teised, mõned poolkuivad juba.»"
## [5] "Nii palju tegi mees juttu, siis logises vanker endiselt tummas vaikuses."                                                                                                                                                                                                                                                                                                                 
## [6] "Naine silmitses ümbrust: siin mägi, seal mägi, kaugemal kolmas, pahemat kätt neljas, paremat viies ja nende taga kuues, seitsmes veel ning rohkemgi.#Mägedel põllud ja hooned, mägede ümber, nende vahel aina soo, tükati raba, kaetud kidura võserikuga."

Teise sammuna tükeldame selle eelneva käsuga sisestatud sümboli “#” pealt. Käsk strsplit() tükeldab ühe vektorielemendi mitmeks tükiks split argumendiga tähistatud sümboli pealt nii, et see sümbol ise lõigatakse tekstist välja. Kuna vastuseks saame listi, aga mugavam on töötada vektoriga, siis pakendame selle käsu unlist() sisse.

## [1] "I"                                                                                                                                                                                                                                          
## [2] "See oli läinud aastasaja kolmanda veerandi lõpul."                                                                                                                                                                                          
## [3] "Päike lähenes silmapiirile, seistes sedavõrd madalas, et enam ei ulatunud valgustama ei mäkke ronivat hobust, kes puutelgedega vankrit vedas, ei vankril istuvat noort naist ega ka ligi kolmekümnelist meest, kes kõndis vankri kõrval."   
## [4] "Varsti jõudsid teelised mäerinnakul nii kõrgele, et päikeses helendama lõid mehe nägu – laiavõitu, tugevate lõuapäradega, terassilmadega, lühikese, kuid tiheda musta habemega –, naise nukrad silmad, look ja hobuse kikkis kõrvadega pea."
## [5] "«Seal ta ongi, see Vargamäe,» lausus mees ja näitas käega üle soo järgmise väljamäe poole, kus lömitas rühm madalaid hooneid."                                                                                                              
## [6] "«Meie hooned paistavad, teiste omad seisavad mäe taga orus, sellest siis rahva suus Mäe ja Oru, mõisakirjas aga Eespere ja Tagapere."

Tulemuseks on vektor, milles iga lause on eraldi vektori element. Muidugi natuke on siin juhtumeid, kus otsekõne ja järgnev saatelause on katki lõigatud, aga ärme praegu sellest probleemi tee. (Selle vältimiseks oleks 1. sammus pidanud veidi keerukama otsingu tegema, kus “#” sümbolit ei lisata järjendile “lauselõpumärk + lõppev jutumärk + tühik + väiketäht”).

Proovime nĂĽĂĽd samu otsinguid, mis 1) punkti all:

##  [1] "Aga see ei vastanud naabri küsimusele midagi, hakkas ainult heleda häälega sigu kutsuma, ikka «kotsu, kotsu, kotsu, põssa, põssa, põssa»."                                                                               
##  [2] "Aga nuabri eidel on nii hele jaal, et ..."                                                                                                                                                                               
##  [3] "Oleks Krõõt sõnagi lausunud, siis oleks ta vististi kohe ise oma rukkisse läinud sigu taga ajama, aga Krõõt ei tahtnud Pearult midagi, kutsus oma sigu heleda häälega."                                                  
##  [4] "Mõtles ta üleaedset lihtsalt kiusata või olid tal ometi omad plaanid, ainult naabri perenaine, kes tuli, laps süles, ja kutsus sigu nii heleda häälega, ainult see ehk ajas ta kavatsused luhta."                        
##  [5] "«Jah, hele jaal on sinu eidel küll, aina kuula kohe,» kiitis nüüd ka Pearu."                                                                                                                                             
##  [6] "Vesi jookseb ikka, kui tammi ees ei ole, aga teisepere sead jooksevad, kui kuulevad perenaise heledat jaalt ..."                                                                                                         
##  [7] "Aga eksis joobnu jutt kuhu ta eksis, ikka pöördus ta naabri perenaise «heleda jaale» juurde tagasi, nagu oleks see mõni nõiatuluke Vargamäe soode pilkases pimeduses."                                                   
##  [8] "Ja ma tahtsin ise sigadele rukkisse järele minna, aga sinu eit hakkas sigu heleda jaalega kutsuma, ikka põssa, põssa, põssa, kotsu, kotsu, kotsu (Pearu katsus kadunud Krõõda häält, maksku mis maksab, järele teha)."   
##  [9] "Ning sead ajasid kõrvad kikki, kuulatasid ja pistsid siis jooksma, aina sinnapoole, kust kostis hele jaal."                                                                                                              
## [10] "Veart ema oli sul ja hele jaal."                                                                                                                                                                                         
## [11] "«Küll on neil Mäe tüdrukutel õige heledad jaaled!"                                                                                                                                                                       
## [12] "Va kadund Krõet on oma kõri neile and, sel oli ka nii hele jaal, kui ta vahel sigu kutsus."                                                                                                                              
## [13] "Neist isa sõnadest oli küll, et ka Joosep välja läks Mäe tüdruku heledat häält kuulama."                                                                                                                                 
## [14] "«Sul on niisama hele hääl nagu su kadund emal, Krõõdal."                                                                                                                                                                 
## [15] "Isa räägib alati sinu ema heledast häälest."                                                                                                                                                                             
## [16] "Liisi isegi meeldib talle, sest tal on niisama hele hääl, nagu oli Krõõdal, kuigi tal pole Krõõda silmi, mis on Maretil."                                                                                                
## [17] "Tänini olid poisid ikka Vargamäe tüdrukute sabas olnud, sest neil olid laulmiseks heledad hääled ning rääkimiseks ja naermiseks suud parajal kohal, aga mingu nüüd veel."                                                
## [18] "Rõõmu kadumisega südamest kadus ka kumedus kurgust, heledus häälest ja ükski ei võinud kindlasti öelda, kas endine heledus veel kunagi Vargamäel kõlab või mitte."                                                       
## [19] "Ja ma noomisin teda ning ütlesin kalli jumalasõnaga: sina ei pea oma naisele mitte tegema, nagu teeme meie Vargamäel, sest see on sinu isa vihamehe esimene tütar, kel tema ema Krõõda hele jaal, kui ta kutsus sigu ..."

Harjutus 3.1

  1. Paranda eelmises punktis teksti lauseteks jagamise koodi nii, et otsekõnet sisaldavaid lauseid ei lõhutaks. Lõikumise sümbolit võib ka sisestada mitmes sammus, nt ühe gsub() asendusega kirjavahemärgi järele siis, kui ei järgne jutumärke, teise asendusega kirjavahemärgi ja jutumärgi järele, kui järgneb tühik ja suur täht.

  2. Otsi tekstis “janu jooma” eri vormides. Arvesta, et “jooma” on tüvevahelduslik (mõtle mineviku vormidele) ja sõnade järjekord võib vahelduda ja otsitavate sõnade vahel võib olla ka muid sõnu, nt “jõi hea janu”.

3.3. SAGEDUSSĂ•NASTIK

Mis on “Tõe ja õiguse” I osa sagedasemad sõnad? Sagedussõnastiku tegemiseks oleks vaja eemaldada kirjavahemärgid, muuta tekst väiketäheliseks ja tükeldada sõnade kaupa. Muidugi eestikeelse teksti puhul oleks ka vaja tekst lemmatiseerida, aga kuna seda R-is hästi teha ei saa, siis jätame selle sammu vahele.

Esimese sammuna lisame tühikud algavate jutumärkide taha, kirjavahemärkide ja lõppevate jutumärkide ette. Tekstis kasutatud kirjavahemärgid on .?!,«»:;

Teise sammuna tĂĽkeldame vektoriks tĂĽhikute pealt.

Kolmandaks muudame kogu teksti väiketäheliseks käsuga tolower(), et lausealguses esinevad sõnu ei loetaks muus lausepositsioonis esinevatest erinevaks. See muudab muidugi ka nimed väiketäheliseks.

Viimaseks teeme sagedustabeli ja sorteerime selle ära: table(), sort().

Kuna käsk sort() sorteerib väärtused väiksemast suuremaks, siis sagedamat otsa nimekirjast näeb käsuga tail().

## aht5
##    mis    oma   tema andres   nagu    see     on   siis    oli     et    aga 
##   1129   1159   1219   1223   1285   1324   1537   1670   2062   2247   2265 
##    kui     ei     ta      »      «     ja      .      ,        
##   2490   2804   3040   4081   4092   5206  11004  17207  34427

Muidugi võime kogu tabeli ka ringi pöörata.

## aht5
##             ,      .     ja      «      »     ta     ei    kui    aga     et 
##  34427  17207  11004   5206   4092   4081   3040   2804   2490   2265   2247 
##    oli   siis     on    see   nagu andres   tema    oma    mis 
##   2062   1670   1537   1324   1285   1223   1219   1159   1129

Histogramm sõnasageduste jaotusega.

Harjutus 3.2

Tee nimekiri “Tõe ja õiguse” tekstis kasutatud tähemärkidest. (Seda on eriti mõtet teha nt Wordi dokumentidega, mis on erinevatest dokumentides kokku kleebitud ja võivad sisaldada erinevaid koode samade tähemärkide jaoks.)

Sisesta iga tähemärgi järele tühik.

TĂĽkelda tekst tĂĽhikute pealt.

Tee sagedusloend table() või nimekiri unikaalsetest vektorielementidest unique() käsuga.

Millised võõrtähed esinevad “Tõe ja õiguse” esimese osa tekstis? Millistes sõnades, mis on laused? (otsi sõnade ja lausete kaupa tükeldatud vektoritestaht4 ja aht2)

3.4. Skännitud pdf-faili puhastamine

Otsime Digarist mõne skännitud raamatu pdf faili. Näiteks Tammsaare “Kärbes” http://www.digar.ee/id/nlib-digar:37582. See pdf on skännitud 1917. aastal trükitud väljaandest ning seejärel on kasutatud optilist tekstituvastust (Optical Character Recognition, OCR), et pildina skännitud tekstist leida tekst. Sõltuvalt trükikvaliteedist töötab see suuremate või väiksemate vigadega, aga tõenäoliselt sisaldab tekst üksjagu süstemaatilisi tuvastusvigu.

Moodlis kursuse lehelt 3. teema alt leiad ka zip-kausta (“Mõned Tammsaare raamatud”), kus on see ja mõned teised Tammsaare noorepõlveteosed, mis Digaris vabalt allalaetavad on.

Installi/lae pakett textreadr

## Table: [6 x 3]
## 
##   page_id element_id text                                      
## 1 1       1          A. H. Tammsaare\nKärbes\n     Tallinnas, 1
## 2 2       1          A. H. Tammsaare\nKärbes\n    Tallinnas, 19
## 3 3       1          ENSV TA\nKirjandusmuuseumi\n ArWivraamatul
## 4 4       1          1.\n      „0n keegi siin?" küsis Lutvvei, 
## 5 5       1          4\n        „01i ka teisi, aga mina jäin m 
## 6 6       1          5\n       „Aga need ei hakka ju mitte wan 
## . ...     ...        ...

Tulemuseks on tabel, kus 1. veerg on lk numbrid, 2. veerg rea numbrid ja 3. veerg on tekst. Kuna praegu meid küljendus eriti ei huvita, tahaks ainult teksti kätte saada ja seda vektorina töödelda, siis võtame muutujasse karbes2 ainult teksti ja alates 4 leheküljest.

## [1] "1.\n      „0n keegi siin?\" küsis Lutvvei, kui ta kella\nüheteistkümne paiku esimest korda asemel wirgus.\nEt wastust ei tulnud, siis naeratas üliõpilane oma\nküsimise üle, pööras teise külje ja mõtles uueste\nuinuda. Aga ta ei saanud ega saanud tundmusest\nlahti, et keegi peab toas olema, ja ta kordas endist\nküsimist, juurde lisades:\n       „01ed ehk sina, Tiksi?\"\n      Nüüd kostis tasane naerukihin.\n       „Ah sind wõrukaela! Mina tunnen, et õhk pole\npuhas.\"\n       „Mina tunnen ka, et õhk pole puhas,\" wastas\nnaisterahwa hääl. „Kus sa jälle oled olnud? Tuba\nnagu õllekeller.\"\n       „Kas tõeste? Ei ma ise tunne midagi, pea ainult\non pisut haige.\"\n       «Lähed raisku.\"\n       „Arwad sa?\"\n       „ Muidugi arwan.\"\n       „Eksid . . . ma polnud ju sugugi nii purjus.\"\n       „Kust see õllehais siis tuppa on saanud?\"\n       „Ei tea . . . wististe riietest . . . istusime ju kaua.\"\n       „Jälle Kulnoga?\"\n                                                        1*"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         
## [2] "4\n        „01i ka teisi, aga mina jäin muidugi tema pärast,\n ei saa fast lahti. Räägib teine wähe, heidab tühja\n naija, aga ikka on tundmus, nagu peaks midagi tulema.\"\n        .Oli tema ka purjus?\"\n        „Tema ei joo end kunagi purju . . . Ma teen\nju niisama: istun ja waatan, kuidas teised joowad,\n kuulan nende rumalusi . . .\"\n        „Ja rüüpad ise kaasa, eks?\"\n        „Aimilt weidi.\"\n     , „Soo, wõi weidi. Aga ukse olid jällegi lahti jätnud.\"\n       „Pärani?\"\n       .Ainult lukust.\"\n       .Siis pidin ma küll päris kaine olema.\"\n       „Wargad wõiwad sisse tulla.\"\n       „Wõiwad küll, kui nad nii lollid on: siit pole\nju midagi wõtta.\"\n       „Warastawad su enese.\"\n       .Mind walwawad kaitseinglid. Pealegi, ma pole\nju kolme kopikatki wäärt . . . Aga tule õige siia.\"\n       „Pole aega.\"\n       „Tule nüüd.\"\n       „Ütlesin, pole aega.\"\n       „Mis sa teed?\"\n       .Parandan su . . .\"\n       .Tean, tean,\" rääkis Lutwei wahele, .nad olid\nharude wahelt lõhki.\"\n       „Ka kuub närutab.\"\n       „Soo! Waata kurja! Oled juba ammugi siin?\"\n       .Umbes tund.\"\n       „Ja aina nõelud?\"\n       .Aina.\"\n       .Kust sa lappi said?\"\n       .Lõhkusin kõige vanemad ära.\""                                                                                                                                                                                                                                           
## [3] "5\n       „Aga need ei hakka ju mitte wanadega kokku.\"\n       «Mitte hästi, aga küllap käib, lapp ei paista kuue\n alt wälja.\"\n       „01ed sina küll kuldne hing! Tule siia, ma\nsuudlen sind selle eest.\"\n      „Ära sega.\"\n      «Ulata ainult käsi.\"\n      «Jäta mind rahule.\"\n      „Sõrmeotsadki.\"\n      «Wõiksid weel uinaku magada.\"\n      «Wäikesõrmgi, suudlen teda, tema küün õitseb,\nõis on walge, walge, nagu lumelill, eile nägin seda.\"\n      Neiu waikib.\n      „Tule, ma palun,\" mangub noormees.\n      «Palud ja ise selili.\"\n      „Ei, küljeli.\"\n      Tiksi naerab.\n      „Sa ei tule?\" küsis Lutwei otsustawaid\n      „Ei\", wastab neiu niisama.\n      «Ausõna?\"\n      «Ausõna.\"\n      „Siis tulen mina sinu juurde.\"\n      «Oled sa hull!\"\n      «Kuidas nii?\"\n      «Sa oled ju . . . sul pole . . .\"\n      «Mis mul pole?.. . Wõtan waiba ümber ja tulen.\"\n      «Aga uks on lukust lahti.\"\n      «Olgu.\"\n      «Mõni juhtub tulema.\"\n      «Mis wõib inimene juhtumiste wastu.\"\n      «Kui tuled, jooksen ära, jätan riided parandamata.\"\n      «Riided wõid parandamata jätta, seda usun, aga\nära ei jookse sa mitte, ei raatsi.\""                                                                                                                                                                                                                                                                                                            
## [4] "6\n     «Häbemata.\"\n     Lühike waikus. Siis hakkab noormees uueste.\n     «Tule istu woodiserwale ja õmble siin, ma tahan\nsind näha, tahan sind enese läheduses tunda. Kogu\nkehas on wastik tundmus, suus lääge maik . . .\"\n     „Paras, joo rohkem.\"\n     «Nagu oleksin midagi reotawat teinud . . . Sinu\nlähedus peletab selle tundmuse.\"\n     Tiksi naeris südamepõhjast.\n     „Sa naerad. Kas sa pole kunagi tähele pannud,\net ma mõnikord sinu lähedust ihkan?\n     „Mitte kunagi.\"\n     «Waletad! Tule siia . . . palun, ole hea . . .\nWõi oled pahane, et eile jälle jõin?\"\n     «Muidugi olen.\"\n     «Anna andeks! See on Kulno süü.\"\n     «Wõi Kulno süü.\"\n     „Kui teine kord end' hoian, kas siis tuled?\"\n     „Ei tule.\"\n     «Sa oled halb.\"\n     «Üks tingimine.\"\n     «Hea küll.\"\n     „Sa ei tohi mu tööd segada.\"\n     „Ei sega.\"\n     «Mässid enese ilusaste waipa ja tõstad jalad\nwastu seina.\"\n     «Olen nõus.\"\n     «Käed paned ka waiba alla.\"\n     «Olgu nõnda.\"\n     ..Ainult pea on waiba alt wäljas.\"\n     «Ainult pea.\"\n     «Oota, ma keeran ukse lukku, pärast mõni tuleb.\"\n     «Tiksi, sa oled hea.\""                                                                                                                                                                                                                                                                                                                                    
## [5] "7\n      „üks tingimine weel.\"\n      „0n uks juba lukus?\"\n      „Lukus.\"\n      „Siis pole enam mingisuguseid tingimisi.\"\n      „01gu pealegi, aga ma keeran ukse lukust lahti.\"\n      „Hea küll! Siis keelan mina sind oma «ideid\nparandamast.\"\n      „Arwad, et ma sinu keeldu kuulan\", ütles Tiksi,\nkes juba woodisirmi awausel seisis.\n      „Wõi weel!\"\n      „Teine jalg on waiba alt wäljas, peida see ära.\"\n     Noormees kuulas käsku. Neiu astus paar\nsammu edasi.\n      „Waip kõrgemale kurgu alla, käed ära.\"\n      „Kas ma teistki ei tohi wälja jätta?\"\n      „Ei, nõnda mitte. Pane vähemalt särgikäis kinni,\nwaata, missugune su käewars on.\"\n      „Missugune ta siis on! Pisut willane.\"\n      „Wõi pisut! Ahwipoeg!\"\n     Neiu istus sängijalutsile ja seadis end tööd\njätkama.\n      „Istu siia poole . . . lähemale.\"\n      „01en küll lähedal.\"\n      „Weel lähemale.\"\n      „See polnud kauba sees.\"\n      ,Igal kaubal on oma pealis. Näed, ma ei ulata\nsind sõrmeotsagagi puutuma.\"\n      „Nõnda on hea\", vastab neiu ja õmbleb edasi.\n      „Ei ole ju.\"\n      „On küll.\"\n      „Kus ta siis on, kui ei ole . . . Istu lähemale,\ntahan sulle midagi rääkida.\"\n      „Kuulen siiamaalegi.\""                                                                                                                                                                                                                                                       
## [6] "8\n        ,, Tahan tasakeste rääkida.\"\n        „Räägi aga pealegi.\"\n        „Nihku natukenegi peatsi poole... siis jalutsis...\n sa tead ju, missugused mu jalad on . . . hullemad\n kui käed.\"\n        „Ma ei tea midagi.\"\n        „Pane tähele, pööran selja, kui sa lähemale ei istu.\"\n        „ Ükskõik.\"\n       Noormees pöörabki ja neiu istub selsamal ajal\n suure tüki peatsi poole, öeldes: „Head und!\"\n       Teisel silmapilgul pöördub noormees uueste\n as?.mel ringi ja tõmbub istuja ümber kõwerasse kokku,\n teda oma keha poolringi asetades.\n       „Mis tingimine sul weel oli?\" küsib ta siis.\n       „Ütle enne, mis sa rääkida tahtsid.\"\n       „Ei, enne sinu tingimine.\"\n       „Sina pead enne rääkima.\"\n       s Ei mõtlegi.\"\n       „Mina ka mitte.\"\n       „Missugune kiusupunn sa oled\", ütles noormees\n häälel, milles tundus wõdisewat tõearwamist nagu\nrukkiõietolmu sinetawas õhus.\n       „Tahaksin sind torgata\", wastas neiu. Plikaliselt\nmänglewas toonis kuuldus nagu kewadise jääkirmetise\nmurdeklirin ehmunud hirwe jala all: üksikud kõli-\nsevad pinnud pistsid, aga walu tegemata, ainult\npisut erutades.\n       „Tiksi, mu Tiksi\", lausus noormees andekspalu-\nwalt ja koomale tõmbus keha poolring. Parem käsi\ntuli waiba alt wälja ja ulatas ümber peene plikalise\npiha. Pea kerkis padjalt ja huuled lähenesid töötawale\nkäele. Aga enne sinnajõudmist seisis nõel neil otsapidi\nees— sootuks wäike, teraw, haljas nõel. Huuled peata-"

Pakett textreadr töötab veidi erinevalt Win ja Mac OS-ides: Windowsis on üks tabeli rida üks tekstirida, Macis üks lehekülg. Kui kasutad Maci, oleks hea mõte tekst tükeldada ridade kaupa. Windowsis võib selle sammu vahele jätta.

## [1] "1."                                                 
## [2] "      „0n keegi siin?\" küsis Lutvvei, kui ta kella"
## [3] "ĂĽheteistkĂĽmne paiku esimest korda asemel wirgus."   
## [4] "Et wastust ei tulnud, siis naeratas üliõpilane oma" 
## [5] "küsimise üle, pööras teise külje ja mõtles uueste"  
## [6] "uinuda. Aga ta ei saanud ega saanud tundmusest"

Tükeldame teksti üksikuteks tähemärkideks, et teha unikaalsete tähemärkide loend, et kontrollida sealt imelikke haruldasi sümboleid, mis suure tõenäosusega on OCR-i vead.

##  [1] "1"  "."  " "  "„"  "0"  "n"  "k"  "e"  "g"  "i"  "s"  "?"  "\"" "ü"  "L" 
## [16] "u"  "t"  "v"  ","  "a"  "l"  "h"  "m"  "p"  "o"  "r"  "d"  "w"  "E"  "õ" 
## [31] "ö"  "j"  "A"  "b"  ":"  "T"  "N"  "!"  "M"  "ä"  "K"  "«"  "J"  "*"  "4" 
## [46] "f"  "R"  "O"  "S"  "P"  "W"  "Ăś"  "U"  "5"  "Ă„"  "6"  "H"  "'"  "7"  "I" 
## [61] "8"  "-"  "—"  "9"  "2"  "B"  "^"  "3"  "c"  "»"  "•"  "/"  ";"  ">"  "(" 
## [76] ")"  "Ă•"  "C"  "]"  "D"  "Ă–"  "\\" "V"  "z"  "<"  "["  "F"  "|"  "}"  "_"

Kasutame grep() käsku, et leida nimekirjas leiduvaid imelikke sümboleid. Eelnevast nimekirjast tasuks kontrollida erinevaid jutumärke ja sümboleid, mis ilukirjandustekstis tavaliselt ei esine:

-“^”, “•”, “/”, “]”, “\\”, “[”, “|”, “}”. - Sümbol “|” võib olla “l” või “I” ja “}” võib olla “j” või “J”. - Sümbolid “<” ja “>” võivad olla jutumärgid, sümboli “«” asemel on OCR tuvastanud “<<”. - Mõnikord võib imelik sümbol olla ka paberi defekt või kärbsemust vms.

## [1] "15 '\n       „Põlwitasin tema ees, awaldasin armastust. Siis\nta ütleski: mul olewat tema endise peigmehe nina,\nseesama suu, naer, kõnnak, aga ometi ei olewat ma\nseesama. Oi seda tundmust, mis siis oli, oi seda\nalanduseahastust!\"\n       „Ja jällegi läks warsti üle?\"\n       „Wististe, ei mäleta hästi. Aga puksa häbenesin\npeale seda, oleksin tahtnud nad jalast heita ja kõndida\nnagu lapsepõlwes — pikas särgis, paljareisi, palja-\njalu... Ja nüüd on Helene. Ka tema ei armasta mind,\nta mõtleb ainult meheleminemise peale, kardab wana-\npiiga põlwe, himustab akademia kodaniku naiseks\nsaada, sest meil on need kodanikud alles moodis.\nAga Helenega on kergem kui teistega: ta on mulle\npeaaegu ükskõik.\"\n       „Ainult kolm?\" küsis Tiksi.\n       „Kas wähe?\" küsis Lutwei wastu.\n       „Nagu oleks... sinusugusele mehele.\"\n       „Ongi rohkem olnud, aga need on tähtsamad,\nneed on jälgi jätnud.\"\n       „Ka Helene?\"\n       „See jätab, ma kardan, kõige sügawamad jäljed,\nsee wõtab mu hinge.\"\n       „Soo, nüüd on kõik korras,\" ütles Tiksi, tõusis\nwoodiserwalt ja pani riided toolile. „Aga kas sa üles\ntõusta ei tahagi ?\"\n       „Nii hea on pikutada ja mõtelda. Tule weel siia.\"\n       Neiu läks ja seisis woodi ees.\n       „Jstu weel,\" ütles Lutwei neiu käest kinni hakates.\n       »Ei, ei, sa pead üles tõusma. Pea meeles: piibud\nja mina wõi raha ja Helene ning riided närutawad\n sul • • • kõik, kõik.\n        „Ja sina?\""                                                                                                                                                                                                                  
## [2] "31\nkuni lõpupööre kõik uperkuuti paiskas. Sündmused\nkaswasid tal üle pea ja ta ei osanud muud teha, kui\naga koosolekult lahkuda.\n    Kui ta rahulikumaks saades selle peale tagasi\nmõtles, mis saalis oli räägitud, siis ei tulnud tal tõe-\npoolest midagi iseäralikku meelde, mis tema tegu\noleks õigustanud. Esitati päris harilikka ettepanekuid\nja soowisid, tehti sedasama, mis niisugustel koos-\nolekutel ikka tehakse: räägitakse ja waieldakse, waiel-\ndakse ja räägitakse. Aga rääkimise wiisist, sõnade\ntoonitamisest ja kaugeleulatawatest mõttelendudest\nimbus aimdus, et ükski ei räägi autori pärast, keda\nmõeldud austada, waid kõik mõtlewad aina iseenese\npeale, tahawad ettepanekute ja soowide aupaistusel\niseennast walgustada.      Siiski, selletaolist oli ta\nwaremgi märganud, ometi polnud ta oma suud pao-\ntanud. Miks tegi ta seda siis täna? Miks • laskis ta\nenese tühise sõnakõlinaga crewile ajada, miks tekkis\njust täna temas see pilkewimm, millest ta pidi waba-\nnema, maksku mis maksab ? Oli ehk põhjuseks liigne\nraamatute taga istumine wiimastel päewadel ja puu-\nriw mõttetöö, mis riisus ööselgi rahu, wõi andis hoogu\nammune tutwus Meriheinaga? Aga mis siis, kui ka\ntema teo osalisekski kihutajaks oli seesama isiklik\nedewusekirg, milles ta teisi süüdistas?\n      Kulno tuju hakkas langema. Kõik kippus paistma\ntõepoolest halwa naljana, seda halwemana, mida enam\nendine äritus sumbus. Ta oleks ehk lobisejad seltsi-\nmehed sinnapaika jätnud ja tähelpanemata wälja\npugenud, et koju minna, aga takistusena astus\nMerihein sisse. Temale wastu tõtates ja teda oma\nlauda kutsudes, lisas ta juurde:\n      „Sain jälle kord seatembuga maha.\""
## [3] "•15\n irooniaks ja kelle kruwitud õnnesoowidele pead was-\ntuseks otsima piinawa häbitundega sepitsetud tühje\n sõnu, kui ei taha talitada wiisakuseta. Nad tulewad\nehk mustis ülikondis, sabakuubedeski, torukübarad\n käes, nad tulewad seltskonnapäraste kumarduste ja\nkõnekäänudega, nagu ainult selleks, et weel kord\ntoonitada, kes on nemad ja kes on tema, Andres\nMerihein. On nad kunagi teda omawääriliseks pidanud\nwõi on nad kunagi temas seda sädet oletanudki —\narwamisest wõi usust rääkimata, — mida nad nüüd\nnäiwad austawat? Kui ta teaks, kui ta mäletaks.\nNüüd tulewad need, kellele tema ise ja tema tööd\nükskõik on olnud, tööd, millede eest weel praegugi\najuti peab hoiatama. Eks ei ole pidanud ta ikka\nkõrwal seisma, nurka surutud nende iseteadlikust\nettetükkiwusest, kel eestkostjaks koolitunnistus wõi\nainult suurem sissetulekki! Ta tegi tööd, ta kannatas\npuudust, ta rändas nukruseradu, ta rääkis inimestele\nigatsustest ja idealidest, aga see ei õigustanud teda\nmillekski. Seltskond, kes teda nüüd mõtleb austada,\nseisis temast kaugel ja kõrgel. Ainult nagu mõne-\nsugusel kohusetunde], naiselikus uudishimus wõi\nkirjanduslik-kunstilises edwistamises läheneti mõni-\nkord temale. Leidus neidki, kes pidasid end sedawõrd\nhuwitawaks ja isiklikult erakorraliseks, et arwasid\nwõiwat kirjanikule ainet pakkuda, juba ette rõõmus-\ntades, kuidas Meriheina uuem töö aina nendest rää-\ngib ja kuidas tuttawad wahetawad pilkusid, lausuwad\ntähendusrikkaid sõnu.\n      Nõnda mõtiskles Merihein oma sünnipäewa eel-\nõhtul, kui trepil korraga sammude summ müdisema\nhakkas. Ukse awamisel tulid sisse nooredmehed —"                                        
## [4] "63\nkarjuti kõigest kõrist, aga Merihein magas endiselt\nõndsa und: noorte rumalused ja alkohol olid oma\ntöö teinud. Asemele minnes oli tal aimdus, nagu\npoleks ta ometi päris asjata elanud, nagu leiduks\nnüüd ja tulevikuski elawaid, kes teda tõepoolest\nmeelde tuletawad ja sellepärast wõttis wõimust nii\nmõnus ja suigutaw uim.\n      Kaugelt, kaugelt kostis nagu inglitekoori laul.\n      Lauljad olid alguses nõutud. Mõeldi Meriheina\nmaksku mis maksab äratada, sest mis pagana „täntjen\"\nsee on, kui magaja ei wirgu. • Aga Lutwei tuletas\nmeelde rahupiipusid puhwetitoa seinal ja Kulno\narwas, uni olewat Eesti kirjaniku ainuke tõsine õnn.\nKes weel täiest südamest norskada wõib, selle ümber\npiirlewad alles head waimud.\n                           12.\n      „Aga mis siis teha ?\" küsiti.\n      „Ristsed käiwad edasi\", wastas Lutwei.\n      Ja endiselt löödi klaasid kokku, hõisati, naerdi\nja lauldi, leiti üks rumalus teise järel. Aga ometi ei\nsaadud enam endist meeleolu tagasi, ei wabanetud\ntundmusest, et magaja rahulik waim kõnnib käratse-\njate keskel. Wiimaks, kui üks rewolutsioni-ewolutsioni-\nmeestest rahupiipude alla sängi waibus ja kui teine,\nkes teda äratama läks, ise ka päris waikseks jäi,\nsaid kõik rahuaate poolehoidjateks.\n      „Armas kogudus, mul on mõte\", ütles Lutwei.\n      „Kui on, siis ütle\", wastati.\n      „Ainult magamisest tohib weel rääkida.\"\n      „Just sellest.\""                                                                                                                                                                                                                                                       
## [5] "83\n       „Tunnen, nagu hõõgaksid nad juba\", wastas Tiksi.\n       „Pole midagi, mõtlete tühja.\"\n      Wähehaawal muutub jutt elawamaks, hääled\nlähewad soemaks, silmad särawamaks. Tiksi ei wali\nenam mõtteid ja sõnu, ta wadistab juba kõigest, mis\nmeelde tuleb. Ja naerab. Merihein ei saa kuidagi\nmuidu, kui peab kaasa naerma. Juba ammugi pole\nta niipalju naernud ja kõiksugu tühjatähja rääkinud.\n       «Mis Te nüüd kirjutate ?• söandab Tiksi wiimaks\nküsida.\n       «Huwitab see Teid?\"\n       «Tahaksin juures istuda, kui Te kirjutate.\"\n       „Miks?\"\n       «Tahaksin näha, kas Teil kirjutades ka nii murelik\nnägu on, nagu muidu mõnikord.\"\n       «Weel murelikum.\"\n       „Kas kõik on murelikud, kui nad kirjutawad?\"\n      Merihein naeratab.\n       «Loojad on nukrad ja sünnitajad kannatawad\nwalu\", ütles ta.\n       „Ei mina kirjutaks, kui walus oleks.\"\n       «Muidu on weel walusani: riimid ripuwad õhus,\n unistused ei anna ööselgi rahu, istuwad peatsis, liigu-\nwad jalutsis, tulewad woodi alt, seinaprao waheltki.\nAga pane paberile, kohe wäiksed kui utekesed,\n magawad kui siugud. Luuletamine on päris mõrtsuka-\ntöö, unistuste tapmine. On mul mõni ilus ja suur\n unistus, siis kannan teda wõimalikult kaua peas,\nhinges, ei pane teda sõnadesse. Alles siis, kui ma\nteda küllalt imetlenud, armastanud, kumardanud, isegi\njumaldanud, alles siis tõmban ta sõnawõllasse. Kõigu\n ilmarahwa naeruks, lõbusta hoolimata meeli, tee nalja\nEdewatele, kõdita wäsinud erkusid oma neitsilikkusega,\n                                                  6*"                                                                                           
## [6] "164\n       „Minu kohta?\" imestas neiu, nagu oleks jutt\n wõhiwõõrast inimesest. „Mis on temal minu kohta\n rääkida ?•\n       „Teie olewat selles süüdi, et tema minu juurest\n ära läks.\"\n       „Mina? On ta arust ära! Mis puutub see\n minusse.\"\n      Merihein tahtis edasi rääkida, aga ei teadnud,\nkuidas seda teha. Wiimaks ütles ta kohmades:\n       „Tema olnudki see, kes kärbsel tiiwad ära\nrebinud.\"\n       „Seda wõib temast küll uskuda, niipalju tunnen\nma teda.\"\n       „Aga teie olewat talle selle mõtte andnud, teie\ntahtmine ja kihutus olnud see.\"\n      Tiksi naeris, naeris rõõmsalt ja ülimeelikult ja\nMerihein kuulis nagu esimest korda, kui südamlikult\nja ülimeelikult Tiksi wõib naerda. Silmad omal aina\nsätendasid ja sätendasid ning wilasid pealuus jooksta.\nAi kuidas nad wilasid, ai kuidas nad kilasid!\n       „Herra Lutwei oli wist purjus, kui ta nõnda\nrääkis\", ütles Tiksi, kui ta naerust wõitu oli saanud.\n       „Na parajaste.\"\n      „Nojah, seda ma arwasin kohe, tema räägib\nainult purjus peaga niisuguseid asju. Ja teie uskusite?\"\n      Merihein ei söandanud öelda, et ta joobnud\nüliõpilase sõnu oli uskunud ja et just selle usu õlul\ntäna neiut uulitsal ootas.\n      „Tema on päris hirmus inimene oma joomisega\",\nseletas neiu, „ja joobnult pole tal aru ega otsa, mis\nta räägib. Kuipalju olen pidanud mina tema tühjade\njuttude pärast kannatama.\"\n      Tiksi oli nukker, üsna nukker."

Vahel saab paremini aru, kui otsida ĂĽles lehekĂĽlje number, kus see sĂĽmbol peaks esinema ja vaadata seda lehekĂĽlge pdf-ist nt Adobe Readeris.

## [1] "15 '\n       „Põlwitasin tema ees, awaldasin armastust. Siis\nta ütleski: mul olewat tema endise peigmehe nina,\nseesama suu, naer, kõnnak, aga ometi ei olewat ma\nseesama. Oi seda tundmust, mis siis oli, oi seda\nalanduseahastust!\"\n       „Ja jällegi läks warsti üle?\"\n       „Wististe, ei mäleta hästi. Aga puksa häbenesin\npeale seda, oleksin tahtnud nad jalast heita ja kõndida\nnagu lapsepõlwes — pikas särgis, paljareisi, palja-\njalu... Ja nüüd on Helene. Ka tema ei armasta mind,\nta mõtleb ainult meheleminemise peale, kardab wana-\npiiga põlwe, himustab akademia kodaniku naiseks\nsaada, sest meil on need kodanikud alles moodis.\nAga Helenega on kergem kui teistega: ta on mulle\npeaaegu ükskõik.\"\n       „Ainult kolm?\" küsis Tiksi.\n       „Kas wähe?\" küsis Lutwei wastu.\n       „Nagu oleks... sinusugusele mehele.\"\n       „Ongi rohkem olnud, aga need on tähtsamad,\nneed on jälgi jätnud.\"\n       „Ka Helene?\"\n       „See jätab, ma kardan, kõige sügawamad jäljed,\nsee wõtab mu hinge.\"\n       „Soo, nüüd on kõik korras,\" ütles Tiksi, tõusis\nwoodiserwalt ja pani riided toolile. „Aga kas sa üles\ntõusta ei tahagi ?\"\n       „Nii hea on pikutada ja mõtelda. Tule weel siia.\"\n       Neiu läks ja seisis woodi ees.\n       „Jstu weel,\" ütles Lutwei neiu käest kinni hakates.\n       »Ei, ei, sa pead üles tõusma. Pea meeles: piibud\nja mina wõi raha ja Helene ning riided närutawad\n sul • • • kõik, kõik.\n        „Ja sina?\""                                                                                                                                                                                                                  
## [2] "31\nkuni lõpupööre kõik uperkuuti paiskas. Sündmused\nkaswasid tal üle pea ja ta ei osanud muud teha, kui\naga koosolekult lahkuda.\n    Kui ta rahulikumaks saades selle peale tagasi\nmõtles, mis saalis oli räägitud, siis ei tulnud tal tõe-\npoolest midagi iseäralikku meelde, mis tema tegu\noleks õigustanud. Esitati päris harilikka ettepanekuid\nja soowisid, tehti sedasama, mis niisugustel koos-\nolekutel ikka tehakse: räägitakse ja waieldakse, waiel-\ndakse ja räägitakse. Aga rääkimise wiisist, sõnade\ntoonitamisest ja kaugeleulatawatest mõttelendudest\nimbus aimdus, et ükski ei räägi autori pärast, keda\nmõeldud austada, waid kõik mõtlewad aina iseenese\npeale, tahawad ettepanekute ja soowide aupaistusel\niseennast walgustada.      Siiski, selletaolist oli ta\nwaremgi märganud, ometi polnud ta oma suud pao-\ntanud. Miks tegi ta seda siis täna? Miks • laskis ta\nenese tühise sõnakõlinaga crewile ajada, miks tekkis\njust täna temas see pilkewimm, millest ta pidi waba-\nnema, maksku mis maksab ? Oli ehk põhjuseks liigne\nraamatute taga istumine wiimastel päewadel ja puu-\nriw mõttetöö, mis riisus ööselgi rahu, wõi andis hoogu\nammune tutwus Meriheinaga? Aga mis siis, kui ka\ntema teo osalisekski kihutajaks oli seesama isiklik\nedewusekirg, milles ta teisi süüdistas?\n      Kulno tuju hakkas langema. Kõik kippus paistma\ntõepoolest halwa naljana, seda halwemana, mida enam\nendine äritus sumbus. Ta oleks ehk lobisejad seltsi-\nmehed sinnapaika jätnud ja tähelpanemata wälja\npugenud, et koju minna, aga takistusena astus\nMerihein sisse. Temale wastu tõtates ja teda oma\nlauda kutsudes, lisas ta juurde:\n      „Sain jälle kord seatembuga maha.\""
## [3] "•15\n irooniaks ja kelle kruwitud õnnesoowidele pead was-\ntuseks otsima piinawa häbitundega sepitsetud tühje\n sõnu, kui ei taha talitada wiisakuseta. Nad tulewad\nehk mustis ülikondis, sabakuubedeski, torukübarad\n käes, nad tulewad seltskonnapäraste kumarduste ja\nkõnekäänudega, nagu ainult selleks, et weel kord\ntoonitada, kes on nemad ja kes on tema, Andres\nMerihein. On nad kunagi teda omawääriliseks pidanud\nwõi on nad kunagi temas seda sädet oletanudki —\narwamisest wõi usust rääkimata, — mida nad nüüd\nnäiwad austawat? Kui ta teaks, kui ta mäletaks.\nNüüd tulewad need, kellele tema ise ja tema tööd\nükskõik on olnud, tööd, millede eest weel praegugi\najuti peab hoiatama. Eks ei ole pidanud ta ikka\nkõrwal seisma, nurka surutud nende iseteadlikust\nettetükkiwusest, kel eestkostjaks koolitunnistus wõi\nainult suurem sissetulekki! Ta tegi tööd, ta kannatas\npuudust, ta rändas nukruseradu, ta rääkis inimestele\nigatsustest ja idealidest, aga see ei õigustanud teda\nmillekski. Seltskond, kes teda nüüd mõtleb austada,\nseisis temast kaugel ja kõrgel. Ainult nagu mõne-\nsugusel kohusetunde], naiselikus uudishimus wõi\nkirjanduslik-kunstilises edwistamises läheneti mõni-\nkord temale. Leidus neidki, kes pidasid end sedawõrd\nhuwitawaks ja isiklikult erakorraliseks, et arwasid\nwõiwat kirjanikule ainet pakkuda, juba ette rõõmus-\ntades, kuidas Meriheina uuem töö aina nendest rää-\ngib ja kuidas tuttawad wahetawad pilkusid, lausuwad\ntähendusrikkaid sõnu.\n      Nõnda mõtiskles Merihein oma sünnipäewa eel-\nõhtul, kui trepil korraga sammude summ müdisema\nhakkas. Ukse awamisel tulid sisse nooredmehed —"                                        
## [4] "63\nkarjuti kõigest kõrist, aga Merihein magas endiselt\nõndsa und: noorte rumalused ja alkohol olid oma\ntöö teinud. Asemele minnes oli tal aimdus, nagu\npoleks ta ometi päris asjata elanud, nagu leiduks\nnüüd ja tulevikuski elawaid, kes teda tõepoolest\nmeelde tuletawad ja sellepärast wõttis wõimust nii\nmõnus ja suigutaw uim.\n      Kaugelt, kaugelt kostis nagu inglitekoori laul.\n      Lauljad olid alguses nõutud. Mõeldi Meriheina\nmaksku mis maksab äratada, sest mis pagana „täntjen\"\nsee on, kui magaja ei wirgu. • Aga Lutwei tuletas\nmeelde rahupiipusid puhwetitoa seinal ja Kulno\narwas, uni olewat Eesti kirjaniku ainuke tõsine õnn.\nKes weel täiest südamest norskada wõib, selle ümber\npiirlewad alles head waimud.\n                           12.\n      „Aga mis siis teha ?\" küsiti.\n      „Ristsed käiwad edasi\", wastas Lutwei.\n      Ja endiselt löödi klaasid kokku, hõisati, naerdi\nja lauldi, leiti üks rumalus teise järel. Aga ometi ei\nsaadud enam endist meeleolu tagasi, ei wabanetud\ntundmusest, et magaja rahulik waim kõnnib käratse-\njate keskel. Wiimaks, kui üks rewolutsioni-ewolutsioni-\nmeestest rahupiipude alla sängi waibus ja kui teine,\nkes teda äratama läks, ise ka päris waikseks jäi,\nsaid kõik rahuaate poolehoidjateks.\n      „Armas kogudus, mul on mõte\", ütles Lutwei.\n      „Kui on, siis ütle\", wastati.\n      „Ainult magamisest tohib weel rääkida.\"\n      „Just sellest.\""                                                                                                                                                                                                                                                       
## [5] "83\n       „Tunnen, nagu hõõgaksid nad juba\", wastas Tiksi.\n       „Pole midagi, mõtlete tühja.\"\n      Wähehaawal muutub jutt elawamaks, hääled\nlähewad soemaks, silmad särawamaks. Tiksi ei wali\nenam mõtteid ja sõnu, ta wadistab juba kõigest, mis\nmeelde tuleb. Ja naerab. Merihein ei saa kuidagi\nmuidu, kui peab kaasa naerma. Juba ammugi pole\nta niipalju naernud ja kõiksugu tühjatähja rääkinud.\n       «Mis Te nüüd kirjutate ?• söandab Tiksi wiimaks\nküsida.\n       «Huwitab see Teid?\"\n       «Tahaksin juures istuda, kui Te kirjutate.\"\n       „Miks?\"\n       «Tahaksin näha, kas Teil kirjutades ka nii murelik\nnägu on, nagu muidu mõnikord.\"\n       «Weel murelikum.\"\n       „Kas kõik on murelikud, kui nad kirjutawad?\"\n      Merihein naeratab.\n       «Loojad on nukrad ja sünnitajad kannatawad\nwalu\", ütles ta.\n       „Ei mina kirjutaks, kui walus oleks.\"\n       «Muidu on weel walusani: riimid ripuwad õhus,\n unistused ei anna ööselgi rahu, istuwad peatsis, liigu-\nwad jalutsis, tulewad woodi alt, seinaprao waheltki.\nAga pane paberile, kohe wäiksed kui utekesed,\n magawad kui siugud. Luuletamine on päris mõrtsuka-\ntöö, unistuste tapmine. On mul mõni ilus ja suur\n unistus, siis kannan teda wõimalikult kaua peas,\nhinges, ei pane teda sõnadesse. Alles siis, kui ma\nteda küllalt imetlenud, armastanud, kumardanud, isegi\njumaldanud, alles siis tõmban ta sõnawõllasse. Kõigu\n ilmarahwa naeruks, lõbusta hoolimata meeli, tee nalja\nEdewatele, kõdita wäsinud erkusid oma neitsilikkusega,\n                                                  6*"                                                                                           
## [6] "164\n       „Minu kohta?\" imestas neiu, nagu oleks jutt\n wõhiwõõrast inimesest. „Mis on temal minu kohta\n rääkida ?•\n       „Teie olewat selles süüdi, et tema minu juurest\n ära läks.\"\n       „Mina? On ta arust ära! Mis puutub see\n minusse.\"\n      Merihein tahtis edasi rääkida, aga ei teadnud,\nkuidas seda teha. Wiimaks ütles ta kohmades:\n       „Tema olnudki see, kes kärbsel tiiwad ära\nrebinud.\"\n       „Seda wõib temast küll uskuda, niipalju tunnen\nma teda.\"\n       „Aga teie olewat talle selle mõtte andnud, teie\ntahtmine ja kihutus olnud see.\"\n      Tiksi naeris, naeris rõõmsalt ja ülimeelikult ja\nMerihein kuulis nagu esimest korda, kui südamlikult\nja ülimeelikult Tiksi wõib naerda. Silmad omal aina\nsätendasid ja sätendasid ning wilasid pealuus jooksta.\nAi kuidas nad wilasid, ai kuidas nad kilasid!\n       „Herra Lutwei oli wist purjus, kui ta nõnda\nrääkis\", ütles Tiksi, kui ta naerust wõitu oli saanud.\n       „Na parajaste.\"\n      „Nojah, seda ma arwasin kohe, tema räägib\nainult purjus peaga niisuguseid asju. Ja teie uskusite?\"\n      Merihein ei söandanud öelda, et ta joobnud\nüliõpilase sõnu oli uskunud ja et just selle usu õlul\ntäna neiut uulitsal ootas.\n      „Tema on päris hirmus inimene oma joomisega\",\nseletas neiu, „ja joobnult pole tal aru ega otsa, mis\nta räägib. Kuipalju olen pidanud mina tema tühjade\njuttude pärast kannatama.\"\n      Tiksi oli nukker, üsna nukker."
## [1]  16  32  46  63  84 165

Asendame • • • > …

Jagame teksti sõnadeks

Järgmise sammuna jagame teksti sõnadeks, sest mõningaid asendusi on parem teha sõna kontekstis; kirjavahemärgid võiks olla “\.,-„’\?:!«»;”

## 
##       ju     juba    nõnda     nüüd     ikka     neiu    ütles     weel 
##      108      112      116      119      124      124      124      133 
##      nad      kes     kõik     pole    kulno   lutwei   midagi    oleks 
##      136      137      139      139      144      145      150      157 
##      oma      nii      wõi       ka     seda       sa   ainult     tema 
##      157      168      180      185      193      195      208      234 
## merihein      see       ma    tiksi      oli     siis      mis     nagu 
##      242      259      280      287      299      319      331      334 
##       et      kui      aga       on       ei       ta       ja          
##      456      540      543      667      730      869     1185    16082

Otsime sõna sees numbreid.

##  [1] "0n"    "01ed"  "01i"   "01ed"  "0n"    "01gu"  "01en"  "01e"   "01e"  
## [10] "01ed"  "01id"  "01i"   "01en"  "01en"  "0hoo"  "8b"    "01eme" "01e"  
## [19] "9i"    "0n"    "01i"   "01en"  "01ge"  "01en"
## [1] "}ä"
##  [1] "0n"    "01ed"  "01i"   "01ed"  "0n"    "01gu"  "01en"  "01e"   "01e"  
## [10] "10"    "01ed"  "10"    "20"    "30"    "01id"  "01i"   "01en"  "40"   
## [19] "01en"  "0"     "50"    "10"    "60"    "0hoo"  "0"     "80"    "01eme"
## [28] "01e"   "90"    "0n"    "100"   "101"   "102"   "103"   "104"   "105"  
## [37] "106"   "107"   "108"   "109"   "110"   "20"    "01i"   "120"   "130"  
## [46] "140"   "10*"   "150"   "01en"  "160"   "01ge"  "170"   "01en"  "30"   
## [55] "180"

Asendame sõnades OCR-i tuvastusvead “1” > “l”, “0” > “o”, “}” > “j”

##  [1] "      „On keegi siin?\" küsis Lutvvei, kui ta kella"      
##  [2] "       „Oled ehk sina, Tiksi?\""                          
##  [3] "        „Oli ka teisi, aga mina jäin muidugi tema pärast,"
##  [4] "       „Oled sina küll kuldne hing! Tule siia, ma"        
##  [5] "      „On uks juba lukus?\""                              
##  [6] "      „Olgu pealegi, aga ma keeran ukse lukust lahti.\""  
##  [7] "      „Olen küll lähedal.\""                              
##  [8] "      „Ole wait\", wastas neiu ja laskis nooremehe pea"   
##  [9] "      „Ole hea, too tubakat, ise ulatan piibu seinalt,"   
## [10] "       „Oled pahane?\""                                   
## [11] "       „Olid sa arust ära?\" küsis keegi tuttaw."         
## [12] "      „Oli tema seal?\""                                  
## [13] "      „Olen nõus\", ütles Lutwei. «Millal wõin kolida?\"" 
## [14] "       „Olen hellitatud. Hellitamine sünnitab kõiksugu"   
## [15] "       „Ohoo! Sa oled ikkagi päris loomulik kärbes,"      
## [16] "teiste asjade wastu\", arwas Kulno. „Oleme kangeste"      
## [17] "       „Ole ettevaatlik\", rääkis Kulno. „Arwad sa"       
## [18] "      B On sul ka aru\", ĂĽtles Tiksi nĂĽĂĽd nagu hal-"      
## [19] "       „Oli noorherra üksi?\""                            
## [20] "       „Olen purjus ja jäängi purju, naised on litad ja"  
## [21] "      „Olge head. Siin sellel riiulil on ehk kõige"       
## [22] "       „Olen ma siis tõeste nii halb, et te mulle ei"

Kaotame ära poolitusmärgid

Kui palju on küljendatud tekstis reavahetuse tõttu poolitatud sõnu?

## [1] 540
## [1] "murdeklirin ehmunud hirwe jala all: üksikud kõli-"     
## [2] "       „Tiksi, mu Tiksi\", lausus noormees andekspalu-"
## [3] "ees— sootuks wäike, teraw, haljas nõel. Huuled peata-" 
## [4] "sid — seda wõis ainult aimata, mitte näha, nii silma-" 
## [5] "      Nõnda rääkides suudles neiu ikka ja ikka noore-" 
## [6] "sina istud ja õmbled, mina pikutan ja popsutan, piibu-"

Kuna tekst on vektoris küljenduses esinenud ridade kaupa, siis poolitusmärgiga lõppev sõna algus on ühe vektorielemendi lõpus, jätk on järgmise alguses. Selleks, et need pooled kokku ühte tekstistringi saaks, korrastame teksti ümber, kleebime kogu teksti üheks vektorielemendiks kokku nii, et reavahetuste kohale jääks reavahetuse sümbol “\n”.

Seejärel eemaldame sidekriipsu ja reavahetuse, kui nad jäävad tähemärkide vahele. Mõnel pool (ilmselt taanete tõttu) esineb rea alguses ka tühikuid, need kustutame ka ära.

Ja liigendame vektori jälle ridade kaupa.

Kui nüüd kontrollida, kas tekstis esineb poolitusmärgiga lõppevaid sõnu, siis mõned (17?) jäid siiski sisse. Tundub, et enamik neist on leheküljevahetusel olevad poolitused, kus vahele jääb ka leheküljenumber.

## [1] 17
##  [1] "ees— sootuks wäike, teraw, haljas nõel. Huuled peata-"                                                                                                                                                                                                    
##  [2] "keisrid panid juba troonile astudes oma mälestussammastele aluse ja meie esiisad istutasid poja sündimisel tammesid, nagu walmistaksid nad juba mähkmetes surma wastu, aga meil ei juleta sellest niitsatadagi, mis tulema peab ja mis on iga elawa orea-"
##  [3] "      ..Kes r-"                                                                                                                                                                                                                                           
##  [4] "noorte muretuse järel, tahtmine ümbritseda end nägu-"                                                                                                                                                                                                     
##  [5] "tõugu pudelid, isegi nuge ja kahwlid, klaase ja tee-"                                                                                                                                                                                                     
##  [6] "oleks weel hiljaksjäänud ristsepidulisi teel, ja natu-"                                                                                                                                                                                                   
##  [7] "wiiekümnemal sünnipäewa! terwitama, temale selts-"                                                                                                                                                                                                        
##  [8] "naine olla, talle puhtamat ja peenemat ihu- ja woodi-"                                                                                                                                                                                                    
##  [9] "aimdused, lootused, oletused, tema kähardunud juuk-"                                                                                                                                                                                                      
## [10] "ta enese neiust ja tõukas selle hooletult eemale, pea-"                                                                                                                                                                                                   
## [11] "tema midagi sellesarnast tundnud, waadates näite-"                                                                                                                                                                                                        
## [12] "hästi aru, ma küsisin ainult: mis on raba taga, seal-"                                                                                                                                                                                                    
## [13] "walu, on sõnadele küünimata kurbus, on silmis igat-"                                                                                                                                                                                                      
## [14] " nii meeldinud, ja selle Lutwei ees oli nii hea põlwi-"                                                                                                                                                                                                   
## [15] "avaldas, valdas auahne arvamine, et tema, see kerge-"                                                                                                                                                                                                     
## [16] "mina uskusin, tema rääkis ja mina uskusin, aima-"                                                                                                                                                                                                         
## [17] " läks lonkides koju poole, üsna tasa läks ta, pea lon-"
##  [1] "9"                                                  
##  [2] "27"                                                 
##  [3] "      „Arwa.\""                                     
##  [4] "43"                                                 
##  [5] "47"                                                 
##  [6] "                                                  5"
##  [7] "67"                                                 
##  [8] "92"                                                 
##  [9] "                                                7*" 
## [10] "110"                                                
## [11] "122"                                                
## [12] "123"                                                
## [13] "125"                                                
## [14] "133"                                                
## [15] "142"                                                
## [16] "                     »"                             
## [17] "166"

3.5. Faile on rohkem kui ĂĽks

  • Nimekiri kaustas olevatest failidest käsuga dir()
  • TsĂĽkkel, mis loeb teksti vektoriks. for() {scan()}

Moodlis kursuse lehel 3. teema all on kataloog Digarist alla laetud Tammsaare teoste pdf-iga. Need on seal vabalt kättesaadavad ja igaüks võib need (või sama hästi ka mingid muud tekstid) endale ise tõmmata:

  • “Kärbes”
  • “Noored hinged”
  • “Pikad sammud”
  • “Sõjamõtted”
  • “Varjundid”

Salvestasin pdf-failid kausta tammsaare_pdf. Et oleks mugavam faile lugeda, siis võiks sellest kataloogist teha töökataloogi. Digaris on pdf-failidel numbrijadast koosnev nimi, mina oma versioonis nimetasin failid natuke sisukamalt ümber (aga seda ei pea tegema). Käsuga dir() saame loendi kaustas olevatest failidest ja argument pattern täpsustab, et tahame ainult faile, mille nimes on “.pdf”, nii et kui ka näiteks R-i skript on samas kataloogis, siis seda ei loeta.

## [1] "tamms_karbes.pdf"     "tamms_noored.pdf"     "tamms_pikad.pdf"     
## [4] "tamms_sojamotted.pdf" "tamms_varjund.pdf"

Endiselt kasutame pdf-i failidest teksti lugemiseks käsku, mis tuleb paketist textreadr, nii et kui see ei olnud aktiivne, siis tuleks aktiveerida.

Proovime veel enne tsükli juurde asumist ühe faili peal sammud läbi teha:

Kas kõik töötas? Onju lihtne? Nüüd paneme veel ka tsükli ümber. Muutuja failid on vektor kaustas olevatest failinimedest. Tsükkel for() kordub nii mitu korda, kui vektoris failid on elemente, minu näites siis 5 korda. Ja igal korral saab muutuja fail sisuks üks vektori failid väärtustest.

3a. Valik olulisemaid regulaaravaldise sĂĽntaksielemente

  • ^ - välja algus
  • $ - välja lõpp
  • . - ĂĽkskõik mis sĂĽmbol
  • [xyz] - esineb ĂĽks nurksulgudes olevatest sĂĽmbolitest.

  • [^x] - vasteks on kõik sĂĽmbolid peale “x”-i, st ĂĽkskõik mis sĂĽmbol, aga mitte see. kui katus ĂĽksi otsingu alguses tähistab väljaalgust, siis nurksulgudes tähistab see järgneva sĂĽmboli mitteesinemist.

  • \d - numbrid
  • \D kõik muud sĂĽmbolid peale numbrite
  • [a-z] - väiketähelised ASCII tähestikutähed a-st z-ni
  • [A-z] - kõik ASCII tähestikutähed, nii suured kui väiksed
  • [[:alpha:]] - kõik tähestikutähed sh täpitähed (vist?)
  • [[:punct:]] - kirjavahemärgid

  • {4} - eelnev sĂĽmbol kordub neli korda
  • {3,6} - eelnev sĂĽmbol esineb 3-6 korda

Üldjuhul “a{4}” teeb sama välja, mis sümbolit korrata sama arv kordi “aaaa”. Aga kui näiteks otsida kindlat arvu järjestikuseid tähemärke, siis on lihtsam lugeda. Eriti kui otsida mitut järjestikust tühikut: " {6}" või " “. grep(”[ert]{4}“, c(”tere“,”tore“,”võre“), value=T) #”tere"

  • * - eelmine sĂĽmbol null või enam korda
  • ? - eelmine sĂĽmbol kordub null või ĂĽks kord
  • + - eelmine sĂĽmbol kordub ĂĽks või enam korda

  • .* - ĂĽkskõik mis sĂĽmbol esineb null või enam korda. See on “ahne” päring, st vasteks on maksimaalselt suur tĂĽkk. Et ahnust taltsutada, saab lisada tärni järele kĂĽsimärgi, siis leitakse vasteks minimaalne sobiv tĂĽkk. Näiteks kui soovid asendada lauses “Sõida tasa ĂĽle silla!” tĂĽhikute vahele jäävad sõnad sõnaga “puruks”, siis lihtsalt " .* " vasteks on esimesest tĂĽhikust viimaseni ja tehakse ĂĽks asendus, " .*? " juhul asendatakse iga tĂĽhikute vahele jääv sõna eraldi. Näiteks:

## [1] "Sõida puruks silla!"
## [1] "Sõida puruks üle puruks käsipuu!"
  • \ - Kuna sĂĽmbolid “.*+?” ja kõik sulud on kasutusel regulaaravaldiste erisĂĽmbolitena, siis selleks, et otsida vastavaid sĂĽmboleid, tuleb neile lisada vastukaigas. R-i regulaaravaldistes on eripära võrreldes paljude teiste rakendustega, et vastukaikaid peab panema topelt. Näiteks kui otsida sĂĽmbolit “.” ehk punkt ja mitte ĂĽkskõik mis sĂĽmbol, siis tuleb otsida: “\\.” Tavaliste “topeltĂĽlakoma” jutumärkidega on eriti keeruline, nende otsimiseks tuleb lisada kolm kaigast: \\\"

4. Arvandmed, statistika

Skaalad

Skaalast sõltub see, millist statistikat saab andmetele rakendada. Üldiselt eristatakse nelja tüüpi skaalasid:

  • nominaalskaala (nt sugu, sõnaliik, Ĺľanr),
  • ordinaalskaala (nt vanuserĂĽhm, keeleoskuse tase),
  • intervallskaala (nt nädala- või kuupäevad),
  • suhteskaala (nt vanus, pikkus, kaal, kestus).

Loeme andmed failist altern_kys_andmed_Rkursus_puhas.txt ja vaatame, mis skaalad on esindatud.

Vaata loetud andmestiku kokkuvõtet ja päist, et saada andmestikust ülevaade ja näha, kas kõik on õigesti R-i imporditud.

Sagedus

Nominaalskaala (ja ordinaalskaala) justkui ei sisaldakski arve, nii et mis statistikat siin teha on? Siiski, saab kokku lugeda esinemisi ehk sagedust.

Sagedustabel ĂĽhe faktoriga. table()

## 
##  x1  x2 
## 121 118

Suhteline sagedus. prop.table() annab suhtelise sageduse, see on osa tervikust, terviku väärtus on kokku 1. Ja seda saame protsendina väljendada, kui korrutame läbi 100-ga, nii et terviku väärtus on kokku 100.

## 
##        x1        x2 
## 0.5062762 0.4937238
## 
## x1 x2 
## 51 49

Risttabel kahe faktoriga:

##     
##      x1 x2
##   HL 28 12
##   IT 16 24
##   KA 32  7
##   LP 10 30
##   PT 15 25
##   TT 20 20

Argument margin määrab, kas koguhulga moodustab ridade summa (1) või tulpade summa (2). Vaikimisi on margin = NULL, mis tähendab et koguhulgaks on kogu tabeli summa. Korrutame proportsionaalsed sagedused 100, et saada protsendid; protsenti enamasti ei ole mõtet näidata komakohtadega, sestap paneme siia ümber veel ümardamise käsu round().

##     
##      x1 x2
##   HL 70 30
##   IT 40 60
##   KA 82 18
##   LP 25 75
##   PT 38 62
##   TT 50 50

(Miks mitte näidata protsentidel komakohti? Esiteks, protsent on üldistus ja kui juba üldistada, siis ei ole mõtet lisada kribu, mis selle lugemist raskendab. Teiseks, alati tasub mõelda, kas see on sisukas suurus. Kui koguhulk on <100, siis kõik alla 1% sellest on vähem kui 1 (inimest, vastust, või mida me parasjagu kokku loeme). Seega selleks, et 0.1% oleks mõttekas suurus, peaks olema koguhulk vähemalt 1000.)

Kolme ja enama faktoriga risttabeli saab käsuga ftable() (kuna selle käsurea väljud on küllatki pikk, siis praegu siin ei ole välja trükitud, proovi seda kodus). Selle käsuga esimesed faktorid (siin kj ja jrk) kombineeritakse ridadesse ja viimane (altern) tulpadeks.

Kõige sagedasem esindaja ehk mood. Paljudes statistikapakettides (nt Excel) on moodi leidmiseks käsk. R-is ei ole, tuleb lihtsalt kokku lugeda sagedused ja leida maksimum. table() + which.max()

## x1 
##  1

Tulpdiagramm, barplot()

Natuke loogilisem näeb see joonis välja nii, kui faktori read ja tulbad vahetada. Argument beside = T joonistab ühe tabelitulba kastid üksteise kõrvale, mitte üksteise otsa, nagu vaikimisiväärtuste puhul. Argument main lisab joonisele pealkirja, ylab ja xlab telgede kirjeldused. Argument legend.text lisab legendi kategooriate nimed, see peaks olema esitatud vektorina, millel on nii mitu väärtust kui palju joonise sisendiks oleval tabelil on tulpasid.

Jaotus

Kui nominaalse tunnuse esinemised kokku lugeda, siis tulemus ei ole enam nominaalse skaalaga. Esinemissagedust kirjeldab suhteskaala: on olemas kindla suurusega ühikud ja nullpunkt. Võime arvutada keskmise sageduse käsuga mean().

Aga tabelis dat on ka arvuline tunnus reaktsiooniaeg, mille keskmist võime arvutada. Kui hulgas on teadmata väärtuseid (NA), siis R-is on keskmise väärtus ka NA, sest me ei saa ju teada keskmist, kui me ei tea, mis on kõik väärtused. Aga NA-väärtusi saab ignoreerida, kui lisada argument na.rm= T.

## [1] 911.6019

Millise jaotusega on tunnus? Jaotusest annavad hea ülevaate kvartiilid. Käsk quantile(). Kvartiilid jagavad vektori neljaks võrdseks osaks:

  1. kvartiil on see väärtus, millest on 25% mõõtmistest väiksemad ja 75% suuremad.
  2. kvartiil on täpselt poole peal: 50% on sellest väiksemad, 50% suuremad. Seda nimetatakse ka mediaaniks ja selle saab ka käsuga median(). Sümmeetrilise jaotuse korral võiks see kattuda ka aritmeetilise keskmisega.
  3. kvartiil on see väärtus, millest on 75% mõõtmistest väiksemad ja 25% suuremad.
  4. kvartiil on see väärtus, millest kõik mõõtmised on väiksemad, ehk siis maksimum.
##         0%        25%        50%        75%       100% 
##   83.38553  416.28704  728.09193 1204.28265 3194.70651

Kui kvartiilid jagavad jaotuse neljaks osaks, siis kvantiilidega on võimalik seda ka muudeks proportsionaalseteks osadeks jagada. Käsu quantile() argumendiga probs saab määrata, mis proportsioonide kvantiile esitatakse. Näiteks vaatame selle jaotuse 10%, 33%, 66% ja 90% kvantiile:

##       10%       33%       66%       90% 
##  324.0163  519.4001  981.0442 1875.4699

Visuaalselt saab jaotusest hea ĂĽlevaate histogrammi hist() ja kast-vurrud-diagrammiga boxplot().

Milliseid jaotusi üldiselt leida võib? Joonise kood Keith Johnson 2008, Quantitative methods in linguistics, lk 14-15.

Normaaljaotus

Üldiselt baasstatistika tegemise jaoks on kõige ihaldusväärsem normaaljaotus, sest paljud statistilised testid (nagu t-test ja ANOVA) eeldavad, et andmed on normaaljaotusega. Normaaljaotus on hea selle pärast, et normaaljaotuse puhul on kogu andmestik kirjeldatav kahe väärtuse, keskmise ja standardhälbe kaudu.

Selleks, et kontrollida, kas andmed on normaaljaotusega, võib esiteks vaadata histogrammi. Normaaljaotuse korral võiks histogramm olla sümmeetriline, kus keskel on kõige sagedasem väärtus ja mõlemale poole madalamate ja kõrgemate väärtuste suunas langevad väärtuste sagedused võrdselt.

Histogramm osutab, et pigem ei ole tegemist normaaljaotusega, sest jaotus on ebasĂĽmmeetriline, paremale kallutatud.

Teiseks võib vaadata kvantiiljaotuste joonist. Käsk qqnorm() vastandab andmestiku tegelikud väärtused ja teoreetilised väärtused juhul, kui tegemist oleks normaaljaotusega. Kui andmed ongi normaaljaotusega, siis peaks joonisele moodustuma sirge joon, aga kui tegelikult andmed ei ole normaaljaotusega, siis on joon kõver. Käsk qqline lisab joonisele regressioonijoone.

Ka QQ-plot osutab, et ei ole normaaljaotust, sest punktid ei moodusta sirget joont, nii alumine kui ülemine ots hälbib väga regressioonijoonest.

Kolmas viis normaalaotus kontrollida on Shapiro test, mis hindab tõenäosust, et tegemist on normaaljaotusega: kui p > 0.05, siis võib pidada normaaljaotuseks, kui jääb alla selle, siis mitte.

## 
##  Shapiro-Wilk normality test
## 
## data:  dat$raeg
## W = 0.89082, p-value = 4.262e-12

Shapiro testi p-väärtus = 4.262e-12 ehk 0.000000000004262 ütleb, et tegemist ei ole normaaljaotusega.

Antud juhul kõik kolm osutavad, et tegemist ei ole normaaljaotusega. Tihti kestused on natuke liialt paremale kallutatud, et olla normaaljaotusega, sest keskmisest madalamate väärtuste suunas on hälbimine 0-punktiga piiratud, aga suuremate väärtuste suunas piiri ei ole.

Kui andmed ei ole normaaljaotusega, siis ei saa kasutada normaaljaotust eeldavaid teste (näiteks t-test), nende asemel peaks kasutama mitteparameetrilisi (nt Wilcoxoni test). Aga vahel aitab see, kui andmeid natuke manipuleerida, et normaaljaotust ikkagi saavutada. Näiteks kergelt paremale kallutatud väärtuste puhul aitab tihti logaritmimine.

## 
##  Shapiro-Wilk normality test
## 
## data:  log(dat$raeg)
## W = 0.98333, p-value = 0.006797

Kui väärtuste hulgas on ka 0 ja kuna logaritm 0-st on miinus lõpmatus, siis on hea logaritmimiseks kasutada käsku log1p(), mis enne logaritmimist liidab väärtustele +1.

Antud juhul aitas logaritmimine muuta histogrammi sümmeetrilisemaks ja ka QQ-plotil on punktid sirgemas joones ning lähemal regressioonijoonele. Shapiro testi p = 0.006797 siiski jääb nii madalaks, et ei saa seda normaalaotuseks pidada.

Ăśhe arvulise tunnusega joonised

Ăśhe arvulise ja kategoriaalse tunnusega joonis: kast-vurrud diagramm. Reaktsiooniaegade jaotused vastusevariantide kaupa.

Kuidas kirjeldada joonisel olevate rühmade keskmisi? Käsk mean() annab ühe, kogu vektori keskmist väärtust kirjeldava arvu ja sama moodi käsk sd() annab ühe standardhälbe väärtuse. See keskmine ja standardhälve iseloomustab kogu katse reaktsiooniaega:

## [1] 911.6019
## [1] 621.1642

Kui tahame eraldi keskmist reaktsiooniaega kummagi vastusevariandi korral, siis üks võimalus on rakendada keskmise käsku kaks korda eraldi kummalegi subsetile:

## [1] 946.7487
## [1] 875.8592

Teine võimalus on panna mean() käsu tapply() sisse. tapply() rakendab mingit käsku vektorile X argumendis INDEX antud rühmade kaupa:

##       x1       x2 
## 946.7487 875.8592

Ja sama moodi standardhälve:

##       x1       x2 
## 617.6992 625.2627

Kui rĂĽhmitaval tunnusel on rohkem tasemeid kui kaks: reaktsiooniaeg katseisikute kaupa.

##        HL        IT        KA        LP        PT        TT 
## 1623.8807  457.4145  516.9386  627.6231  835.5857 1388.4353

Ja kui rĂĽhmitavaid tunnuseid on mitu: reaktsiooniaeg katseisikute ja nende antud vastusevariantide kaupa.

Eelnevalt on boxplot()’i x ja y argumendid esitatud vektoritena. Kui andmed tulevad kõik ühest tabelist, siis võib tabeli nimetada ka argumendiga data ning x ja y puhul ainult tulbanimed:

Kui rühmitavaid faktoreid on kaks, siis tapply() jaoks saab nad panna kokku käsuga list() – tulemuseks on risttabel.

##           x1        x2
## HL 1511.8510 1885.2834
## IT  540.1513  402.2566
## KA  506.1521  564.7072
## LP  694.2412  605.4171
## PT  883.9586  806.5619
## TT 1337.1547 1439.7160

Tõenäosuslik statistika

Siin teeme väga pealiskaudse ja kiire ekskursi tõenäosuslikku statistikasse.

p-väärtus statistilise testi puhul: enamasti hindame tõenäosust, et tulemused on saadud juhuslikult. Statistiliselt oluliseks loeme tavaliselt p<0.05, st tõenäosus juhuslikult selliseid tulemusi saada on väiksem kui 5%.

Hii-ruut

Sagedustabeli hindamiseks sobib hästi hii-ruut: chisq.test() Hii-ruut test võrdleb risttabelina esitatud sagedusi teoreetiliste sagedustega (kui kõigil on võrdsed võimalused) ja hindab, kui tõenäoline on võimalus tulemusi saada juhuslikult. Näiteks kui viskad 10 korda järjest kulli ja kirja, kui tõenäone on saada 1 korral kull ja 9 korral kiri?

## 
##  Chi-squared test for given probabilities
## 
## data:  c(1, 9)
## X-squared = 6.4, df = 1, p-value = 0.01141

Tõenäosus 10 viskest 1 kord saada kull ja 9 korda kiri on 0.01141 ehk 1.1%. See ei tähenda, et see tulemus oleks võimatu, lihtsalt võrdlemisi ebatõenäoline.

Aga kui teha 100 viset, kui tõenäone on 10 korda kulli saada?

## 
##  Chi-squared test for given probabilities
## 
## data:  c(10, 90)
## X-squared = 64, df = 1, p-value = 1.244e-15

Testime nüüd alternatiivküsimuste testi puhul vastusevariantide sagedust. Vaatame kõigepealt sagedustabelit:

## 
##  x1  x2 
## 121 118

Testi lähtekoht on see, et vastusevariantidel olid võrdsed võimalused ja varieerumine vastusevariantide vahel on juhuslik.

## 
##  Chi-squared test for given probabilities
## 
## data:  table(dat$altern)
## X-squared = 0.037657, df = 1, p-value = 0.8461

Hii-ruut test osutab, et vastusevariantide vahel varieerumine on juhuslik: p = 0.8461 tähendab, et 85% tõenäosusega on erinevus x1 ja x2 vastuste esinemise sageduses juhuslik.

Vaatame nüüd varieerumist katseisikute vahel. Kõigepealt sagedustabel ise:

##     
##      x1 x2
##   HL 28 12
##   IT 16 24
##   KA 32  7
##   LP 10 30
##   PT 15 25
##   TT 20 20

Kui anda hii-ruut testile sisendiks risttabel, siis võrreldakse ridade vaheliste sageduste proportsioonide vahelist erinevust.

## 
##  Pearson's Chi-squared test
## 
## data:  table(dat$kj, dat$altern)
## X-squared = 36.494, df = 5, p-value = 7.565e-07

Kuidas seda tulemust nüüd tõlgendada? p-väärtus on 0.0000007565 ehk tõenäosus selliseid tulemusi juhuslikult saada on väga väike. Seega katseisikute vahelised erinevused on statistiliselt olulised. Kokkuvõttes ei osutagi hii-ruut test muule kui sellele, et siin tabelis leidub vähemalt üks rida, mille tulpade vaheline proportsioon on oluliselt erinev teistest ridadest. Sagedustabelist näeb, et katseisikute vahelised erinevused on tõesti suured, nt 1. ja 3. real on x1 palju sagedasem, 2., 4. ja 5. real on sagedasem aga x2 ning 6. real on mõlemad tulbad võrdselt.

Intervall- ja suhteskaalaga andmed: keskmiste võrdlemine.

Keskmiste võrdlemise puhul testitakse seda, kas rühmad on juhuslikud valimid samast populatsioonist või kuuluvad erinevatesse populatsioonidesse. Kui on 2 rühma, siis t-test. Kui ei ole normaaljaotusega, siis wilcoxoni test. Ja kui on normaaljaotusega, aga rohkem kui 2 rühma, siis ANOVA. ANOVA-t võib muidugi kasutada ka siis, kui on ainult 2 rühma.

Enne kui testi rakendama hakata, tuleks kontrollida, kas kõik testi eeldused on täidetud. Nn parameetrilised testid (t-test & ANOVA) eeldavad, et:

  • mõõtmised on sõltumatud. See tähendab, et andmestikus ei tohiks olla kordusi.
  • andmed on normaaljaotusega. Sest kui andmed on normaaljaotusega, siis on võimalik valimit kirjeldada 2 väärtuse, keskmise ja standardhälbe kaudu. Kui ei ole normaaljaotus, siis peaks kasutama mitteparameetrilist testi.

Siin kasutatud nn alternatiivküsimuste andmestikus on korduvad mõõtmised: igale katseisikule on esitatud samad 40 küsimust, seega iga katseisiku kohta on 40 korduvat mõõtmist ja iga küsimuse kohta on 6 korduvat mõõtmist. Sellisel kujul peaksime valima mingi keerulisema statistilise testi, millele ei ole kordusmõõtmiste piirangut (nt lineaarse segamudel). Lihtne alternatiiv on võtta iga testitava konditsiooni kohta korduste keskmine. Näiteks kui tahame t-testiga kontrollida, kas reaktsiooniaeg on erinev sõltuvalt vastusevariandist, siis võiksime iga katseisiku iga vastusevariandi reaktsiooniajad keskmistada.

##           x1        x2
## HL 1511.8510 1885.2834
## IT  540.1513  402.2566
## KA  506.1521  564.7072
## LP  694.2412  605.4171
## PT  883.9586  806.5619
## TT 1337.1547 1439.7160

Enne rühmade võrdlemise testi tegemist testime eeldust, et andmed oleks normaaljaotusega: hist(), shapiro.test(), qqnorm() + qqline()

## 
##  Shapiro-Wilk normality test
## 
## data:  dat2
## W = 0.8765, p-value = 0.07905

Kuigi me enne just veendusime, et reaktsiooniaeg ei ole normaaljaotusega, siis nüüd katseisikute keskmistatud väärtused napilt ikkagi on, Shapiro testi p-väärtus on > 0.05.

Parameetriline t-test

Teeme t-testi, et võrrelda vastusevariantide x1 ja x2 reaktsiooniaega. t-testi 0-hüpotees on, et nende vastusevariantide vahel ei ole erinevust ja reaktsiooniaeg on sarnane.

## 
##  Two Sample t-test
## 
## data:  dat2[, 1] and dat2[, 2]
## t = -0.1306, df = 10, p-value = 0.8987
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -693.6105  616.7994
## sample estimates:
## mean of x mean of y 
##  912.2515  950.6570

See, mis meid t-testi tulemuse juurest kõige rohkem huvitab, on muidugi p-väärtus. Siin p = 0.899 ütleb et reaktsiooniaja erinevus vastusevariantide puhul ei ole erinev. Üldiselt on statistiliste testide puhul piiriks 0.05 (ehk 5%): kui on suurem, jääb kehtima 0-hüpotees ja kui on alla selle, siis lükatakse 0-hüpotees ümber. Oluline on meeles pidada, et 0-hüpotees t-testi (ja enamkiku sarnaste testide) puhul on, et erinevused rühmade vahel on juhuslikud. Tavaliselt see sisukas hüpotees, mida me testiga kontrollida tahame on alternatiivne hüpotees, et rühmade vahel on erinevus. Seetõttu “oluline” tulemus on see, kui p-väärtus on võimalikult väike. Ehk et kui tõenäosus, et rühmade vahel erinevused on juhuslikud, jääb alla 5% (p<0.05), siis see tähendab, et 95% tõenäosusega võime väita, et rühmad on erinevad.

T-testi 0-hüpoteesi sõnastus on erinev kui Shapiro testil ja seetõttu ka p-väärtust peab tõlgendama erinevalt. Shapiro testi 0-hüpotees on, et andmed on normaaljaotusega ja juhul, kui tahame leida kinnitust, et andmestik tõesti vastab normaaljaotuse tunnustele, siis me tahame näha võimalikult kõrget p-väärtust (üle 0.05). T-testi puhul me enamasti tahame leida kinnitust, et rühmade vahel on erinevus, mistõttu me tahame näha võimalikult madalat p-väärtust (alla 0.05).

Mitteparameetriline Wilcoxoni (Mann-Whitney) test

Juhul, kui normaaljaotuse nõue ei ole täidetud, siis peaks kasutama mitteparameetrilist testi. Kahe rühma puhul sobib näiteks Wilcoxoni (Mann-Whitney) test. Kui t-test võrdleb rühmades andmete jaotust keskmise väärtuse põhjal, siis Wilcoxoni test võrdleb andmepunktide järkusid. Üldiselt tulemused ei peaks olema väga erinevad t-testist.

## 
##  Wilcoxon rank sum exact test
## 
## data:  dat2[, 1] and dat2[, 2]
## W = 18, p-value = 1
## alternative hypothesis: true location shift is not equal to 0

Testi tulemus näitab, et rühmad ei ole erinevad. Üldiselt kui andmestik on suurem kui 30 mõõtmist, siis võib ka mittenormaaljaotuse korral kasutada siiski ka t-testi.

Kaks rĂĽhma ANOVA testiga

T-testiga saab võrrelda kahte rühma ja kui on rohkem kui 2 rühma, siis peab kasutama ANOVA-t. Aga ANOVA-t võib kasutada ka siis, kui on ainult 2 rühma, tulemus on üsna sama, mis t-testi puhul.

Esmalt peame aga andmestikku teisendama. t.test()-i sĂĽntaks lubab andmeid esitada kahel viisil:

  1. rühmad kahe vektorina, kus ühes vektoris on ühe rühma väärtused ja teises teise rühma omad;
  2. vektor uuritava tunnuse väärtustega ~ vektor(id) rühmitava tunnuse väärtustega.

Anova testi jaoks sobib ainult viimane. Sellisel kujul olid andmed algselt objektis dat, aga dat2 peaks nüüd ümber tõstma:

##    kj altern      raeg
## 1  HL     x1 1511.8510
## 2  IT     x1  540.1513
## 3  KA     x1  506.1521
## 4  LP     x1  694.2412
## 5  PT     x1  883.9586
## 6  TT     x1 1337.1547
## 7  HL     x2 1885.2834
## 8  IT     x2  402.2566
## 9  KA     x2  564.7072
## 10 LP     x2  605.4171
## 11 PT     x2  806.5619
## 12 TT     x2 1439.7160

Proovime nĂĽĂĽd veel kord selle andmestiku peal t-testi.

## 
##  Two Sample t-test
## 
## data:  raeg by altern
## t = -0.1306, df = 10, p-value = 0.8987
## alternative hypothesis: true difference in means is not equal to 0
## 95 percent confidence interval:
##  -693.6105  616.7994
## sample estimates:
## mean in group x1 mean in group x2 
##         912.2515         950.6570

Ja sama ANOVA testiga. R-is anova() sisendiks on lineaarne mudel lm()

## Analysis of Variance Table
## 
## Response: raeg
##           Df  Sum Sq Mean Sq F value Pr(>F)
## altern     1    4425    4425  0.0171 0.8987
## Residuals 10 2594126  259413

Niisiis, p-väärtuse poolest on ANOVA tulemus üsna sarnane t-testile.

Rohkem kui 2 rĂĽhma ANOVA testiga

Kui vastusevariantidel ei ole olulist erinevust reaktsiooniajas, siis kas katseisikud erinesid reaktsiooniaja poolest?

## Analysis of Variance Table
## 
## Response: raeg
##           Df  Sum Sq Mean Sq F value    Pr(>F)    
## kj         5 2505404  501081  32.277 0.0002902 ***
## Residuals  6   93147   15525                      
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

P-väärtus 0.0003 ütleb, et erinevused katseisikute reaktsiooniaegade vahel on juhuslikud 0.03% tõenäosusega, mistõttu hülgame 0-hüpoteesi ja võime väita, et 99.97% tõenäosusega on siin olulisi erinevusi. Kui on rohkem kui 2 rühma, siis ANOVA testi tulemus ütleb ainult seda, kui suur on tõenäosus, et kõik rühmad on sama populatsiooni juhuslikud valimid. See tähendab, et kui p<0.05, siis on vähemalt (aga mitte tingimata ainult) üks rühm, mis teistest oluliselt erineb. ANOVA testi tulemus ei osuta aga sellele, millise rühmad erinesid ja millised mitte.

Post-hoc test

Kui tahame teada milline/millised rühmad üksteisest erinesid, peame tegema post-hoc testi ja ANOVA testi juurde sobib hästi Tukey Honest Significant Differences test TukeyHSD(aov())

ANOVA testi tegemiseks on R-is mitu võimalust, üks mida enne kasutasime oli kombinatsioon anova(lm()). Sama tulemuse annab summary(aov()):

##             Df  Sum Sq Mean Sq F value  Pr(>F)    
## kj           5 2505404  501081   32.28 0.00029 ***
## Residuals    6   93147   15525                    
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1

Ja Tukey testi saame, kui summary() käsu asendame TukeyHSD() käsuga.

##   Tukey multiple comparisons of means
##     95% family-wise confidence level
## 
## Fit: aov(formula = raeg ~ kj, data = dat3)
## 
## $kj
##              diff         lwr       upr     p adj
## IT-HL -1227.36327 -1723.24193 -731.4846 0.0005042
## KA-HL -1163.13759 -1659.01625 -667.2589 0.0006815
## LP-HL -1048.73808 -1544.61673 -552.8594 0.0012103
## PT-HL  -853.30695 -1349.18561 -357.4283 0.0036818
## TT-HL  -310.13190  -806.01056  185.7468 0.2591656
## KA-IT    64.22568  -431.65298  560.1043 0.9933987
## LP-IT   178.62519  -317.25347  674.5038 0.7111282
## PT-IT   374.05632  -121.82234  869.9350 0.1461951
## TT-IT   917.23137   421.35271 1413.1100 0.0025071
## LP-KA   114.39951  -381.47914  610.2782 0.9280221
## PT-KA   309.83064  -186.04802  805.7093 0.2598551
## TT-KA   853.00569   357.12703 1348.8843 0.0036887
## PT-LP   195.43113  -300.44753  691.3098 0.6421630
## TT-LP   738.60618   242.72752 1234.4848 0.0077686
## TT-PT   543.17505    47.29639 1039.0537 0.0336997

Tukey test annab siis kõigi faktori taseme paaride võrdluse. Siit võib välja lugeda, et katseisikud HL ja TT vahel ei olnud olulist erinevust, aga nad erinesid kõigist teistest ja teised neli katseisiku jällegi ei olnud omavahel erinevad. Kuidas see jooniselt paistab?

5. Joonised

Siin peatükis vaatame üle R-i baasgraafika funktsioonid. Põhiline joonistamise käsk on plot(). Kasulike lisaargumente, mida jooniste endi manuaalist ei leia, leiab par() alt:

Loeme andmed failist altern_kys_andmed_Rkursus_puhas.txt:

Tulpdiagramm

Käsk barplot() tahab vektorit (või tabelit) tulpade kõrgustega. Seega kui soovid oma andmetest tulpdiagrammi näiteks keskmiste väärtustega, siis peaksid enne keskmised välja arvutama. Ja üldsegi, keskmiste väärtustega tulpdiagrammi asemel võiks pigem joonistada kast-ja-vurrud diagrammi (box and whiskers) käsuga boxplot().

Tulpdiagramm sobib hästi sagedustabeli visualiseerimiseks. Joonistame tulpdiagrammi alternatiivküsimuste testi vastuste sageduse kohta.

Horisontaalsete tulpadega. Argument horiz = T keerab tulbad horisontaalseks ning las=1 keerab telgede teksti. Käsk rev() keerab vektori tagurpidi, sest horisontaalse barploti elementide järjekord oleks muidu alt üles. Argument las kontrollib seda, mis pidi telgede skaala väärtused kirjutatakse. Vaikimisi on väärtus 0 ja suund paralleelne teljele, 1 keerab kõik horisontaalseks.

Pirukas

Piruka saab käsuga pie(). Aga piruka erinevust lõikude suuruste vahel on visuaalselt palju raskem hinnata kui erinevust tulpade kõrguste vahel, seepärast on soovitatav pirukaid mitte kasutada.

Tulpdiagramm mitme rĂĽhmaga

barplot() joonistab vektori iga elemendi kõrguse posti. Aga kui barplot()’i sisendiks anda tabel, joonistatakse iga tulba kohta post ja read on eristatud värvidega. Teeme alternatiivküsimuste katse andmestikust katseisikute vastuste sagedustabeli:

##     
##      HL IT KA LP PT TT
##   x1 28 16 32 10 15 20
##   x2 12 24  7 30 25 20

Ja nüüd joonistame tulpdiagrammi käsuga barplot():

Argument beside = T paigutab tabeli ridades olevad tulbad üksteise kõrvale; lisame ka legendi

Kui tahame joonisel rühmitada faktoreid teist pidi, siis tuleks tabelit keerata. Võib ära vahetada table() käsu argumentide järjekorra, aga võib ka objekti sagetabel keerata käsuga t().

Värvid

Barploti värvikood on vaikimisi halltoonides, aga argumendiga col saab anda oma värvikoodi. Värvinimetused peavad olema antud vektorina, millel on nii mitu elementi, kui mitu kategooriat on joonisel (või siis vastavalt kui on vähem, siis värve taaskasutatakse). Põhivärvid võib nimetada: c(“black”, “red”, “green,”blue“) jne, aga nagu eelmises näites, on põhivärvidel ka arvulised vasted: 1 =”black“, 2 =”red“, 3 =”green" jne.

Lisaks põhivärvinimedele võib värve nimetada ka hex kodeeringus, nt c(“#000000”, “#FF0000”, “#00FF00”, “#0000FF”) – mille vasted on must, punane, roheline, sinine…

Lisaks võib kasutada erinevaid värvitoonipalette, mille abil genereerida näiteks ühtaste vahedega halltoone, vikerkaaretoone jms. Näiteks kui meil on vaja 6 värvitooni joonisel olevate kastide eristamiseks, siis:

## [1] "#FF0000" "#FFFF00" "#00FF00" "#00FFFF" "#0000FF" "#FF00FF"

Ja sama joonis selle värviskeemiga:

Vaata ka terrain.colors(), heat.colors(), gray.colors(), rgb() jne.

Joonise salvestamine faili

RStudios on muidugi alati võimalik kasutada GUI käske, et joonis salvestada (all parempoolses aknakeses Plot sakil Export ja vastavalt Save as Image või Save as PDF). Nii on aga tüütu teha, kui mingil põhjusel peab joonisel midagi muutma ja uuesti salvestama, sest iga kord tuleb dialoogiaknas selle mõõtmed käsitsi määrata ja need ei pruugi meelde jääda. Pealegi GUI-st tuleb joonise salvestamiseks iga kord teha vähemalt 5 hiireklikki, aga kui joonise salvestamise käsud on skriptis kirjas, siis ei pea salvestamiseks täiendavaid liigutusi tegema :)

Käsurealt faili salvestades tuleks panna joonisele suunatud käskude ette käsk png(), pdf() või tiff() ja lõppu käsk dev.off(). Nii suunatakse joonistamise käsud otse faili, ekraanile pildiaknasse midagi ei ilmu. Esimeses, faili suunavas käsus on vaja ka täpsustada failinime ja mõõtmeid. Salvestame oma vikerkaarevärvilise tulpdiagrammi näiteks png-failiks.

Vaata nüüd oma töökataloogi, kas sinna tekkis fail nimega joonis1.png?

Kast-vurrud diagramm

Käsk boxplot() joonistab kasti ja vurrud ehk box and whiskers. Käsu sisendiks on üks arvuline tunnus y ja üks või mitu rühmitavat tunnust x. Joonis annab ülevaate arvulise tunnuse y jaotusest, seega sisendiks peaks olema kõik mõõtmispunktid, mitte üks keskmine väärtus. Joonis toob välja mediaani (keskmine paks joon), 25-75% kvartiilid (kasti alumine ja ülemine serv). Vurrud peaks tähistama usaldusvahemikku ja üksikud punktid hälbivaid väärtuseid, mis vurrude piiridest välja jäävad (outlier).

Kui me ei soovi hälbivaid väärtuseid näidata, siis argumendiga outline saab need ära keelata. y-telje ulatus määratakse andmete põhjal automaatselt nii, et kõik joonisele ära mahuks. Kui me aga teeme mitu joonist, mida oleks hea kõrvutada, siis võib-olla on tarvis skaalat ise määrata ja seda teeb argument ylim, mis tahab vektorit miinimumi ja maksimumi väärtustega. Vaikimisi antakse x ja y telje pealkirjadeks andmestiku vastavate vektorite nimetused, aga kui me tahame midagi muud, siis selleks on argumendid ylab ja xlab.

Rühmitavaid tunnuseid võib olla ka mitu, sel juhul on joonisel iga faktori tasemete kombinatsiooni kohta üks kast.

Kui meil on vaja teada ka arvulisi väärtusi, siis võime käsu suunata muutuja väärtuseks, nagu eelmises näites suunasime boxplot() käsu muutujasse nimega raeg_jaotus. Selle muutuja sisuks on list kõigi joonisel olevate asjade arvuliste väärtustega.

## $stats
##           [,1]     [,2]      [,3]     [,4]       [,5]      [,6]      [,7]
## [1,]  865.5325  942.605  84.54366 258.2635   96.55392  93.48872  312.9272
## [2,] 1141.1169 1401.635 361.33729 325.3178  318.63589 320.93480  577.1769
## [3,] 1237.3244 1842.178 485.60167 356.1257  393.58808 406.13952  690.3696
## [4,] 1886.1205 2313.237 809.87873 414.3765  623.47837 920.80307  766.8630
## [5,] 2336.7071 2985.806 899.63398 527.8735 1015.82439 969.84641 1043.6297
##           [,8]     [,9]     [,10]     [,11]     [,12]
## [1,]  198.8826 407.5322  343.6436  437.1691  356.2923
## [2,]  410.8213 647.6849  523.6583  824.4869  934.5913
## [3,]  515.5563 737.0006  652.8188 1233.7278 1521.9840
## [4,]  733.5093 868.4428  999.6426 1782.4885 1855.3898
## [5,] 1203.5703 886.6967 1439.1192 2503.4852 2402.4023
## 
## $n
##  [1] 28 12 16 24 31  7 10 30 15 25 20 20
## 
## $conf
##          [,1]     [,2]     [,3]     [,4]     [,5]      [,6]     [,7]     [,8]
## [1,] 1014.872 1426.390 308.4278 327.4028 307.0810  47.90786 595.5949 422.4714
## [2,] 1459.776 2257.965 662.7755 384.8486 480.0952 764.37117 785.1443 608.6412
##          [,9]    [,10]     [,11]    [,12]
## [1,] 646.9415 502.4078  895.2671 1196.667
## [2,] 827.0597 803.2299 1572.1886 1847.301
## 
## $out
##  [1] 3194.70651  757.41855   83.38553  603.38694  176.03611  854.46682
##  [7]  753.94415 1846.20410 1386.30240 1579.44592 2196.65542 1288.52463
## [13] 2196.65542
## 
## $group
##  [1]  1  4  4  4  4  4  4  5  8  9  9  9 10
## 
## $names
##  [1] "x1.HL" "x2.HL" "x1.IT" "x2.IT" "x1.KA" "x2.KA" "x1.LP" "x2.LP" "x1.PT"
## [10] "x2.PT" "x1.TT" "x2.TT"

Joonise väljale saab ka joonistada mitu joonist, kui käsu par() argumendiga mfcol või mfrow jagada see mitmeks ruuduks. Argumentide erinevus on see, et mfcol puhul täidetakse väli kõige pealt ülevalt alla, mfrow puhul vasakult paremale. Mõlemad argumendid tahavad vektorit kahe väärtusega: mitu rida, mitu tulpa. Paneme näiteks kaks joonist kõrvuti ühte ritta. boxplot()i argumendi subset abil võtame ühele joonisele x1 vastused ja teisele x2.

Proovime paneele katseisikute kaupa paigutada 2 tulpa ja 3 ritta, ja kuna see käsurida kordub, siis selle asemel, et boxploti käsku 6 korda korrata, teeme tsükli:

Joonisevälja jaotus kehtib seni, kuni see uuesti üle kirjutatakse, nii et kui tahame tagasi ühe joonise kaupa seadistuse juurde minna, tuleks kas mfcol() või mfrow() käsuga seada nii, et jooniseväli oleks jagatud üheks reaks ja üheks tulbaks:

x-y diagramm

Käsuga plot() saab joonistada punkt- või joondiagrammi (x-y diagramm, scatter plot), kus kummalgi teljel on arvuline tunnus.

Loeme afrikaatide andmestiku, kus leidub rohkem arvulisi tunnuseid.

Mälu värskenduseks vaatame andmestiku kokkuvõtet:

Vaatame joonisel, kuidas on omavahel seotud afrikaadi suluosa kestus (tulp t) ja frikatiivse osa kestus (tulp s).

Argument pch määrab sümboli, mida punktide moodustamiseks kasutatakse. Nagu värvidegagi, on põhisümbolitel arvulised vasted, eeldefineeritud väärtusi on 25:

Kui aga anda pch väärtuseks mingi tekstiline väärtus, siis kasutatakse sellest esimest tähemärki. Joonistame nüüd sama asja nii, et sümbol sõltub kõneleja soost ja punkti värv kvantiteedist.

Värvid on faktori tasemete järjestuses: “Q1” - must, “Q2” - punane, “Q3” roheline, “fort” - sinine, “len” - helesinine. Siit jooniselt on nüüd välja jäänud sõnaalgulised (positsioon == “C1”) afrikaadid, sest nendel on kvantiteedi tulbas väärtuseks NA ja sellise väärtusega värvi ei ole. Joonise põhjal tundub, et välte suurenedes pikeneb sulu (t) kestus, aga frikatiivse osa (s) kestus muutub vähem.

Käsuga abline() saab joonisele lisada sirgeid jooni, nt y-teljel jääb enamik väärtusi alla 75 (horisontaalne joon) ja x-teljel alla 125 (vertikaalne joon). Argument lty määrab joone tüübi ja siin on ka eeldefineeritud arvulised väärtused: 1 - pidevjoon, 2, katkendjoon, 3 - punktiir jne.

Samuti saababline() käsuga lisada lineaarse regressioonijoone:

See regressioonijoon põhineb lineaarsel regressioonimudelil, mille statistilist kokkuvõtet võime vaadata käsuga summary():

## 
## Call:
## lm(formula = s ~ t, data = afr)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -47.916 -20.697  -6.774  14.432 132.228 
## 
## Coefficients:
##             Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 37.08855    7.20960   5.144 1.19e-06 ***
## t            0.28539    0.08351   3.417  0.00089 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 29.3 on 109 degrees of freedom
##   (57 observations deleted due to missingness)
## Multiple R-squared:  0.09678,    Adjusted R-squared:  0.08849 
## F-statistic: 11.68 on 1 and 109 DF,  p-value: 0.0008897

Siit saame teada, et t ja s osade kestuste vahel on afrikaatide puhul õrn kuid statistiliselt oluline (viimasel real p<0.001) positiivne seos: kui t kasvab ühe millisekundi võrra, siis s kasvab 0.28 millisekundit (koefitsientide tabelis t efekti hinnatud suurus). Samas see seos on üsna nõrk, sest R-ruut (eelviimasel real) ütleb meile, et see mudel kirjeldab umbes 10% s kestuse varieerumisest, ehk et 90% osas sõltub s kestus muudest teguritest kui sellele eelneva sulu kestus.


Vajaduse korral saab joonise ka samm-sammult ĂĽles ehitada.

  • Kõigepealt teeme käsuga plot() tĂĽhja joonise põhja, kus määrame telgede ulatuse.
  • Argument type määrab, kas väärtused märgitakse punktidega (“p”), puntide ja neid ĂĽhendavate joontega (“b”), ainult joontega (“l”), või siis ei joonistata ĂĽldse midagi (“n”).
  • Argumendi axes = F korral ei lisata vasakule ja alla automaatselt telgi ega ka joonisevälja ĂĽmbritsevat kasti.
  • Käsk box() joonistab kasti.
  • Käsuga axis() saab ĂĽkshaaval telgi lisada. Argument side määrab, mis kĂĽljele (1 - alla, 2 - vasakule, 3 - ĂĽles, 4 - paremale). Argument at määrab väärtused, kuhu skaalajaotused trĂĽkitakse ja argument labels peaks andma at-iga sama pika vektorina teksti, mida määratud kohta kirjutatakse – nii saab näiteks teisendada ĂĽhikuid (nt joonisele kantavad väärtused sekundites, aga trĂĽkitav väärtus millisekundites vms). Argument tick määrab, kas teljele lisatakse kriipsukesed. Ja argument line abil saab määrata, kui kaugele joonisest telje väärtused kirjutatakse – nii saab kõrvuti panna mitu skaalat (nt pikkus tollides ja sentimeetrites vms).
  • Käsud lines() ja points() lisavad joonisele vastavalt jooni ja punkte, sama moodi nagu käsk plot(), selle erinevusega, et plot() tekitab uue joonise, aga need käsud lisavad väärtuseid olemasolevale põhjale.