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:
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.
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.
R Stuudio ekraan on jagatud 4 paneeliks:
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.
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:
Arvuta, mitu inimest istub arvutiklassi ĂĽhes reas keskmiselt.
Korruta saadud arv 3-ga ja jaga kahega ning võta saadud arvust ruutjuur.
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üü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.
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
Käsuga paste()
saab kokku kleepida teksti. Proovi omavahel kokku panna sõnad “tere” ja “hommikust”.
Vaata manuaalist, mis on paste()
käsu argumendi sep
vaikimisi väärtus. Kuidas saaks nii, et sõnad kleepuks kokku ilma tühikuta?
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 :)
Käsk nchar()
loeb kokku tähemärkide arvu. Proovi näiteks mitu tähemärki on sõnas “vastastikustatamatutagi”.
Anna muutujale sõnapikkused
väärtuseks vektor nädalapäevade nimede pikkustega.
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.
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.
Tee üks maatriks, kus on 5 tulpa väärtustega 1-20. Seda, kas vektor jagatakse ridade või tulpade kaupa, kontrollib argument byrow
.
Liida maatriksile arvud 1-5. Mis suunas tehe toimus?
Mis arvud on neljandas tulbas?
Mis väärtused on 3. reas tulpades 2 ja 5?
Anna maatriksi tulpadele ja ridadele ilusad sõnalised nimed kasutades käske rownames() ja colnames().
Mis on kõige ilusam tulba nimi, mis on kõige keskpärasem rea nimi? Kasuta neid nimesid, et leida väärtus vastavas lahtris.
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
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:
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.
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.
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õtehead()
, 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.
delfi_uudis <- scan("https://sport.delfi.ee/news/kergejoustik/mm2019/delfi-video-dohast-kirt-olen-medali-ule-aaretult-onnelik-kuid-selline-lopp-hooajale-ei-olnud-koige-meeldivam?id=87668473", what = character(), sep="\n")
head(delfi_uudis, 40)
## [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).
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."
Käsuga cat()
; olulised argumendid:
file
- failile antav nimi,sep
- tähemärk, mida kasutatakse vektori elementide eristajana tekstis.Tõmba Digarist alla Juhan Liivi kogutud teoste pdf: http://www.digar.ee/id/nlib-digar:277269
Loe see fail R-i.
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.
Salvesta luuletused tekstifailina.
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.
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).dec
.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 punktstringsAsFactors = T
.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"
# anname tulpadele natuke sisukamad nimed
colnames(dat)[3] <- "sĂĽnniaeg"
colnames(dat)[1:3] <- c("keelejuht", "sugu","synniaeg")
summary(dat)
## 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
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
##
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.
Loe r-i fail http://datadoi.ut.ee/bitstream/handle/33/51/Lippus_etal_JPhon2013_dataset.txt
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?
Tee uus objekt tabeli ridadest, kus “Quantity2” tulbas on “Q3vok”. Mis on keskmine väärtus “C1” tulbas?
Salvesta see alamosa uue CSV-failina töökataloogi.
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:
altern <- read.delim("altern_kys_andmed_Rkursus2.txt", encoding = "latin1", stringsAsFactors = T)
summary(altern)
## 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:
altern <- read.delim("altern_kys_andmed_Rkursus3.txt", encoding = "latin1", stringsAsFactors = T)
summary(altern)
## 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:
Tulbas altern on tärnid, neist oleks vaja lahti saada. Me võime väärtused üle kirjutada:
altern$altern[altern$altern=="*x1"] <- "x1"
altern$altern[altern$altern=="*x2"] <- "x2"
table(altern$kj, altern$altern)
##
## *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"
altern$altern <- factor(x = altern$altern, levels=c("x1", "x2"))
levels(altern$altern) # tasemed pärast
## [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
# margin = 1 ridade kaupa, margin = 2 tulpade kaupa
prop.table(table(altern$kj, altern$altern), margin = 1)
##
## 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
t()
keerab tabeli read tulpadekshist()
– histogrammplot()
, 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”)
subset()
ja indekseerimisega; vt ka which()
ja is.na()
mean()
median()
quantile()
sd()
rowSums
, colSums
, min
, max
…apply()
, tapply()
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.
minu_vektor <- NULL
for (i in c(1,2,3,4)){
temp <- i*i
temp2 <- log(temp)
minu_vektor[i] <- temp2
}
minu_vektor
## [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”.
Siin peatĂĽkis tegeleme probleemidega, kui meil on teksti sisaldav fail, millest tahame:
Käsud, mida põhiliselt vaja läheb:
scan()
; kui on pdf või docx, siis peab otsime mõne paketi, nt textreadr
tolower()
, strsplit()
+ unlist()
grep()
gsub()
table()
+ sort()
cat()
dir()
, for()
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
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.
sõnad <- c("tere", "tore", "võre",
"kolmkĂĽmmend kolm?", "1.234",
"televiisor", "Eile! Täna? Homme;",
"1234", "õä", "terehommikust",
"lõunaooteretsept")
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;"
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.
link <- "https://courses.cs.ut.ee/2015/eprogalused/fall/uploads/Main/anton_hansen_tammsaare_tode_ja_oigus_i.txt"
aht <- scan(file = link, what = character(), sep = "\n", encoding = "UTF-8")
head(aht)
## [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
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"
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 ..."
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.
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”.
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.
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
)
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 • • • > …
Järgmise sammuna jagame teksti sõnadeks, sest mõningaid asendusi on parem teha sõna kontekstis; kirjavahemärgid võiks olla “\.,-„’\?:!«»;”
karbes4 <- unlist(strsplit(gsub("[\\.,„'\\-\\?:!«»;\\\"]", "", karbes2), split = " "))
tail(sort(table(tolower(karbes4))), 40)
##
## 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"
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"
dir()
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:
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:
# 1. Anname failinime muutujale "fail"
fail <- "tamms_karbes.pdf"
# 2. loeme pdf-ist textreadr'i tabeli
tekst <- read_pdf(fail)
# 3. võtame tabelist 3. tulba, kus on tekst
tekst1 <- tekst[,3]
# 4. Muudame sõnas numbri 1 > l (o1i > oli)
tekst2 <- gsub("1([A-z])", "l\\1", tekst1)
# 5. Muudame sõnas numbri 0 > O (0li > Oli)
tekst3 <- gsub("0([A-z])", "O\\1", tekst2)
# 6. Laseme kogu teksti kokku ĂĽheks vektorielemendiks nii, et endiseid vektorielemente eristab reavahetus.
tekst4 <- paste(tekst3, collapse="\n")
# 7. eemaldame poolitusmärgid
tekst5 <- gsub("([[:alpha:]])\\-\\n *([[:alpha:]])", "\\1\\2", tekst4)
# 8 salvestame tekstifaili. Failinimes asendame gsub()-ga laiendi
cat(tekst5, file = gsub("\\.pdf", "\\.txt", fail), sep = "\n")
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.
failid <- dir(pattern = ".pdf")
for(fail in failid) {
tekst <- read_pdf(fail)
tekst1 <- tekst[,3]
tekst2 <- gsub("1([A-z])", "l\\1", tekst1)
tekst3 <- gsub("0([A-z])", "O\\1", tekst2)
tekst4 <- paste(tekst3, collapse="\n")
tekst5 <- gsub("([[:alpha:]])\\-\\n *([[:alpha:]])", "\\1\\2", tekst4)
cat(tekst5, file = gsub("\\.pdf", "\\.txt", fail), sep = "\n")
}
[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.
[[:punct:]] - kirjavahemärgid
{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 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!"
Skaalast sõltub see, millist statistikat saab andmetele rakendada. Üldiselt eristatakse nelja tüüpi skaalasid:
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.
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
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.
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:
median()
. Sümmeetrilise jaotuse korral võiks see kattuda ka aritmeetilise keskmisega.## 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.
par(mfrow=c(2,3))
plot(function(x)dunif(x, min=-3, max=3), -3,3, main="Ăśhtlane jaotus")
plot(function(x)dnorm(x), -3,3, main="Normaaljaotus")
plot(function(x)df(x,3,100), 0,4, main="AsĂĽmmeetriline")
plot(function(x)df(x,1,10)/3, 0.2,3, main="J-jaotus")
plot(function(x)(dnorm(x, mean=3, sd=1)+dnorm(x, mean=-3, sd=1))/2, -6,6, main="Kahetipuline jaotus")
plot(function(x)-dnorm(x), -3,3, main="U-jaotus")
Ü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 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
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%.
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.
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:
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.
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).
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.
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:
Anova testi jaoks sobib ainult viimane. Sellisel kujul olid andmed algselt objektis dat
, aga dat2
peaks nüüd ümber tõstma:
dat3 <- data.frame(rep(rownames(dat2), 2),
rep(colnames(dat2), each=6),
c(dat2[,1], dat2[,2]))
colnames(dat3) <- c("kj", "altern", "raeg")
dat3
## 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.
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.
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?
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
:
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.
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.
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()
.
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.
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.
png(file = "joonis1.png", width = 500, height = 350)
barplot(t(sagetabel), beside = T, legend.text=colnames(sagetabel), col= rainbow(6))
dev.off()
Vaata nüüd oma töökataloogi, kas sinna tekkis fail nimega joonis1.png?
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.
par(mfcol=c(1,2))
boxplot(raeg~kj, data=dat, subset= altern=="x1", outline = F, ylim = c(0,2500), ylab="Reaktsiooniaeg (millisekundites)", main="Vastusevariant x1")
boxplot(raeg~kj, data=dat, subset= altern=="x2", outline = F, ylim = c(0,2500), ylab="Reaktsiooniaeg (millisekundites)", main="Vastusevariant 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:
par(mfrow=c(3,2))
for(i in unique(dat$kj)){
boxplot(raeg~altern, data=dat, subset= kj==i, outline = F, ylim = c(0,2500), ylab="Reaktsiooniaeg (ms)", main=paste("Katseisik", i))
}
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:
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.
# sätime faktori kvantiteet tasemete järjekorda:
afr$kvantiteet <- factor(afr$kvantiteet, levels=c("Q1","Q2","Q3","fort","len"))
plot(s ~ t, data = afr, pch=as.character(sugu), col=kvantiteet)
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.
plot(s ~ t, data = afr, pch=as.character(sugu), col=kvantiteet)
abline(h=75, lty=2)
abline(v=125, lty=2)
Samuti saababline()
käsuga lisada lineaarse regressioonijoone:
plot(s ~ t, data = afr, pch=as.character(sugu), col=kvantiteet)
abline(lm(s~t, data=afr), col="red")
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.
plot()
tühja joonise põhja, kus määrame telgede ulatuse.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”).axes = F
korral ei lisata vasakule ja alla automaatselt telgi ega ka joonisevälja ümbritsevat kasti.box()
joonistab kasti.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).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.plot(1, type="n", ylim=c(0, 200), xlim=c(0,200), axes = F, ylab = "Sulu kestus", xlab = "Friktsiooni kestus")
box()
axis(side=1, las = 1, at=c(50, 100, 150, 200))
axis(side=2, las = 1, at=c(50, 100, 150, 200))
axis(side = 1, at=quantile(afr$t[afr$haalik=="afr"], na.rm=T, probs = c(0.25,0.75)), labels = c("1. kvantiil","3. kvantiil"), tick = F, line = 1, cex.axis=0.7)
for (i in c("Q1","Q2","Q3")) {
points(s~t, data=afr, subset=haalik == "afr" & kvantiteet==i, pch = 16, col=kvantiteet)
}
abline(lm(s~t, data=afr, subset=haalik == "afr"), lty=2)
R-i graafikaga saab tegelikult joonistada abstraktseid kujundeid, mis ei pea tingimata mingist andmestikust lähtuma. Et seda mõtet illustreerida, joonistame ühe tähekese.
plot(x=c(0,-1,-4,-2,-2.5,0,2.5,2,4,1,0), y=c(4,1,1,-1,-4,-2,-4,-1,1,1,4), ylim=c(-5,5), xlim=c(-5,5), pch=as.character(1:10), ylab="",xlab="") # pch määrab punkti sümboli, tähemärgina kasutab stringi esimest tähte
grid()
lines(x=c(0,-1,-4,-2,-2.5,0,2.5,2,4,1,0), y=c(4,1,1,-1,-4,-2,-4,-1,1,1,4), lty=2) # ĂĽhendame punktid joonega
Teeme muutujad x-y telje väärtused tähekese joonistamiseks, et ei peaks iga kord sama vektorit sisestama.
Käsk text() kirjutab teksti joonisele x-y koordinaatidega
plot(1, ylim=c(-5,5), xlim=c(-5,5), type="n", axes=T, ylab="",xlab="")
grid()
text(x=x, y=y, labels=paste(x,y, sep=";"))
lines(x,y, type="b", pch=" ")# kui joonistada ainult jooned (type="l"), on jooned ĂĽhendatud, "b" puhul on katkestatud punktidega ja "p" joonistab ainult punktid ilma joonteta (sama, mis points() vaikimisi teeks)
Käsk polygon() joonistab hulknurga, mida on võimalik täita mingi värviga. Näiteks punane täheke valgel taustal: