1 Sissejuhatus

R on programmeerimiskeel ja vabavaraline arenduskeskkond, mis on mõeldud eelkõige andmete töötluseks, analüüsiks ja visualiseerimiseks. Suhtlus R-iga käib koodirea kaudu, mis võib olenevalt taustast olla juba tuttav või veel võõras viis andmetöötluseks. See õppetükk annab alused lihtsamaks andmetöötluseks R-is: kuidas lugeda salvestatud andmeid, kuidas leida andmestikust meile vajalik osa, kuidas luua uusi muutujaid ja kuidas ühendada informatsiooni mitmest tabelist.

See õppetükk annab sissejuhatuse lihtsamale andmetöötlusele R-is tidyverse stiilis. Tidyverse on pakettide kogu R-is, mis on püüdnud hõlbustada levinud andmetöötlusviiside mõistmist ja õppimist. Tidyverse on ka R-i maailmas võrdlemisi uus - esimesed õpikud ilmusid 2017 aastal - mistõttu ei pruugi ka kogenud R-i kasutajad seda tunda. Praeguseks on tidyverse paketid saanud üsna populaarseks ning kogunud enda ümber tugeva kogukonna, mis ka aitab kaasa pakettide pidevale täiendamisele. R-i õppimist võib alustada kohe tidyverse-ist (ja mõnde õpetajad seda soovitavadki), aga tidyverse stiil ei pruugi olla sissejuhatavas kursuses kaetudki. R-i igapäevasel kasutamisel on kasulik tunda just erinevaid stiile.

See õppetükk võiks sobida nii uustulnukale, kes proovib R-i esimest korda, kui kogenud R-i kasutajale, kes soovib näha, kuidas käib andmetöötlus teises R-i “murdes”. Õppetükk on kujundatud lähtudes sotsiaalteadlaste huvidest ning eeldab mõningast arusaamist sellest, mis on andmed ja mida nendega teha saab. Õppetükk on sündinud seminarimaterjalide kohandusena ning igasugune tagasiside materjalide sisu ja toimeviisi kohta nii e-õppe vormis kui üldiselt on tagasiside väga oodatud. Jõudu algajatele ja edasijõudnutele!

1.1 Miks R?

R-i eeliseks ja omapäraks Exceli ja SPSSiga võrreldes on see, et suhtlus arvutiga käib eelkõige koodirea kaudu. Terve analüüsi saab siis salvestada faili või failide komplektina, mille uuestikäivitamisel teeb analüüs kõik vajalikud protsessid läbi. Selle tulemusena dokumenteerib analüüsiprotsess ennast ise ning tagab, et mõni teine uurija tulevikus või autor ise saab kergesti analüüsikäigu taastada. Seeläbi võimaldab R analüüsi, mis on

  • läbipaistev
  • paindlik
  • reprodutseeritav

Räägitakse, et ühe uurija kõige olulisem kaastööline on tema ise kuue kuu eest (kes esimese analüüsi teostas). Tema aga ei vasta enam kirjadele. Kui analüüs tervikuna on salvestatud skriptifailis, mis on kenasti kommenteeritud ja suudab analüüsi iga hetk taastada, ei pruugi olla enam vajalik püüda meenutada kogu protsessi. Kui nüüd selgub, et mõnes punktis oli viga või mõne sammu jaoks on ilmnenud parem viis analüüsi teostada või on tekkinud ligipääs uutele andmetele, on kerge kohendada paari vajaliku kohta koodis ning jooksutada analüüs uuesti. Ilma lisavaevata tekib sel juhul ka võimalus, et teised uurijad saavad analüüsi kontrollida ning sellele edaspidi toetuda, millest võidab ka teadus üldiselt.

Oluline R-i juures on ka see, et R ise ja kõik tema paketid on läbinisti avatud ning täiendatavad, mistõttu on enamike levinud funktsioonide jaoks loodud hulk abipakette, mis lihtsustavad analüüsi tegemist ning võimaldavad teha täpselt seda, mida vaja. Enamik probleeme on tulnud ette tihti ka teistel ning ka paljude nišiteemadega on mõned uurijad paketid ette valmist teinud. Siin õppetükis vaatame just levinud kasutusjuhtumeid, mis sotsiaalteadlaselt ette võivad tulla.

1.2 Tidyverse

Tidyverse on pakettide komplekt R-is, mis püüab järgida ühist filosoofiat ja grammatikat algoritmide loomisel, eelkõige literate programming loogikat. Seeläbi on tidyverse-ile kõige tähtsam

  • lihtne ja loetav kood
  • operatsioonide ja andmestruktuuride ühilduvus
  • kerge ja kiire õpiteekond

Tidyverse jätab meelega kõrvale olulise osa R-i põhisüntaksist, eesmärgiga hõlbustada just peamisi andmetöötluse samme. Tidyverse paketid ei pruugi olla kõige efektiivsemad masinale ning samuti ei saa nendega teha kõike - üldjuhul aga saab nendega hakkama. Tidyverse-il on aktiivne toetav kogukond ja pakette arendatakse aktiivselt edasi ja juurde. Peamised paketid tidyverse-is on ggplot2, dplyr, tidyr, readr, purrr, tibble, stringr ja forcats.

Tidyverse on ka R-i maailmas võrdlemisi uus - esimesed õpikud ilmusid ehk 2017 aastal - mistõttu ei pruugi ka kogenud R-i kasutajad seda tunda. Mitmed kogenumad kasutajad “kolivad” aga ka ümber tidyverse pakettidesse, aga arvamusi on muidugi erinevaid. All on väike näidis ühest andmetöötlusest R-is, kus ülemised kaks varianti kasutavad käske nii nagu neid varem R-is kasutati ja alumine kasutab käske nii nagu tidyverse uuendused seda lubavad.

Idee järgi võiks olla viimane neist veidi kergem silmale lugeda ja valmis kirjutada, aga eks siin on igaühe oma silm kuningas. See lühikoolitus annab maitse tidyverse andmetöötlusest R-is, mis võiks anda piisava sissevaate nii kogenud kui algajale R-i kasutajale, mille põhjal saab hakata ise materjale edasi otsima.

2 Mis on R? Mis on RStudio?

R on programmeerimiskeel ja vabavaraline arenduskeskkond, mis on mõeldud eelkõige andmete töötluseks, analüüsiks ja visuaalseks kuvamiseks. RStudio on abivahend, mis hõlbustab ja toetab R-i kasutamist sedavõrd, et võiks arvata, et tegemist on juba uue keskkonnaga. RStudio töötab hästi tavalises isiklikus arvutis (Windows, Mac, Linux jne), aga seda on võimalik kasutada ka läbi interneti.

2.1 Installimine

Isiklikule arvutile installige kõigepealt R (viimane versioon on ok) ja seejärel RStudio (viimane versioon on ok). Installimiseks antakse täpsed ja uusimad juhised järgnevatel lehtedel.

  1. Installige R: https://cran.rstudio.com/
  1. Installige RStudio: https://www.rstudio.com/products/rstudio/download/

2.2 Rstudio Cloud

Ilma installimata on võimalik kasutada ka RStudio Cloudi: https://rstudio.cloud/. Tehke endale kasutaja ‘sign up’ kaudu ning logige sisse. Iga oma RStudio töö jaoks võib siis teha eraldi projekti.

2.3 Materjalide avamine

Materjalid on jagatud eraldi .zip failis, mis tuleb alla laadida. Selle avamiseks RStudios on mitmeid võimalusi.

2.3.1 Isiklikus arvutis

Isiklikus arvutis pakkige kõigepealt failid lahti (extract). Kui klikkida selle peale Windowsis, siis mõnikord avab ta faile üksikuna .zipi sees, mis siin ei toimi.

Kui failid on avatud ja RStudio installitud, võib lihtsalt klikkida .Rproj failile. See avab RStudio õigest kohast nii, et kõik on juba seadistatud. Projektifaili võib avada ka RStudios vajutades kõigepealt paremal ülal nurgas olevale “Project: (None)” tekstile. Ja sealt Open project ja suunata see Rproj failile. Projektifaili kasutamine seab paika ka töökataloogi.

Kui projektifaili mitte kasutada, on oluline seadistada töökataloog. Selle jaoks vajutage alumise parempoolse kasti juures, kus on failid (veenduge, et Files sälk oleks valitud) ülal paremal kolme punktiga tähistatud kohale. Seejärel avaneb aken, kus liikuda õigesse kohta.

Kui olete lahtipakitud kataloogis, siis valige ülalt sinise hammasratta kõrvalt More ja Set As Working Directory. See käivitab konsoolis ka esimese käsu setwd(), mis seab kataloogi paika. Edaspidi saab kopeerida selle käsu näiteks faili algusesse, et saada kohe õigesse kohta. Töökataloogi on võimalik kontrollida käsuga getwd().

2.3.2 Pilves

Materjalide avamiseks RStudio Cloud-is tuleks kõigepealt luua projekt oma kasutajanime all. Ning projektis on näha sarnane koht failidega. Seal valida koht Upload - kus saab valida terve .zip faili, mis siis seal lahti pakitakse. Võib kasutada ka RStudiot pilves

2.4 RStudio tutvustus

RStudio vaade on tüüpiliselt selline nagu ülal näha. Akende asukohti saab muuta ja nende suhtelisi suurusi saab muuta, aga alguses on neid hea hoida paiga.

  • Vasakul-ülal on skriptiaken;
  • paremal-ülal on muutujad ja käskude ajalugu;
  • vasakul-all on konsool, kus jookseb kood;
  • paremal-all on failid, graafikud ja abi.

2.5 Stiilisoovitus

Veel üks stiilisoovitus. Lülitada sisse word-wrap ehk soft-wrap Selleks leia menüüst järgmine koht: Tools -> Global options -> Code -> Editing -> Soft-wrap R source files (lülita see sisse)

3 R-i alused

3.1 R ja käsud

Suhtlus R-iga käib käskude kaudu. Sisestades R-is käsu ja vajutades ENTERit püüab R selle tulemust välja arvutada ja salvestada kui selleks on juhised antud. Skriptid koondavad kokku hulga käske, mida võib järgemööda käivitada. Skriptidesse on hea käske koondada, kuna siis võib kunagi hiljem töötluskäigu täpselt taastada, seda võib kergesti parandada ja see töötab ka kellegi teise arvutis.

Skriptifaile koostatakse üldiselt niimoodi, et kui otsast käske käivitada, siis jookseb skript kenasti lõpuni. Sellest tuleb ka pöidlareegel, et kui mõnes salvestatud skriptifailis mõni varemsalvestatud käsk ei tööta, võib proovida faili algusest peale kõik uuesti läbi teha ja vaadata, kas viga on ikka olemas. Kui on, siis võib olla probleem salvestatud skriptis.

R-is saab salvestada skripte lihtsas skriptifailis, millel on .R lõpp või siis Rmarkdown failis, millel on .Rmd lõpp. Rmarkdown on lisamoodul R-is mis aitab teksti ja koodi hoida samas failis.

Nii .R kui .Rmd failis või RStudio kaudu käske käivitada ühekaupa. Üldiselt on käsk ühe rea peal, ning selle käivitamiseks tuleb viia oma tekstikursor sellele reale ja vajutada Windowsis ja Linuxis CTRL+ENTER, Mac-is CMD+ENTER. Sama käsk on ka RStudios ülal Run all Run -> Run selected line(s). Tekstikursoriga saab valida ka mitu rida või osa ühest või mitmest reast ja kui osa teksti on valitud, siis käivitab R ainult selle. Käsu jooksutamiseks konsooliaknas (RStudios all vasakul) kasutage lihtsalt ENTER.

Peaaegu kõikide käskude puhul on võimalik lisada käsu ette küsimärk, mille käivitamisel ilmub paremalle alla nurka selle käsu kasutusjuhend.

?read.csv

3.2 R lihtsa kalkulaatorina

Näiteks võib lasta tal arvutada lihtsamat matemaatikat. Näiteks võime käsuks anda lihtsalt 5+7 ja R käivitab selle ning trükib välja tulemuse.

5 + 7
## [1] 12

Tulemus on näha ülal. Kui käivitad käsu RStudios, jõuab tulemus konsooli. 5 ja 7 olid sisendnumbrid ja + oli operatsioon, mille R tegi, mis antud juhul tähendas liitmist. R-is saab ka teha teisi tehteid.

1+1
## [1] 2
4-2
## [1] 2
4*2
## [1] 8
27*17
## [1] 459
459/17
## [1] 27
sqrt(25)
## [1] 5

Tärn tähistab kordusmärki ja kaldkriips jagamist. sqrt() võtab ruutjuure sellest numbrist. Viimane ongi tüüpiline viis R-ile käske anda

funktsioon(sisend)

Tidyverse-s on selle kõrval teine tava.

andmed %>% 
    funktsioon()

Nad mõlemad teevad täpselt sama asja, lihtsal Tidyverse-i võtab vaikimisi sissesöödetud andmed funktsiooni sisendiks. Sellest rohkem peagi.

3.3 Tulemuste salvestamine

Kui R-i võib kasutada lihtsa kalkulaatorina, siis selle jõud tuleb välja siis kui tuleb mingit andmehulka või tehteid korduvalt kasutada. Selle jaoks on võimalik nii andmeid kui funktsioone R-is kergesti salvestada.

Tavaliselt kasutatakse salvestamiseks noolt <-, mis on koostatud väiksem-kui märgist ja sidekriipsust. Üksikut võrdusmärki = saab aga kasutada enamasti samas tähenduses. Seda märki saab teha ka vajutades korraga alla ALT + - ehk ALT + miinusmärk. Tähele tuleb panna, et üksik võrdusmärk = ja topelt võrdusmärk == on R-is erinevas tähenduses.

Me võime alustuseks teha muutuja x, mille sisuks on 5 + 7. Selleks kirjuta x <- 5 + 7."

x <- 5 + 7

Kui R salvestab tulemuse muutujasse, ei trüki ta seda enam välja. Seda seepärast, et ta salvestamise juures eeldab, et me soovime sellega midagi veel teha. Et vaadata muutuja sisu, trükime selle lihtsalt sisse.

x
## [1] 12

Me võime muutujat omakorda kasutada uue muutuja loomiseks. Näiteks loome muutuja y, mis koosneb x-st ja 3-st. R otsib üles x-i väärtuse ja kasutab seda y-i arvutamiseks. Kui x poleks määratud, siis R sellist y-it vastu ei võtaks.

y <- x - 3

Me võime vaadata y-i väärtust nüüd samamoodi.

y
## [1] 9

Seejuures kui me nüüd muudame x-i tagantjärele, siis y enam ei muutu. Muudame x-i neljaks ja vaatame, et y-i väärtus säilib ikka.

x <- 4
y
## [1] 9

X-i saab määrata nii noole <- kui ka võrdusmärgi = abil. Järgmised operatsioonid on võrdsed.

x <- 4
x =  4

3.4 Tehete järjekord

Muutujate tegemisel on oluline operatsioonide järjekord. Samamoodi nagu matemaatikas tehete järjekorra määramiseks, saame järjekorda R-is määrata sulgude kaudu. Näiteks tavamatemaatikaga sarnaselt on järgmised kaks tehet erinevad.

z <- x+y*2
z
## [1] 22
z <- (x+y)*2
z
## [1] 26

3.5 Võrdused ja võrratused

Väga sagedasti on meil andmetöötlusel vaja kahte väärtust võrrelda. Näiteks leida kõik inimesed, kes on vanemad kui 60 või siis kõik andmed, mis pärinevad 2010 jaanuarikuust. Selleks on R-is kasutusel hulk viise kontrollida samasust ja erinevust.

Kaks võrdusmärki == kontrollib, kas kaks objekti on täpselt võrdsed ja vastab sellele, kas TRUE või FALSE ehk kas tõene või väär. Koodi kirjutades võib TRUE ja FALSE lühendada vastavalt T ja F.

1==1
## [1] TRUE
1==2
## [1] FALSE
x==4
## [1] TRUE
x==y
## [1] FALSE
x==y*2
## [1] FALSE

Eitust märgitakse nendes kontrollides hüüumärgiga !. Võrdsusetuse kontrollimiseks võime kasutada märki hüüumärki koos võrdusmägiga != või asetada hüüumärgi ! kontrolllause ette. Kõik järgnevad laused kontrollivad hüüumärgi kaudu ühenduse eitust.

1!=1
## [1] FALSE
1!=2
## [1] TRUE
!1==1
## [1] FALSE
!1==2
## [1] TRUE

Lisaks võrdsusele saame numbrite puhul kontrollida ka kas esimene number on väiksem kui <, suurem kui >, väiksem/võrdne <= või suurem/võrdne >= teisest numbrist.

1 < 1
## [1] FALSE
2 > 1
## [1] TRUE
1 <= 1
## [1] TRUE
2 >= 2
## [1] TRUE

3.6 Muutujate nimed ja tekst

R-is töödeldakse lisaks numbritele ka teksti. Et mitte segamini ajada muutujate nimesid ja teksti, peab tekst olema alati jutumärkides. Kui me kirjutame x või y ilma jutumärkideta, otsib R üles need muutujad ja väljastab nende väärtuse. Kui me tahame, et R mõistaks x-i ja y-it tekstina, peame need ümbritsema jutumärkidega, kas ühekordsete (‘näidis’) või kahekordsetega (“näidis”)."

x
## [1] 4
y
## [1] 9
'x'
## [1] "x"
"y"
## [1] "y"

Seni kuni ta on tekstijupi sees on ta ükskõik kui pikk, võib sisaldada tühikuid ja muid märke.

"Siin on kirjutatud lause ühe tekstielemendina."
## [1] "Siin on kirjutatud lause ühe tekstielemendina."

Ja sellegi saame me salvestada samamoodi.

a <- "Siin on kirjutatud lause ühe tekstielemendina."

Seejuures võib muutujate nimeks olla peaaegu ükskõik mis. Muutuja ei või ainult alata numbriga, sisaldada tühikuid sidekriipse, kooloneid, trelle ja muud, millel on R-i algsüntaksis juba tähendus. Muutuja võib kasutada suuri ja väikseid tähti. Näiteks võime teha muutuja kuuliLennuTeeTunneliLuuk.

kuuliLennuTeeTunneliLuuk <- "Siin on kirjutatud lause ühe tekstielemendina."

Üldiselt on ka soovitus, et muutujate nimed võiksid olla pigem informatiivsed kui a, b ja c, kuna kuue kuu pärast ei mäleta enam keegi, mis see a täpselt oli, ilma hoolikalt koodi lugemata.

Kui me aga unustame tekstielemendi ümber jutumärgid, siis annab R meile veateate. Ta ei leia sellist objekti üles.

tundmatumuutujanimi
# Error: object 'tundmatumuutujanimi' not found.

Selliseid veateateid annab R üldse kui kuskil on koodis viga ning R ei suuda seda käivitada. Tihti tuleb ette, et kuskil on sulud vales kohas või sulgemata ja R arvab, et miski peaks olema objekt kuigi see on mõeldud funktsioonina. Kui oma silm kohe viga ei leia, tasub panna veateade google-isse. Kuna sarnased probleemid tulevad teistelgi sagedasti ette, siis on tihti seal esimese vastusena lahendus olemas.

3.7 Jadad

Tavaliselt töötab R rohkem kui ühe väärtusega korraga kasutades jadasid ehk vektoreid. Jadasid võib teha näiteks numbritest või tekstijuppidest, aga näiteks ka tabelitest (nendest siin õppetükis ei räägi).

Selleks on kaks lihtsamat võimalust. Kooloniga : saab teha numbrijärjendi ja c() funktsiooniga saab teha järjendi numbritest või tekstielementidest. Sarnaseid funktsioone on veel, nt seq() või rep(), mida saate ise edasi uurida. Näiteks all on jadad 1 kuni 10 ja a, b, c.

1:10
##  [1]  1  2  3  4  5  6  7  8  9 10
c("a","b","c")
## [1] "a" "b" "c"

Ka c()-ga võib teha jadasid, samuti võib sinna panna muutujate nimesid. Kui jada sisaldab vähemalt ühte tekstielementi, teeb ta ka kõik numbrid tekstiks. Jad elemendiks võib olla ka teine jada, c() käsk seab nad kõik samale tasapinnale

x <- 4

c("a", 1, x)
## [1] "a" "1" "4"
c(1, 4, 8)
## [1] 1 4 8
c(1:8, 2, 4)
##  [1] 1 2 3 4 5 6 7 8 2 4
c(4, 6, c(1, 2, 3))
## [1] 4 6 1 2 3

Et kontrollida, kas miski element on olemas jadas, kasutatakse käsku %in%. %in% kontrollib, kas esimest elementi leidub teises

1 %in% 1:10
## [1] TRUE

Samaaegselt võib kontrollida ka mitut elementi ühes jadas. Järgmine kontrollib, millised elemendid jadast 2 kuni 10 on ühtlasi jadas 1 kuni 5

2:10 %in% 1:5
## [1]  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE

Sama võib teha ka tekstijadaga.

c("a","b","c","f") %in% c("a","b","c","d","e")
## [1]  TRUE  TRUE  TRUE FALSE

Ka %in% märki saab kombineerida hüüumärgiga.

!2:10 %in% 1:2
## [1] FALSE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE  TRUE

Vektoreid saab samamoodi salvestada nagu muid R-i objekte

numbrivektor <- 1:10
numbrivektor
##  [1]  1  2  3  4  5  6  7  8  9 10
tekstivektor <- c("a", "b", "c", "d","e","f","g","h","i","j")
tekstivektor
##  [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j"

Lisaks numbritele ja tekstidele on R-is veel üks oluline vektoritüüp, faktor. Faktorid on kategoorilised muutujad, kus väike hulk tüüpe, mis korduvad.

faktor <- factor(c("a","a","a","a","a","b","b","b","b","b"))
faktor
##  [1] a a a a a b b b b b
## Levels: a b

Näiteks ülal on siis 10 elemendi pikkune faktor, kus on kaks tüüpi a ja b. Faktoril on niisiis lisaks jadale oluliseks selle tasandid levels().

levels(faktor)
## [1] "a" "b"

Tasandeid saab ümber nimetada, muutes neid kogu jada ulatuses.

levels(faktor) <-c("naine","mees")
faktor
##  [1] naine naine naine naine naine mees  mees  mees  mees  mees 
## Levels: naine mees

Ning tasandite järjestust saab muuta. Tasandite järjestuse muutmine ei muuda jada ennast. Tüüp a jääb a-ks ja tüüp b jääb b-ks.

faktor <-factor(faktor,levels=c("mees","naine"))
faktor
##  [1] naine naine naine naine naine mees  mees  mees  mees  mees 
## Levels: mees naine

Tasandite järjestus mängib olulist rolli mudelite ja graafikute loomisel.

Tähelepanelikult tuleb jälgida, et numbermuutujad ei oleks mõistetud R-i poolt kui faktorid, kuna kasutades numbritele mõeldud operatsioone, kohaldab R kõikidele andmepunktidele selle faktori väärtust. Faktorite järjestus on tihti tähestiku või ilmumise järjekorras. Näiteks kui me teeme kasutatud faktori numbriteks, on need järjest 1 ja 2.

as.numeric(faktor)
##  [1] 2 2 2 2 2 1 1 1 1 1

Kui me aga teeme uue faktori, kus on nii numbrid kui tähed selle tasanditeks, siis selle tegemine numbriteks ajab ka numbrijärje sassi. Tähelepanu tuleb osutada eriti kui mõnikord on mõne numbri asemel tabelis tekst või on puuduv väärtus märgitud mõne tähemärgiga.

faktor2 <-factor(c(5,7,4,"a","u","b"))
faktor2
## [1] 5 7 4 a u b
## Levels: 4 5 7 a b u
as.numeric(faktor2)
## [1] 2 3 1 4 6 5

Õiged numbrid saab kätte muundades faktori enne tähtedeks ja siis numbriteks.

as.numeric(as.character(faktor2))
## Warning: NAs introduced by coercion
## [1]  5  7  4 NA NA NA

R-i vanemad paketid on enamasti seatud nii, et tekstitulp loetakse vaikimisi sisse faktorina. Faktorite vale ümbertõlgendamine on viinud ka mitmete vigadeni avaldatud teaudstöödes. Tidyverse paketid andmete sisselugemisel enam faktoreid vaikimisi ei lisa. Põhipaketis failide sissemuutmisel tasub silmas pidada parameetrit stringsAsFactors.

3.8 R paketid

Lisaks põhikäskudele on R-is hulk lisapakette, mis avavad uusi kasutusvõimalusi ning teevad olemasolevaid võimalusi mugavamaks. Praeguse õppetüki fookuses olev tidyverse on pakettide komplekt, mis püüab teha mõlemat.

Iga paketi puhul tuleb see R-is esiteks 1) arvutisse installida ja teiseks 2) iga kord R-i või RStudiot käivitades sisse lülitada.

Paketi installimiseks on olemas käsk install.packages(). Sama käsu leiab ka ülalt menüüst Tools -> Install Packages… alt, kus saab kirjutada endale soovitavad paketid komadega eraldatult sisse. RStudio pakub ka kirjutamise ajal välja, mis paketid need võiksid olla. Uuemates RStudio versioonides on ka mõnikord skriptiakna kohal teade, et teatud paketid on installimata, kas soovite neid installida. Kui vajutada seal install, siis käivitab R sama install.packages() protsessi.

Installime kõigepealt oma arvutisse tidyverse paketid. See võtab natuke aega, las arvuti töötab. Konsoolis näidatakse installikäiku, seal võib olla punast teksti ja hoiatusi, aga kui lõpuks on teade “* DONE (tidyverse)”, on kõik hästi. RStudios hakkab installimise ajal vilkuma punane stopnupp konsooli ülal-paremal otsas. Ärge sinna vajutage. Kui vajutate võib installimine katki minna. Kui see millegipärast on juhtunud, siis enamasti aitab remove.packages() samadele pakettidele ja siis uuesti proovida.

install.packages("tidyverse")

Paketi sisselugemiseks kasutame funktsiooni library(). Peaaegu samaväärne funktsioon on require() kui mõnikord skriptides on just seda kasutatud. Loeme kõigepealt sisse library(tidyverse).

library(tidyverse)
## ── Attaching packages ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
## ✓ ggplot2 3.2.1     ✓ purrr   0.3.3
## ✓ tibble  2.1.3     ✓ dplyr   0.8.4
## ✓ tidyr   1.0.2     ✓ stringr 1.4.0
## ✓ readr   1.3.1     ✓ forcats 0.4.0
## ── Conflicts ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
## x dplyr::filter() masks stats::filter()
## x dplyr::lag()    masks stats::lag()

Tidyverse käivitamisel võiks teie isiklikus arvutis näha midagi sellist. Ta näitab seal ka paari konflikti, aga nende pärast ei pea praegu muretsema. Neid tuleb teinekord ette kui uues paketis on mõni käsk sama nimega kui mõnes teises sisselaetud paketis. Sellisel juhul arvab R, et viimasena laetud funktsioon on õigeim.

Väljatrükitust on näha, et R-i on sisselaetud paketid ggplot2, purr, tibble, dplyr, tidyr, stringr, readr ja forcats. Enamik pakette loevad sisse iseenda + enda töötamiseks vajalikud abipaketid (mida võib olla terve hulk). Tidyverse on üks väheseid pakette, mis loeb terve komplekti, mistõttu teised paketid võivad näidata teistlaadi teateid või, tavapäraselt, ei näitagi mingeid teateid. Senikaua kuni R veateadet ei näita library() käsu puhul, peaks olema kõik hästi.

Lisamärkusena. Pakette on võimalik kasutada kahel viisil. Arvutisse varem installitud paketi võib sisse lugeda library() käsuga, aga ükskõik mis paketiga installitud käsku võib käivitada käsuga pakett::käsk(). Näiteks kasutame paketi skimr käsku skim(), et saada loetud paketist ülevaadet.

# read_csv() on juba aktiveeritud tidyverse paketiga
gapminder <- read_csv("data/gapminder.csv")
## Parsed with column specification:
## cols(
##   country = col_character(),
##   continent = col_character(),
##   year = col_double(),
##   lifeExp = col_double(),
##   pop = col_double(),
##   gdpPercap = col_double()
## )
# skim() käsk on skimr paketis, mis ei veel tervenisti aktiveeritud
gapminder %>% 
  skimr::skim()
Data summary
Name Piped data
Number of rows 1704
Number of columns 6
_______________________
Column type frequency:
character 2
numeric 4
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
country 0 1 4 24 0 142 0
continent 0 1 4 8 0 5 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
year 0 1 1979.50 17.27 1952.00 1965.75 1979.50 1993.25 2007.0 ▇▅▅▅▇
lifeExp 0 1 59.47 12.92 23.60 48.20 60.71 70.85 82.6 ▁▆▇▇▇
pop 0 1 29601212.32 106157896.74 60011.00 2793664.00 7023595.50 19585221.75 1318683096.0 ▇▁▁▁▁
gdpPercap 0 1 7215.33 9857.45 241.17 1202.06 3531.85 9325.46 113523.1 ▇▁▁▁▁

Sellisel juhul ei ole vajalik, et pakett oleks aktiveeritud, küll aga peab see pakett arvutis installitud olema. Algajal kasutajl on soovitav vajalikud paketid igal juhul aktiveerida. Selles õppetükis on kasutatud pakett::käsk() käsustruktuuri iga kord kui käsk ei ole tidyverse põhipakettides.

4 Töö andmetega

4.1 Tidy andmeloogika

Tidy andmeloogika on välja kasvanud tähelepanekust, et äärmiselt suur osa tööst uurimisprojektis võib kuluda andmete puhastamisele ja analüüsiks ettevalmistamisele. Selle ettepanek on üpris lihtne, et iga rida peaks olema vaatlus, iga tulp tunnus ning iga väli vastav väärtus. See võib tunduda endast mõistetav, aga tabeleid, mis on inimsilmale loetavad on väga erinevaid (nt võib ühes tulbas olla korraga mitu vaatlusaspekti või eri väärtused salvestatud eri tulpadena). Vaata näiteid Hadley, 2014 artiklist, mis idee esitab. Kui andmed on kasutatavad ühtsel kujul on võimalik ka analüüsivahendites selle kujuga arvestada ning lihtsustada seeläbi analüüsikäiku. See, mis täpselt on vaatlus ja mis on tunnus muidugi sõltub täpsemalt meie analüüsiküsimustest.

4.2 Andmefailide lugemine

Andmefailide lugemine käib enamasti üherealiste käskudega, millele saab lisada parameetreid. Samamoodi nagu muu info, tasub need salvestada muutujasse.

Tavaline on näiteks .csv ehk komaga eristatud väärtuste fail. Loeme ühe sellise sisse. Tidyverse paketis on read_csv() käsk. R-i baaspaketis on read.csv() üsna sarnane toimeviisilt. Tidyverse versioon teeb mõned asjad mugavamaks. Muuhulgas näitab read_csv() kohe ülevaadet sisseloetud andmestikust ja sealsetest andmetüüpidest. Peamised tüübid on double igasugu numberväärtuste jaoks ja character igasugu teksti jaoks. Parameetritega saab täpsustada, kuidas täpselt faili lugeda.

# Allikas https://cran.r-project.org/web/packages/gapminder
gapminder <- read_csv("data/gapminder.csv")
## Parsed with column specification:
## cols(
##   country = col_character(),
##   continent = col_character(),
##   year = col_double(),
##   lifeExp = col_double(),
##   pop = col_double(),
##   gdpPercap = col_double()
## )

Lihtne viis R-is vaadata andmestikku on klikkides selle nimele paremal ülal environment menüüs või kasutades View() käsku.

View(gapminder)

Vastavalt failile tuleb valida ka käsk või parameetrid. Näiteks eesti keeleruumis on komaga eristatud väärtuste failis kasutatud eristamiseks semikoolonit ja numbrites komakohana koma (0,05). Inglise keeleruumis on numbrite komakohaks teadagi punkt (nt 0.05). Et tegemist on sageda juhtumiga, on selleks tidyverse paketis olemas eraldi käsk read_csv2(), mis võtab nö “Euroopa .csv vormi”.

gapminder <- read_csv2("data/gapminder_euro.csv")
## Using ',' as decimal and '.' as grouping mark. Use read_delim() for more control.
## Parsed with column specification:
## cols(
##   country = col_character(),
##   continent = col_character(),
##   year = col_double(),
##   lifeExp = col_double(),
##   pop = col_double(),
##   gdpPercap = col_double()
## )

Levinud on ka näiteks .tsv ehk tabulatsiooniga eraldataud väärtuste failid. Selle jaoks on kasutusel read_tsv() käsk.

gapminder <- read_tsv("data/gapminder.tsv")
## Parsed with column specification:
## cols(
##   country = col_character(),
##   continent = col_character(),
##   year = col_double(),
##   lifeExp = col_double(),
##   pop = col_double(),
##   gdpPercap = col_double()
## )

Lisaks on paketis ka read_delim() käsk, kus saab parameetrid ise sättida. delim märgib vaheväärtust, mis võib olla näiteks koma, semikoolon või midagi hoopis muud. Komakohaväärtus märgitakse asukohaspetsiifiliste väärtuste locale sees. Parameetrid märgitakse R-is sulgude vahele, märkides kõigepealt parameetri nime ja siis väärtuse. Tihti on parameetrite vaikejärjekord paigas ja kui parameetri nime ei ole määratud võetakse see järjekorra järgi. Näiteks varem sulgude vahele kirjutatud faili asukoht antakse edasi parameetrile path, kuna see on read_tsv() esimene parameeter.

gapminder <- read_delim("data/gapminder.csv",delim=",")
## Parsed with column specification:
## cols(
##   country = col_character(),
##   continent = col_character(),
##   year = col_double(),
##   lifeExp = col_double(),
##   pop = col_double(),
##   gdpPercap = col_double()
## )
gapminder <- read_delim("data/gapminder.tsv",delim="\t")
## Parsed with column specification:
## cols(
##   country = col_character(),
##   continent = col_character(),
##   year = col_double(),
##   lifeExp = col_double(),
##   pop = col_double(),
##   gdpPercap = col_double()
## )
gapminder <- read_delim("data/gapminder_euro.csv",delim=";", locale=locale(decimal_mark = ","))
## Parsed with column specification:
## cols(
##   country = col_character(),
##   continent = col_character(),
##   year = col_double(),
##   lifeExp = col_double(),
##   pop = col_double(),
##   gdpPercap = col_double()
## )

Võimalikke parameetreid ja väärtusi saab vaadata kõikide käskudega kaasas olevast abitekstist asetades koodireal käsu ette küsimärgi. Nt vaata ?read_delim all. Abitekst ilmub RStudios all paremal paiknevasse aknasse.

?read_delim

4.2.1 Erinevad failitüübid

Andmeid esitatakse, jagatakse ja hoitakse üsna erinevatel viisidel - mitte alati ei ole võimalik saada lihtsat .csv või .tsv faili, mis sobib hästi R-ile. Igasuguste failitüüpide jaoks, mis on olnud sobivad teistes kontekstides või teistes programmides on loodud hulk eraldiseisvaid pakette, mis aitavad neid failiformaate lugeda. Võimalik, et vajalik failitüüp ei ole kõige levinuim neist, aga kui otsida google-ist või stackoverflow-st R ja oma failitüüp ja read, siis tõenäoliselt on vastus olemas.

Siin toome paar näidet levinumatest tüüpidest, mida võib vaja minna: .xlsx, .sav, .xml ja .json. R-is on tihti loodud ka pakette andmete hankimisek.

4.2.1.1 Exceli failid

Exceli failide jaoks on omaette pakett readxl. See on installitud koos tidyverse pakettidega, aga tuleb eraldi sisse lugeda või viidata käsus.

# Allikas https://www.stat.ee/stat-rahvaarv-aasta-alguses
excel_fail <- readxl::read_xls(path="data/Rahvaarv aasta alguses, aastad.xls",skip=1)
## New names:
## * `` -> ...1

4.2.1.2 SPSS failid

SPSS, Stata ja SAS failide lugemiseks on samuti eraldi pakett haven, mis installitakse koos tidyverse-iga, aga tuleb aktiveerida eraldi või viidata käsus.

#library(haven)

# Allikas https://www.europeansocialsurvey.org/data/download.html?r=9
spss_fail <- haven::read_sav("data/ESS9EE.sav")

4.2.1.3 XML failid

XML failide jaoks on mitmeid pakette. Tidyverse komplektis on installitud xml2. XML andmestike puhul võib olla ka standardformaate. Näiteks Statistikaamet on hakanud kasutama sdmx andmestiku standardit. Selleks on R-is olemas oma pakett rsdmx. Et see pole tidyverse paketiga kaasas tuleb see kõigepealt installida. Seejärel võib sellega lugeda näiteks allalaetud xml faili või andmete saamiseks loodud linki

#install.packages("rdsmx")
library(rsdmx)

# Allikas http://andmebaas.stat.ee/ -> RV021
sdmx_xml_fail <- rsdmx::readSDMX(file = "data/stat_ee_RV21_compact.xml",isURL=F) %>%  as.data.frame()

# Allikas https://cran.r-project.org/web/packages/rsdmx/vignettes/quickstart.html
sdmx_xml_url <- rsdmx::readSDMX("http://stats.oecd.org/restsdmx/sdmx.ashx/GetData/MIG/TOT../OECD?startTime=2000&endTime=2011",isURL=T) %>% as.data.frame()

4.2.1.4 JSON failid

Tihti esinevad andmed ka json formaadis. Selle jaoks on tidyverse-iga kaasas pakett jsonlite, mis tuleb samuti eraldi aktiveerida või viidata käsu sees. Sellega võib lugeda ka kohalikke faile või laadida otse faile alla netist.

library(jsonlite)
## 
## Attaching package: 'jsonlite'
## The following object is masked from 'package:purrr':
## 
##     flatten
# Allikas https://github.com/rfordatascience/tidytuesday/tree/master/data/2019/2019-10-01
json_fail <- jsonlite::fromJSON(readLines("https://jaredlander.com/data/PizzaPollData.php"), flatten = TRUE)
## Warning in readLines("https://jaredlander.com/data/PizzaPollData.php"):
## incomplete final line found on 'https://jaredlander.com/data/PizzaPollData.php'

4.2.1.5 Andmete hankimine pakettide abil

R-i pakette on hakatud ka kasutama viisina andmete levitamiseks. Need võivad olla kaasas mõnes paketis funktsioonide näiteandmetena, näiteks gapminderi paketis või andmekogude haldajad või kasutajad on loonud pakette andmete kättesaamise lihtsustamiseks. Sellised paketid on olemas näiteks eurostati avaandmetel või gutenbergi tekstikogul. Näiteks aktiveerides gapminderi paketi, saame me kaasa gapminderi andmestiku või lugedes sisse eurostati paketi saame me kaasa get_eurostat() käsu, kuhu kirjutatud andmestiku nime järgi laeb pakett alla ajakohased andmed. Viimasel ajal on kasutatud R-i pakette ka üksikartiklitega kaasas olevate andmestike ja analüüside jagamiseks.

andmed_paketist1 <- gapminder::gapminder

andmed_paketi_abil1 <- eurostat::get_eurostat('demo_mlexpec')
## Table demo_mlexpec cached at /tmp/RtmpdGCQSW/eurostat/demo_mlexpec_date_code_TF.rds
andmed_paketi_abil2 <- eurostat::get_eurostat('hlth_silc_08')
## Table hlth_silc_08 cached at /tmp/RtmpdGCQSW/eurostat/hlth_silc_08_date_code_TF.rds

4.3 Andmete eemaldamine

Kui meil andmestikke vaja ei ole, saame nad eemaldada käsuga rm(), kuhu võib lisada kõik muutujad, mis me soovime eemaldada. Eraldatud komadega.

rm(gapminder, excel_fail, json_fail)

Kui me soovime eemaldada kõik sisse loetud andmestikud, saame kasutada käsku rm(list=ls()). ls() näitab kõiki sisseloetud muutujaid. Sama teeb luua märk andmete kohal paremal ülal ääres.

ls()
##  [1] "a"                        "andmed_paketi_abil1"     
##  [3] "andmed_paketi_abil2"      "andmed_paketist1"        
##  [5] "faktor"                   "faktor2"                 
##  [7] "kuuliLennuTeeTunneliLuuk" "numbrivektor"            
##  [9] "sdmx_xml_fail"            "sdmx_xml_url"            
## [11] "spss_fail"                "tekstivektor"            
## [13] "x"                        "y"                       
## [15] "z"
rm(list = ls())

5 Valimi loomine ja tunnuste valik

5.1 Andmed

Loeme sisse kolm eri tüüpi andmestikku. Pikas formaadis anded, kus on iga mõõtmishetk ühel real, laias formaadis andmed, kus on mõõtmised tehtud tüüpide järgi rea tunnusteks ning suured küsitlusandmed, kus on igal mõõtmisel mõõdetud korraga väga palju erinevaid tunnuseid.

  • Pikad andmed: GAPMINDER 1952-2007 oodatav eluiga, rahvaarv ja GDP inimese kohta valitud maailma riikides
  • Laiad andmed: EUROSTAT 1960-2018 oodatav eluiga igal aastal Euroopa Liidu riikides.
  • Suur küsitlus: Euroopa Sotsiaaluuringute 9. vooru küsitlustulemused Eesti kohta (2018)

Alustuseks avame paketid, mis sisaldavad meile vajalikke käske. Vajalikud paketid tuleb avada iga kord kui me käivitame R-i.

# tidyverse pakett hulk erinevate käskude jaoks
library(tidyverse)

# haven pakett spss andmete lugemiseks
library(haven)
# GAPMINDER andmed pärinevad näidisandmestikust *gapminder* paketis ja on tehtud varem R-ile sobivaks.
gapminder <- read_csv("data/gapminder.csv")
## Parsed with column specification:
## cols(
##   country = col_character(),
##   continent = col_character(),
##   year = col_double(),
##   lifeExp = col_double(),
##   pop = col_double(),
##   gdpPercap = col_double()
## )
# EUROSTAT andmed on laetud alla oma kodulehelt .tsv kujul.
eu_lifeExp <- read_tsv("data/demo_mlexpec.tsv")
## Parsed with column specification:
## cols(
##   .default = col_character()
## )
## See spec(...) for full column specifications.
# Euroopa Sotsiaaluuringute küsitlus on laetud alla oma kodulehelt SPSS faili .sav kujul.
ess9_ee <- haven::read_sav("data/ESS9EE.sav")


# EUROSTAT andmestikus on küll andmeväljad eraldatud tabulatsioonimärgiga, aga ridade identifikaatorid on eraldatud komaga.
# Selleks et eraldada komaga eraldatud andmeväljad, kasutame funktsiooni separate, mis lahutab ühe tulba mitmeks määratud eraldusmärgi alusel.
# Siin lahutame esimese tulba (col = 1), neljaks tulbaks, mille nimed on lisatud vektorina ja määrame eraldusmärgiks koma.
# Kuna me tahame tabelit sellisel kujul kasutada läbivalt, salvestame üle tabeli enda muutuja.
# Käsu süntaksit selgitame lähemat allpool.

eu_lifeExp <-
  eu_lifeExp %>% 
  separate(col=1,into=c("unit","sex","age","geo"), sep=",")

5.2 Andmete töötlus tidyverse stiilis R-is

Andmete töötlemiseks on R-is mitmeid eri stiilivariante või “murdeid”. Levinuimad neist on ehk base-R ehk liht-R, tidyverse ja data.table. Igaüks toob kaasa oma variatsiooni R-i süntaksist ja lubab mõnd asja lihtsamini teha kui teine.

Tidyverse pakettide töötluses on peamiseks operaatoriks %>% toru. See toru liigutab endale eelnenud töötluse tulemuse edasi ning annab selle aluseks järgmisele protseduurile. Tavaliselt on R-is igal real üks käsk. R on aga piisavalt tark, et näha kui käsk ei lõppe rea lõpuga - näiteks kui sulud on sulgemata või rea lõpus on %>% toru ja jätkab lugemist järgmiselt realt. Seetõttu tasub ka kindlasti vaadata, et rea lõpus on sulud kenasti suletud ja käsk ka lõppeb seal, kus soov on.

Tidyverse töömudel on järgmine. Võttes aluseks andmed, suuname nad läbi %>% toru protsessi 1 ja seejärel selle protsessi tulemuse ka protsessi 2. Kuna viimasel real ei ole toru, teab R ka töötluse siis lõpetada. Kuna meil pole andmeid nimega andmed ja selliseid protsesse, siis see kood ei tööta.

andmed %>%
 protsess1() %>%
 protsess2()

Vaatame alustuseks lihtsaid käske, mis on mõeldud andmestikust esimese ülevaate saamiseks ja sellest endale vajaliku osa eraldamiseks. Selleks on olemas järgmised vahendid.

  • %>% - vii andmed järgmisesse protsessi
  • select() - vali soovitud tunnused
  • filter() - vii andmestik läbi filtri/sõela
  • unique() - jäta alles ainult unikaalsed read

Trükkides sisse andmestiku nime, näeme selle sisu. Gapminder andmestik sisaldab tunnuseid riik, manner, mõõtmise aasta, oodatav eluiga, rahvaarv ja GDP rahvaarvu kohta. Samas on iga riigi kohta 12 mõõtmisaastat perioodi sees, mis on asetatud igaüks ise reale.

gapminder
## # A tibble: 1,704 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.
## # … with 1,694 more rows

5.3 Tunnuste valimine

Kui me nüüd tahaksime võtta sellest ainult valitud tulbad, siis kasutame käsku select(). Kirjutame selleks soovitud tunnuste nimed sulgude vahele

gapminder %>% 
  select(country,continent,year,lifeExp)
## # A tibble: 1,704 x 4
##    country     continent  year lifeExp
##    <chr>       <chr>     <dbl>   <dbl>
##  1 Afghanistan Asia       1952    28.8
##  2 Afghanistan Asia       1957    30.3
##  3 Afghanistan Asia       1962    32.0
##  4 Afghanistan Asia       1967    34.0
##  5 Afghanistan Asia       1972    36.1
##  6 Afghanistan Asia       1977    38.4
##  7 Afghanistan Asia       1982    39.9
##  8 Afghanistan Asia       1987    40.8
##  9 Afghanistan Asia       1992    41.7
## 10 Afghanistan Asia       1997    41.8
## # … with 1,694 more rows

Me saame sama teha ka numbritega. Mäletate, et koolon tähendas numbrite vahemikku, ehk 1:4 tähendab tulpi 1-4.

gapminder %>% 
  select(1:4)
## # A tibble: 1,704 x 4
##    country     continent  year lifeExp
##    <chr>       <chr>     <dbl>   <dbl>
##  1 Afghanistan Asia       1952    28.8
##  2 Afghanistan Asia       1957    30.3
##  3 Afghanistan Asia       1962    32.0
##  4 Afghanistan Asia       1967    34.0
##  5 Afghanistan Asia       1972    36.1
##  6 Afghanistan Asia       1977    38.4
##  7 Afghanistan Asia       1982    39.9
##  8 Afghanistan Asia       1987    40.8
##  9 Afghanistan Asia       1992    41.7
## 10 Afghanistan Asia       1997    41.8
## # … with 1,694 more rows

Me võime ka võtta ainult riigi ja mandri. Sellisel juhul on näha, et tabel ei muutunud sellest veel lühemaks. Riiginimed esinevad mitu korda ka siis kui mõõtmisaasta on eemaldatud.

gapminder %>% 
  select(1:2)
## # A tibble: 1,704 x 2
##    country     continent
##    <chr>       <chr>    
##  1 Afghanistan Asia     
##  2 Afghanistan Asia     
##  3 Afghanistan Asia     
##  4 Afghanistan Asia     
##  5 Afghanistan Asia     
##  6 Afghanistan Asia     
##  7 Afghanistan Asia     
##  8 Afghanistan Asia     
##  9 Afghanistan Asia     
## 10 Afghanistan Asia     
## # … with 1,694 more rows

Et jääks alles ainult unikaalsed read, kasutame käsku unique().

gapminder %>% 
  select(1:2) %>% 
  unique()
## # A tibble: 142 x 2
##    country     continent
##    <chr>       <chr>    
##  1 Afghanistan Asia     
##  2 Albania     Europe   
##  3 Algeria     Africa   
##  4 Angola      Africa   
##  5 Argentina   Americas 
##  6 Australia   Oceania  
##  7 Austria     Europe   
##  8 Bahrain     Asia     
##  9 Bangladesh  Asia     
## 10 Belgium     Europe   
## # … with 132 more rows

Näiteks, et näha kõiki mandreid selles andmestikus, valime ainult selle tulba ja lisame rea unique().

gapminder %>% 
  select(continent) %>% 
  unique()
## # A tibble: 5 x 1
##   continent
##   <chr>    
## 1 Asia     
## 2 Europe   
## 3 Africa   
## 4 Americas 
## 5 Oceania

Kuna gapminder on üpris kompaktne andmestik ja tulpade eraldamine oluliselt ülevaadet ei paranda. select() funktsiooni kasu tuleb esile alles suuremate andmestikega. Näiteks kui me vaatame eu_lifeExp andmestikku, näeme, et seal on hulk rohkem tunnuseid iga rea kohta.

eu_lifeExp
## # A tibble: 14,448 x 63
##    unit  sex   age   geo   `2018` `2017` `2016` `2015` `2014` `2013` `2012`
##    <chr> <chr> <chr> <chr> <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
##  1 YR    F     Y1    AL    :      79.7   79.8   79.2   79.8   79.6   :     
##  2 YR    F     Y1    AM    :      78.5   78.0   77.9   :      :      :     
##  3 YR    F     Y1    AT    :      83.2   83.4   83.0   83.3   83.0   82.8  
##  4 YR    F     Y1    AZ    :      77.7   :      77.5   77.0   76.9   76.5  
##  5 YR    F     Y1    BE    :      83.2   83.2   82.6   83.1   82.5   82.4  
##  6 YR    F     Y1    BG    :      77.9   78.0   77.6   77.6   78.1   77.4  
##  7 YR    F     Y1    BY    :      78.6   78.4   78.2   77.8   77.3   77.1  
##  8 YR    F     Y1    CH    :      84.9   84.9   84.4   84.7   84.3   84.2  
##  9 YR    F     Y1    CY    :      83.3   84.1   82.9   83.4   84.0   82.6  
## 10 YR    F     Y1    CZ    :      81.2   81.3   80.8   81.1   80.5   80.4  
## # … with 14,438 more rows, and 52 more variables: `2011` <chr>, `2010` <chr>,
## #   `2009` <chr>, `2008` <chr>, `2007` <chr>, `2006` <chr>, `2005` <chr>,
## #   `2004` <chr>, `2003` <chr>, `2002` <chr>, `2001` <chr>, `2000` <chr>,
## #   `1999` <chr>, `1998` <chr>, `1997` <chr>, `1996` <chr>, `1995` <chr>,
## #   `1994` <chr>, `1993` <chr>, `1992` <chr>, `1991` <chr>, `1990` <chr>,
## #   `1989` <chr>, `1988` <chr>, `1987` <chr>, `1986` <chr>, `1985` <chr>,
## #   `1984` <chr>, `1983` <chr>, `1982` <chr>, `1981` <chr>, `1980` <chr>,
## #   `1979` <chr>, `1978` <chr>, `1977` <chr>, `1976` <chr>, `1975` <chr>,
## #   `1974` <chr>, `1973` <chr>, `1972` <chr>, `1971` <chr>, `1970` <chr>,
## #   `1969` <chr>, `1968` <chr>, `1967` <chr>, `1966` <chr>, `1965` <chr>,
## #   `1964` <chr>, `1963` <chr>, `1962` <chr>, `1961` <chr>, `1960` <chr>

Me võime vaadata, et tahame näiteks ainult 2017 aasta andmeid. Siin tuleb 2017 jutumärkidesse panna nagu on selle kuju ka ülevaates, kuna ta ei ole antud juhul numbri, vaid teksti rollis. Tunnuste nimed, mis ei meenuta numbreid võivad olla nii jutumärkides kui ilma.

eu_lifeExp %>% 
  select(unit,sex,age,"geo","2017")
## # A tibble: 14,448 x 5
##    unit  sex   age   geo   `2017`
##    <chr> <chr> <chr> <chr> <chr> 
##  1 YR    F     Y1    AL    79.7  
##  2 YR    F     Y1    AM    78.5  
##  3 YR    F     Y1    AT    83.2  
##  4 YR    F     Y1    AZ    77.7  
##  5 YR    F     Y1    BE    83.2  
##  6 YR    F     Y1    BG    77.9  
##  7 YR    F     Y1    BY    78.6  
##  8 YR    F     Y1    CH    84.9  
##  9 YR    F     Y1    CY    83.3  
## 10 YR    F     Y1    CZ    81.2  
## # … with 14,438 more rows

Võib juhtuda, et me ei taha ainult ühte aastat, vaid mõnd vahemikku. Selleks on võimalik kirjutada kõik nimed järjest select() alla. Või selle hõlbustamiseks sisaldab ka select() hulka lisafunktsioone, millega tunnuste valimist lihtsustada. Näiteks starts_with(), ends_with() võimaldavad valida tunnuseid, mille nimed algavad või lõppevad kindla mustriga.

eu_lifeExp %>% 
  select(unit,sex,age,"geo","2018","2017")
## # A tibble: 14,448 x 6
##    unit  sex   age   geo   `2018` `2017`
##    <chr> <chr> <chr> <chr> <chr>  <chr> 
##  1 YR    F     Y1    AL    :      79.7  
##  2 YR    F     Y1    AM    :      78.5  
##  3 YR    F     Y1    AT    :      83.2  
##  4 YR    F     Y1    AZ    :      77.7  
##  5 YR    F     Y1    BE    :      83.2  
##  6 YR    F     Y1    BG    :      77.9  
##  7 YR    F     Y1    BY    :      78.6  
##  8 YR    F     Y1    CH    :      84.9  
##  9 YR    F     Y1    CY    :      83.3  
## 10 YR    F     Y1    CZ    :      81.2  
## # … with 14,438 more rows
eu_lifeExp %>% 
  select(unit,sex,age,geo,starts_with("200"))
## # A tibble: 14,448 x 14
##    unit  sex   age   geo   `2009` `2008` `2007` `2006` `2005` `2004` `2003`
##    <chr> <chr> <chr> <chr> <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
##  1 YR    F     Y1    AL    :      :      :      :      :      :      :     
##  2 YR    F     Y1    AM    76.5   76.4   76.5   75.9   :      :      :     
##  3 YR    F     Y1    AT    82.5   82.5   82.3   82.0   81.6   81.4   80.8  
##  4 YR    F     Y1    AZ    76.1   76.1   75.4   75.1   :      :      :     
##  5 YR    F     Y1    BE    82.1   81.8   81.9   81.6   81.1   81.2   80.4  
##  6 YR    F     Y1    BG    77.1   76.7   76.3   76.1   76.0   76.0   75.7  
##  7 YR    F     Y1    BY    :      :      :      :      :      :      :     
##  8 YR    F     Y1    CH    83.9   83.9   83.7   83.6   83.3   83.1   82.5  
##  9 YR    F     Y1    CY    82.6   82.0   81.4   81.3   80.2   81.0   80.5  
## 10 YR    F     Y1    CZ    79.7   79.7   79.4   79.1   78.5   78.4   77.8  
## # … with 14,438 more rows, and 3 more variables: `2002` <chr>, `2001` <chr>,
## #   `2000` <chr>
eu_lifeExp %>% 
  select(unit,sex,age,geo,ends_with("5"))
## # A tibble: 14,448 x 10
##    unit  sex   age   geo   `2015` `2005` `1995` `1985` `1975` `1965`
##    <chr> <chr> <chr> <chr> <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
##  1 YR    F     Y1    AL    79.2   :      :      :      :      :     
##  2 YR    F     Y1    AM    77.9   :      :      :      :      :     
##  3 YR    F     Y1    AT    83.0   81.6   79.5   77.1   75.1   :     
##  4 YR    F     Y1    AZ    77.5   :      :      :      :      :     
##  5 YR    F     Y1    BE    82.6   81.1   79.8   77.7   75.3   74.3  
##  6 YR    F     Y1    BG    77.6   76.0   74.8   74.3   73.9   74.3  
##  7 YR    F     Y1    BY    78.2   :      :      :      :      :     
##  8 YR    F     Y1    CH    84.4   83.3   81.3   79.9   77.8   75.3  
##  9 YR    F     Y1    CY    82.9   80.2   79.3   :      :      :     
## 10 YR    F     Y1    CZ    80.8   78.5   76.2   74.6   74.3   74.0  
## # … with 14,438 more rows

Viimaks on meil võimalik ka kasutada keerulisemaid mustreid. matches() võimaldab kasutada ka regulaaravaldisi tunnusenimede leidmiseks. Näiteks võime leida tunnused iga viie aasta tagant. “0\(|5\)” tähendab, et tekst peab lõppema 0-i või 5-ga.

eu_lifeExp %>% 
  select(unit,sex,age,geo,matches("0$|5$"))
## # A tibble: 14,448 x 16
##    unit  sex   age   geo   `2015` `2010` `2005` `2000` `1995` `1990` `1985`
##    <chr> <chr> <chr> <chr> <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
##  1 YR    F     Y1    AL    79.2   :      :      :      :      :      :     
##  2 YR    F     Y1    AM    77.9   :      :      :      :      :      :     
##  3 YR    F     Y1    AT    83.0   82.8   81.6   80.6   79.5   78.6   77.1  
##  4 YR    F     Y1    AZ    77.5   75.8   :      :      :      :      :     
##  5 YR    F     Y1    BE    82.6   82.2   81.1   80.4   79.8   79.1   77.7  
##  6 YR    F     Y1    BG    77.6   77.0   76.0   74.9   74.8   74.6   74.3  
##  7 YR    F     Y1    BY    78.2   :      :      :      :      :      :     
##  8 YR    F     Y1    CH    84.4   84.2   83.3   82.1   81.3   80.4   79.9  
##  9 YR    F     Y1    CY    82.9   83.1   80.2   79.5   79.3   :      :     
## 10 YR    F     Y1    CZ    80.8   80.1   78.5   77.7   76.2   75.2   74.6  
## # … with 14,438 more rows, and 5 more variables: `1980` <chr>, `1975` <chr>,
## #   `1970` <chr>, `1965` <chr>, `1960` <chr>

See funktsioon tunnuste valimiseks võib osutuda eriti kasulikuks kui on tabelis väga palju tunnuseid, mille tunnuste nimed on omavahel sarnased teatud reeglite alusel. Näiteks meie sisseloetud küsitluses võime tahta korraga näha kõiki küsimusi, mis on seotud usaldusega. Need sisaldavad tunnusenimes trst ja me võime seda otsida. Näiteks siis kasutades starts_with() funktsiooni või matches() funktsiooni. matches() leiab ühe tunnuse enam, kuna ppltrst tunnuses pole otsitu enam tunnuse nime alguses.

ess9_ee %>% 
  select(idno,cntry,starts_with("trst"))
## # A tibble: 1,904 x 9
##     idno cntry      trstprl  trstlgl   trstplc trstplt  trstprt    trstep trstun
##    <dbl> <chr+lbl> <dbl+lb> <dbl+lb> <dbl+lbl> <dbl+l> <dbl+lb> <dbl+lbl> <dbl+>
##  1     6 EE [Esto…    5 [5]    5 [5]  7 [7]      4 [4] 5 [5]     5 [5]     5 [5]
##  2    22 EE [Esto…    6 [6]    6 [6]  8 [8]      6 [6] 5 [5]     8 [8]     9 [9]
##  3    33 EE [Esto…    8 [8]    8 [8]  8 [8]      3 [3] 3 [3]     6 [6]     7 [7]
##  4    48 EE [Esto…    3 [3]    4 [4]  5 [5]      5 [5] 5 [5]     5 [5]     5 [5]
##  5    51 EE [Esto…    5 [5]    5 [5]  8 [8]      7 [7] 7 [7]    NA        NA    
##  6   101 EE [Esto…    7 [7]    3 [3] 10 [Comp…   1 [1] 0 [No t… 10 [Comp…  3 [3]
##  7   102 EE [Esto…    4 [4]    7 [7]  8 [8]      3 [3] 3 [3]     5 [5]     8 [8]
##  8   113 EE [Esto…    7 [7]    8 [8]  7 [7]      6 [6] 6 [6]     7 [7]     7 [7]
##  9   114 EE [Esto…    6 [6]    9 [9]  9 [9]      2 [2] 2 [2]     8 [8]     9 [9]
## 10   121 EE [Esto…    7 [7]    7 [7] 10 [Comp…   7 [7] 7 [7]    NA        NA    
## # … with 1,894 more rows
ess9_ee %>% 
  select(idno,cntry,matches("trst"))
## # A tibble: 1,904 x 10
##     idno cntry    ppltrst trstprl trstlgl  trstplc trstplt trstprt   trstep
##    <dbl> <chr+lb> <dbl+l> <dbl+l> <dbl+l> <dbl+lb> <dbl+l> <dbl+l> <dbl+lb>
##  1     6 EE [Est…   3 [3]   5 [5]   5 [5]  7 [7]     4 [4] 5 [5]    5 [5]  
##  2    22 EE [Est…   7 [7]   6 [6]   6 [6]  8 [8]     6 [6] 5 [5]    8 [8]  
##  3    33 EE [Est…   6 [6]   8 [8]   8 [8]  8 [8]     3 [3] 3 [3]    6 [6]  
##  4    48 EE [Est…   2 [2]   3 [3]   4 [4]  5 [5]     5 [5] 5 [5]    5 [5]  
##  5    51 EE [Est…   5 [5]   5 [5]   5 [5]  8 [8]     7 [7] 7 [7]   NA      
##  6   101 EE [Est…   5 [5]   7 [7]   3 [3] 10 [Com…   1 [1] 0 [No … 10 [Com…
##  7   102 EE [Est…   8 [8]   4 [4]   7 [7]  8 [8]     3 [3] 3 [3]    5 [5]  
##  8   113 EE [Est…   7 [7]   7 [7]   8 [8]  7 [7]     6 [6] 6 [6]    7 [7]  
##  9   114 EE [Est…   8 [8]   6 [6]   9 [9]  9 [9]     2 [2] 2 [2]    8 [8]  
## 10   121 EE [Est…   7 [7]   7 [7]   7 [7] 10 [Com…   7 [7] 7 [7]   NA      
## # … with 1,894 more rows, and 1 more variable: trstun <dbl+lbl>

5.4 Valimi loomine

Kui select() funktsiooniga saab tunnuseid valida, siis meile vajalike ridade valimiseks on käsk filter(). filter() leiab meie seatud kriteeriumitele vastavad read ning jätab tabelist alles ainult need. Näiteksvõime võtta gapminder andmestikust kõik andmed, mis puudutavad Soomet või kõik andmed, mis on aastast 1952. Nagu R-i aluste peatükis sai öeldud, kasutame samasuse kontrolliks kahte võrdusmärki == .

gapminder %>% 
  filter(country=="Finland")
## # A tibble: 12 x 6
##    country continent  year lifeExp     pop gdpPercap
##    <chr>   <chr>     <dbl>   <dbl>   <dbl>     <dbl>
##  1 Finland Europe     1952    66.6 4090500     6425.
##  2 Finland Europe     1957    67.5 4324000     7545.
##  3 Finland Europe     1962    68.8 4491443     9372.
##  4 Finland Europe     1967    69.8 4605744    10922.
##  5 Finland Europe     1972    70.9 4639657    14359.
##  6 Finland Europe     1977    72.5 4738902    15605.
##  7 Finland Europe     1982    74.6 4826933    18533.
##  8 Finland Europe     1987    74.8 4931729    21141.
##  9 Finland Europe     1992    75.7 5041039    20647.
## 10 Finland Europe     1997    77.1 5134406    23724.
## 11 Finland Europe     2002    78.4 5193039    28205.
## 12 Finland Europe     2007    79.3 5238460    33207.
gapminder %>% 
  filter(year==1952)
## # A tibble: 142 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Albania     Europe     1952    55.2  1282697     1601.
##  3 Algeria     Africa     1952    43.1  9279525     2449.
##  4 Angola      Africa     1952    30.0  4232095     3521.
##  5 Argentina   Americas   1952    62.5 17876956     5911.
##  6 Australia   Oceania    1952    69.1  8691212    10040.
##  7 Austria     Europe     1952    66.8  6927772     6137.
##  8 Bahrain     Asia       1952    50.9   120447     9867.
##  9 Bangladesh  Asia       1952    37.5 46886859      684.
## 10 Belgium     Europe     1952    68    8730405     8343.
## # … with 132 more rows

Me võime lisada ka mitu kriteeriumit lisades nende vahele ja-märgi & või koma , .

gapminder %>% 
  filter(country=="Finland"&year==1952)
## # A tibble: 1 x 6
##   country continent  year lifeExp     pop gdpPercap
##   <chr>   <chr>     <dbl>   <dbl>   <dbl>     <dbl>
## 1 Finland Europe     1952    66.6 4090500     6425.
gapminder %>% 
  filter(country=="Finland",year==1952)
## # A tibble: 1 x 6
##   country continent  year lifeExp     pop gdpPercap
##   <chr>   <chr>     <dbl>   <dbl>   <dbl>     <dbl>
## 1 Finland Europe     1952    66.6 4090500     6425.

Me võime kasutada ka teisi võrdsuse kontrollimise viise. Näiteks võtame riigid, 1) mille rahvaarv oli aastal 1952 vähem kui 1 000 000 või 2) mille oodatav eluiga oli suurem kui 70 aastat või 3) kõik mõõtmistulemused mitte aastast 1952 (hüüumärk ! tähistab eitust), mille GDP elaniku kohta oli 500 ja 1000 usd vahel.

gapminder %>% 
  filter(year==1952,pop<1000000)
## # A tibble: 25 x 6
##    country           continent  year lifeExp    pop gdpPercap
##    <chr>             <chr>     <dbl>   <dbl>  <dbl>     <dbl>
##  1 Bahrain           Asia       1952    50.9 120447     9867.
##  2 Botswana          Africa     1952    47.6 442308      851.
##  3 Comoros           Africa     1952    40.7 153936     1103.
##  4 Congo, Rep.       Africa     1952    42.1 854885     2126.
##  5 Costa Rica        Americas   1952    57.2 926317     2627.
##  6 Djibouti          Africa     1952    34.8  63149     2670.
##  7 Equatorial Guinea Africa     1952    34.5 216964      376.
##  8 Gabon             Africa     1952    37.0 420702     4293.
##  9 Gambia            Africa     1952    30   284320      485.
## 10 Guinea-Bissau     Africa     1952    32.5 580653      300.
## # … with 15 more rows
gapminder %>% 
  filter(year==1952,lifeExp>70)
## # A tibble: 5 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 Denmark     Europe     1952    70.8  4334000     9692.
## 2 Iceland     Europe     1952    72.5   147962     7268.
## 3 Netherlands Europe     1952    72.1 10381988     8942.
## 4 Norway      Europe     1952    72.7  3327728    10095.
## 5 Sweden      Europe     1952    71.9  7124673     8528.
gapminder %>% 
  filter(!year==1952,gdpPercap>500,gdpPercap<1000)
## # A tibble: 263 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Afghanistan Asia       1957    30.3  9240934      821.
##  2 Afghanistan Asia       1962    32.0 10267083      853.
##  3 Afghanistan Asia       1967    34.0 11537966      836.
##  4 Afghanistan Asia       1972    36.1 13079460      740.
##  5 Afghanistan Asia       1977    38.4 14880372      786.
##  6 Afghanistan Asia       1982    39.9 12881816      978.
##  7 Afghanistan Asia       1987    40.8 13867957      852.
##  8 Afghanistan Asia       1992    41.7 16317921      649.
##  9 Afghanistan Asia       1997    41.8 22227415      635.
## 10 Afghanistan Asia       2002    42.1 25268405      727.
## # … with 253 more rows

Täpselt samamoodi võime soovida võtta ainult osa ridu eu_lifeExp andmestikust. Võtame alustuseks ainult eesti kohta käivad andmed. Näeme, et seal on oodatav edasine eluiga määratud vanuste järgi. Valime sealt Y1, mis arvutab oodatava eluea sünnihetkel. Seejärel näeme, et seal on eraldi ridadel sugu F, M ja T. Valime sealt T ehk kõik. Kuna T on tekst on vaja jutumärke selle ümber.

eu_lifeExp %>% 
  filter(geo=="EE")
## # A tibble: 258 x 63
##    unit  sex   age   geo   `2018` `2017` `2016` `2015` `2014` `2013` `2012`
##    <chr> <chr> <chr> <chr> <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
##  1 YR    F     Y1    EE    :      81.8   81.4   81.4   81.1   80.8   80.9  
##  2 YR    F     Y10   EE    :      72.9   72.5   72.5   72.2   72.0   71.9  
##  3 YR    F     Y11   EE    :      71.9   71.5   71.5   71.2   71.0   71.0  
##  4 YR    F     Y12   EE    :      70.9   70.5   70.5   70.2   70.0   70.0  
##  5 YR    F     Y13   EE    :      69.9   69.5   69.5   69.2   69.1   69.0  
##  6 YR    F     Y14   EE    :      68.9   68.5   68.5   68.2   68.1   68.0  
##  7 YR    F     Y15   EE    :      67.9   67.5   67.6   67.2   67.1   67.0  
##  8 YR    F     Y16   EE    :      67.0   66.5   66.6   66.3   66.1   66.0  
##  9 YR    F     Y17   EE    :      66.0   65.6   65.6   65.3   65.1   65.0  
## 10 YR    F     Y18   EE    :      65.0   64.6   64.6   64.3   64.1   64.0  
## # … with 248 more rows, and 52 more variables: `2011` <chr>, `2010` <chr>,
## #   `2009` <chr>, `2008` <chr>, `2007` <chr>, `2006` <chr>, `2005` <chr>,
## #   `2004` <chr>, `2003` <chr>, `2002` <chr>, `2001` <chr>, `2000` <chr>,
## #   `1999` <chr>, `1998` <chr>, `1997` <chr>, `1996` <chr>, `1995` <chr>,
## #   `1994` <chr>, `1993` <chr>, `1992` <chr>, `1991` <chr>, `1990` <chr>,
## #   `1989` <chr>, `1988` <chr>, `1987` <chr>, `1986` <chr>, `1985` <chr>,
## #   `1984` <chr>, `1983` <chr>, `1982` <chr>, `1981` <chr>, `1980` <chr>,
## #   `1979` <chr>, `1978` <chr>, `1977` <chr>, `1976` <chr>, `1975` <chr>,
## #   `1974` <chr>, `1973` <chr>, `1972` <chr>, `1971` <chr>, `1970` <chr>,
## #   `1969` <chr>, `1968` <chr>, `1967` <chr>, `1966` <chr>, `1965` <chr>,
## #   `1964` <chr>, `1963` <chr>, `1962` <chr>, `1961` <chr>, `1960` <chr>
eu_lifeExp %>% 
  filter(geo=="EE"&age=="Y1")
## # A tibble: 3 x 63
##   unit  sex   age   geo   `2018` `2017` `2016` `2015` `2014` `2013` `2012`
##   <chr> <chr> <chr> <chr> <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
## 1 YR    F     Y1    EE    :      81.8   81.4   81.4   81.1   80.8   80.9  
## 2 YR    M     Y1    EE    :      73.0   72.5   72.4   71.6   72.0   70.6  
## 3 YR    T     Y1    EE    :      77.6   77.2   77.2   76.6   76.7   76.0  
## # … with 52 more variables: `2011` <chr>, `2010` <chr>, `2009` <chr>,
## #   `2008` <chr>, `2007` <chr>, `2006` <chr>, `2005` <chr>, `2004` <chr>,
## #   `2003` <chr>, `2002` <chr>, `2001` <chr>, `2000` <chr>, `1999` <chr>,
## #   `1998` <chr>, `1997` <chr>, `1996` <chr>, `1995` <chr>, `1994` <chr>,
## #   `1993` <chr>, `1992` <chr>, `1991` <chr>, `1990` <chr>, `1989` <chr>,
## #   `1988` <chr>, `1987` <chr>, `1986` <chr>, `1985` <chr>, `1984` <chr>,
## #   `1983` <chr>, `1982` <chr>, `1981` <chr>, `1980` <chr>, `1979` <chr>,
## #   `1978` <chr>, `1977` <chr>, `1976` <chr>, `1975` <chr>, `1974` <chr>,
## #   `1973` <chr>, `1972` <chr>, `1971` <chr>, `1970` <chr>, `1969` <chr>,
## #   `1968` <chr>, `1967` <chr>, `1966` <chr>, `1965` <chr>, `1964` <chr>,
## #   `1963` <chr>, `1962` <chr>, `1961` <chr>, `1960` <chr>
eu_lifeExp %>% 
  filter(geo=="EE"&age=="Y1"&sex=="T")
## # A tibble: 1 x 63
##   unit  sex   age   geo   `2018` `2017` `2016` `2015` `2014` `2013` `2012`
##   <chr> <chr> <chr> <chr> <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
## 1 YR    T     Y1    EE    :      77.6   77.2   77.2   76.6   76.7   76.0  
## # … with 52 more variables: `2011` <chr>, `2010` <chr>, `2009` <chr>,
## #   `2008` <chr>, `2007` <chr>, `2006` <chr>, `2005` <chr>, `2004` <chr>,
## #   `2003` <chr>, `2002` <chr>, `2001` <chr>, `2000` <chr>, `1999` <chr>,
## #   `1998` <chr>, `1997` <chr>, `1996` <chr>, `1995` <chr>, `1994` <chr>,
## #   `1993` <chr>, `1992` <chr>, `1991` <chr>, `1990` <chr>, `1989` <chr>,
## #   `1988` <chr>, `1987` <chr>, `1986` <chr>, `1985` <chr>, `1984` <chr>,
## #   `1983` <chr>, `1982` <chr>, `1981` <chr>, `1980` <chr>, `1979` <chr>,
## #   `1978` <chr>, `1977` <chr>, `1976` <chr>, `1975` <chr>, `1974` <chr>,
## #   `1973` <chr>, `1972` <chr>, `1971` <chr>, `1970` <chr>, `1969` <chr>,
## #   `1968` <chr>, `1967` <chr>, `1966` <chr>, `1965` <chr>, `1964` <chr>,
## #   `1963` <chr>, `1962` <chr>, `1961` <chr>, `1960` <chr>

Või ESS9 puhul võime võtta kõik, kelle sooks on märgitud 1 või kelle usaldus poliitikutesse on kõrgem kui 7.

ess9_ee %>% 
  filter(admge==1) %>% 
  select(idno,admge)
## # A tibble: 995 x 2
##     idno       admge
##    <dbl>   <dbl+lbl>
##  1     6 1 [Group 1]
##  2    33 1 [Group 1]
##  3    51 1 [Group 1]
##  4   102 1 [Group 1]
##  5   113 1 [Group 1]
##  6   114 1 [Group 1]
##  7   121 1 [Group 1]
##  8   136 1 [Group 1]
##  9   277 1 [Group 1]
## 10   326 1 [Group 1]
## # … with 985 more rows
ess9_ee %>% 
  filter(trstplt>6) %>% 
  select(idno,starts_with("trst"))
## # A tibble: 197 x 8
##     idno    trstprl    trstlgl   trstplc   trstplt   trstprt    trstep    trstun
##    <dbl>  <dbl+lbl>  <dbl+lbl> <dbl+lbl> <dbl+lbl> <dbl+lbl> <dbl+lbl> <dbl+lbl>
##  1    51  5 [5]      5 [5]      8 [8]     7 [7]     7 [7]    NA        NA       
##  2   121  7 [7]      7 [7]     10 [Comp…  7 [7]     7 [7]    NA        NA       
##  3   361  8 [8]      9 [9]      9 [9]     7 [7]     7 [7]     8 [8]     8 [8]   
##  4   423  7 [7]      9 [9]      9 [9]     7 [7]     8 [8]     9 [9]     9 [9]   
##  5  1597  5 [5]      7 [7]      8 [8]     7 [7]     6 [6]     5 [5]     6 [6]   
##  6  1678  8 [8]      8 [8]     10 [Comp…  7 [7]     7 [7]     8 [8]     8 [8]   
##  7  1683  9 [9]      7 [7]      9 [9]     7 [7]     8 [8]     7 [7]     8 [8]   
##  8  1796  9 [9]      9 [9]      9 [9]     8 [8]     8 [8]     7 [7]     7 [7]   
##  9  2023 10 [Compl… 10 [Compl… 10 [Comp… 10 [Comp… 10 [Comp… 10 [Comp… 10 [Comp…
## 10  2367  7 [7]      8 [8]      8 [8]     7 [7]     7 [7]     7 [7]     7 [7]   
## # … with 187 more rows

5.5 Juhuvalimi tegemine

Võib juhtuda, et soovime valida juhuslikud andmeread andmestikust. Selle jaoks on olemas käsk sample_n(), mis võtab andmestikust n suvalist rida. Vaikimisi ei korrata ühtki rida, aga selle muutmiseks on võimalik lisada parameeter replace = TRUE. Lisaks, on võimalik lisada ridadele ka kaalud, mida valimi tegemisel arvestatakse.

gapminder %>% 
  filter(year==2007) %>% 
  sample_n(10)
## # A tibble: 10 x 6
##    country       continent  year lifeExp       pop gdpPercap
##    <chr>         <chr>     <dbl>   <dbl>     <dbl>     <dbl>
##  1 Algeria       Africa     2007    72.3  33333216     6223.
##  2 Panama        Americas   2007    75.5   3242173     9809.
##  3 Cote d'Ivoire Africa     2007    48.3  18013409     1545.
##  4 Burundi       Africa     2007    49.6   8390505      430.
##  5 Romania       Europe     2007    72.5  22276056    10808.
##  6 Portugal      Europe     2007    78.1  10642836    20510.
##  7 Belgium       Europe     2007    79.4  10392226    33693.
##  8 Philippines   Asia       2007    71.7  91077287     3190.
##  9 Venezuela     Americas   2007    73.7  26084662    11416.
## 10 Pakistan      Asia       2007    65.5 169270617     2606.
eu_lifeExp %>% 
  filter(age=="Y1",sex=="T") %>% 
  sample_n(10)
## # A tibble: 10 x 63
##    unit  sex   age   geo   `2018` `2017` `2016` `2015` `2014` `2013` `2012`
##    <chr> <chr> <chr> <chr> <chr>  <chr>  <chr>  <chr>  <chr>  <chr>  <chr> 
##  1 YR    T     Y1    EA19  :      81.2   81.3   80.9   81.3   80.8   80.6  
##  2 YR    T     Y1    UK    :      80.6   80.6   80.3   80.7   80.4   80.3  
##  3 YR    T     Y1    IE    :      81.5   81.0   80.8   80.7   80.3   80.2  
##  4 YR    T     Y1    SE    :      81.7   81.6   81.4   81.5   81.2   81.0  
##  5 YR    T     Y1    DE_T… :      80.3   80.3   80.0   80.4   79.9   80.0  
##  6 YR    T     Y1    LV    :      74.2   74.1   74.1   73.7   73.7   73.6  
##  7 YR    T     Y1    EFTA  :      82.5   82.5   82.1   82.2   81.8   81.6  
##  8 YR    T     Y1    SK    :      76.7   76.7   76.1   76.4   76.0   75.7  
##  9 YR    T     Y1    RS    :      75.0   75.2   74.7   74.8   74.7   74.4  
## 10 YR    T     Y1    EL    :      80.6   80.8   80.4   80.8   80.7   79.9  
## # … with 52 more variables: `2011` <chr>, `2010` <chr>, `2009` <chr>,
## #   `2008` <chr>, `2007` <chr>, `2006` <chr>, `2005` <chr>, `2004` <chr>,
## #   `2003` <chr>, `2002` <chr>, `2001` <chr>, `2000` <chr>, `1999` <chr>,
## #   `1998` <chr>, `1997` <chr>, `1996` <chr>, `1995` <chr>, `1994` <chr>,
## #   `1993` <chr>, `1992` <chr>, `1991` <chr>, `1990` <chr>, `1989` <chr>,
## #   `1988` <chr>, `1987` <chr>, `1986` <chr>, `1985` <chr>, `1984` <chr>,
## #   `1983` <chr>, `1982` <chr>, `1981` <chr>, `1980` <chr>, `1979` <chr>,
## #   `1978` <chr>, `1977` <chr>, `1976` <chr>, `1975` <chr>, `1974` <chr>,
## #   `1973` <chr>, `1972` <chr>, `1971` <chr>, `1970` <chr>, `1969` <chr>,
## #   `1968` <chr>, `1967` <chr>, `1966` <chr>, `1965` <chr>, `1964` <chr>,
## #   `1963` <chr>, `1962` <chr>, `1961` <chr>, `1960` <chr>
ess9_ee %>% 
  sample_n(100)
## # A tibble: 100 x 492
##    name  essround edition proddate  idno cntry    nwspol netusoft netustm
##    <chr>    <dbl> <chr>   <chr>    <dbl> <chr+lb> <dbl+> <dbl+lb> <dbl+l>
##  1 ESS9…        9 1.2     30.01.2… 12796 EE [Est…     30 5 [Ever…     360
##  2 ESS9…        9 1.2     30.01.2… 41979 EE [Est…     30 1 [Neve…      NA
##  3 ESS9…        9 1.2     30.01.2… 25845 EE [Est…     60 5 [Ever…     300
##  4 ESS9…        9 1.2     30.01.2… 30997 EE [Est…     60 5 [Ever…     600
##  5 ESS9…        9 1.2     30.01.2… 28034 EE [Est…    120 2 [Only…      NA
##  6 ESS9…        9 1.2     30.01.2…    22 EE [Est…    200 4 [Most…      90
##  7 ESS9…        9 1.2     30.01.2… 41134 EE [Est…     60 5 [Ever…      60
##  8 ESS9…        9 1.2     30.01.2… 40640 EE [Est…      5 5 [Ever…     600
##  9 ESS9…        9 1.2     30.01.2… 32072 EE [Est…     60 3 [A fe…      NA
## 10 ESS9…        9 1.2     30.01.2…   274 EE [Est…     15 5 [Ever…     120
## # … with 90 more rows, and 483 more variables: ppltrst <dbl+lbl>,
## #   pplfair <dbl+lbl>, pplhlp <dbl+lbl>, polintr <dbl+lbl>, psppsgva <dbl+lbl>,
## #   actrolga <dbl+lbl>, psppipla <dbl+lbl>, cptppola <dbl+lbl>,
## #   trstprl <dbl+lbl>, trstlgl <dbl+lbl>, trstplc <dbl+lbl>, trstplt <dbl+lbl>,
## #   trstprt <dbl+lbl>, trstep <dbl+lbl>, trstun <dbl+lbl>, vote <dbl+lbl>,
## #   prtvtcat <dbl+lbl>, prtvtdbe <dbl+lbl>, prtvtdbg <dbl+lbl>,
## #   prtvtgch <dbl+lbl>, prtvtbcy <dbl+lbl>, prtvtecz <dbl+lbl>,
## #   prtvede1 <dbl+lbl>, prtvede2 <dbl+lbl>, prtvtgee <dbl+lbl>,
## #   prtvtdfi <dbl+lbl>, prtvtdfr <dbl+lbl>, prtvtcgb <dbl+lbl>,
## #   prtvtfhu <dbl+lbl>, prtvtcie <dbl+lbl>, prtvtcit <dbl+lbl>,
## #   prtvtgnl <dbl+lbl>, prtvtbno <dbl+lbl>, prtvtdpl <dbl+lbl>,
## #   prtvtrs <dbl+lbl>, prtvtfsi <dbl+lbl>, contplt <dbl+lbl>,
## #   wrkprty <dbl+lbl>, wrkorg <dbl+lbl>, badge <dbl+lbl>, sgnptit <dbl+lbl>,
## #   pbldmn <dbl+lbl>, bctprd <dbl+lbl>, pstplonl <dbl+lbl>, clsprty <dbl+lbl>,
## #   prtcldat <dbl+lbl>, prtcldbe <dbl+lbl>, prtcldbg <dbl+lbl>,
## #   prtclgch <dbl+lbl>, prtclbcy <dbl+lbl>, prtclecz <dbl+lbl>,
## #   prtclede <dbl+lbl>, prtclgee <dbl+lbl>, prtclefi <dbl+lbl>,
## #   prtclffr <dbl+lbl>, prtclcgb <dbl+lbl>, prtclghu <dbl+lbl>,
## #   prtcleie <dbl+lbl>, prtcldit <dbl+lbl>, prtclfnl <dbl+lbl>,
## #   prtclbno <dbl+lbl>, prtclhpl <dbl+lbl>, prtclrs <dbl+lbl>,
## #   prtclfsi <dbl+lbl>, prtdgcl <dbl+lbl>, lrscale <dbl+lbl>,
## #   stflife <dbl+lbl>, stfeco <dbl+lbl>, stfgov <dbl+lbl>, stfdem <dbl+lbl>,
## #   stfedu <dbl+lbl>, stfhlth <dbl+lbl>, gincdif <dbl+lbl>, freehms <dbl+lbl>,
## #   hmsfmlsh <dbl+lbl>, hmsacld <dbl+lbl>, euftf <dbl+lbl>, imsmetn <dbl+lbl>,
## #   imdfetn <dbl+lbl>, impcntr <dbl+lbl>, imbgeco <dbl+lbl>, imueclt <dbl+lbl>,
## #   imwbcnt <dbl+lbl>, happy <dbl+lbl>, sclmeet <dbl+lbl>, inprdsc <dbl+lbl>,
## #   sclact <dbl+lbl>, crmvct <dbl+lbl>, aesfdrk <dbl+lbl>, health <dbl+lbl>,
## #   hlthhmp <dbl+lbl>, atchctr <dbl+lbl>, atcherp <dbl+lbl>, rlgblg <dbl+lbl>,
## #   rlgdnm <dbl+lbl>, rlgdnbat <dbl+lbl>, rlgdnbe <dbl+lbl>,
## #   rlgdnach <dbl+lbl>, rlgdncy <dbl+lbl>, rlgdnade <dbl+lbl>, …
ess9_ee %>% 
  sample_n(100, weight=dweight)
## # A tibble: 100 x 492
##    name  essround edition proddate  idno cntry    nwspol netusoft netustm
##    <chr>    <dbl> <chr>   <chr>    <dbl> <chr+lb> <dbl+> <dbl+lb> <dbl+l>
##  1 ESS9…        9 1.2     30.01.2… 33886 EE [Est…     30 4 [Most…     210
##  2 ESS9…        9 1.2     30.01.2… 21518 EE [Est…     60 1 [Neve…      NA
##  3 ESS9…        9 1.2     30.01.2… 31387 EE [Est…    180 5 [Ever…     540
##  4 ESS9…        9 1.2     30.01.2… 19537 EE [Est…     30 1 [Neve…      NA
##  5 ESS9…        9 1.2     30.01.2…  9371 EE [Est…    120 5 [Ever…     420
##  6 ESS9…        9 1.2     30.01.2… 44861 EE [Est…     60 5 [Ever…     480
##  7 ESS9…        9 1.2     30.01.2… 14859 EE [Est…     90 5 [Ever…     240
##  8 ESS9…        9 1.2     30.01.2…  9687 EE [Est…     60 1 [Neve…      NA
##  9 ESS9…        9 1.2     30.01.2…  3543 EE [Est…     30 5 [Ever…     480
## 10 ESS9…        9 1.2     30.01.2… 35519 EE [Est…     30 5 [Ever…     480
## # … with 90 more rows, and 483 more variables: ppltrst <dbl+lbl>,
## #   pplfair <dbl+lbl>, pplhlp <dbl+lbl>, polintr <dbl+lbl>, psppsgva <dbl+lbl>,
## #   actrolga <dbl+lbl>, psppipla <dbl+lbl>, cptppola <dbl+lbl>,
## #   trstprl <dbl+lbl>, trstlgl <dbl+lbl>, trstplc <dbl+lbl>, trstplt <dbl+lbl>,
## #   trstprt <dbl+lbl>, trstep <dbl+lbl>, trstun <dbl+lbl>, vote <dbl+lbl>,
## #   prtvtcat <dbl+lbl>, prtvtdbe <dbl+lbl>, prtvtdbg <dbl+lbl>,
## #   prtvtgch <dbl+lbl>, prtvtbcy <dbl+lbl>, prtvtecz <dbl+lbl>,
## #   prtvede1 <dbl+lbl>, prtvede2 <dbl+lbl>, prtvtgee <dbl+lbl>,
## #   prtvtdfi <dbl+lbl>, prtvtdfr <dbl+lbl>, prtvtcgb <dbl+lbl>,
## #   prtvtfhu <dbl+lbl>, prtvtcie <dbl+lbl>, prtvtcit <dbl+lbl>,
## #   prtvtgnl <dbl+lbl>, prtvtbno <dbl+lbl>, prtvtdpl <dbl+lbl>,
## #   prtvtrs <dbl+lbl>, prtvtfsi <dbl+lbl>, contplt <dbl+lbl>,
## #   wrkprty <dbl+lbl>, wrkorg <dbl+lbl>, badge <dbl+lbl>, sgnptit <dbl+lbl>,
## #   pbldmn <dbl+lbl>, bctprd <dbl+lbl>, pstplonl <dbl+lbl>, clsprty <dbl+lbl>,
## #   prtcldat <dbl+lbl>, prtcldbe <dbl+lbl>, prtcldbg <dbl+lbl>,
## #   prtclgch <dbl+lbl>, prtclbcy <dbl+lbl>, prtclecz <dbl+lbl>,
## #   prtclede <dbl+lbl>, prtclgee <dbl+lbl>, prtclefi <dbl+lbl>,
## #   prtclffr <dbl+lbl>, prtclcgb <dbl+lbl>, prtclghu <dbl+lbl>,
## #   prtcleie <dbl+lbl>, prtcldit <dbl+lbl>, prtclfnl <dbl+lbl>,
## #   prtclbno <dbl+lbl>, prtclhpl <dbl+lbl>, prtclrs <dbl+lbl>,
## #   prtclfsi <dbl+lbl>, prtdgcl <dbl+lbl>, lrscale <dbl+lbl>,
## #   stflife <dbl+lbl>, stfeco <dbl+lbl>, stfgov <dbl+lbl>, stfdem <dbl+lbl>,
## #   stfedu <dbl+lbl>, stfhlth <dbl+lbl>, gincdif <dbl+lbl>, freehms <dbl+lbl>,
## #   hmsfmlsh <dbl+lbl>, hmsacld <dbl+lbl>, euftf <dbl+lbl>, imsmetn <dbl+lbl>,
## #   imdfetn <dbl+lbl>, impcntr <dbl+lbl>, imbgeco <dbl+lbl>, imueclt <dbl+lbl>,
## #   imwbcnt <dbl+lbl>, happy <dbl+lbl>, sclmeet <dbl+lbl>, inprdsc <dbl+lbl>,
## #   sclact <dbl+lbl>, crmvct <dbl+lbl>, aesfdrk <dbl+lbl>, health <dbl+lbl>,
## #   hlthhmp <dbl+lbl>, atchctr <dbl+lbl>, atcherp <dbl+lbl>, rlgblg <dbl+lbl>,
## #   rlgdnm <dbl+lbl>, rlgdnbat <dbl+lbl>, rlgdnbe <dbl+lbl>,
## #   rlgdnach <dbl+lbl>, rlgdncy <dbl+lbl>, rlgdnade <dbl+lbl>, …

6 Ülevaated ja andmete grupeerimine

Et tüüpiliselt on esimese asjana soov andmestikust lihtsalt ülevaadet saada, on selleks loodud eraldi paketid ja käsud. Vaateme siin kahte: summarytools ja skimr. Ühe hea ülevaate sel teemal leiab siit.

6.1 Koondülevaated

6.1.1 summarytools

summarytools paketis on olulisim käsk dfSummary, mis annab ülevaate tervest sellele antud tabelist. dfSummary trükib utlemused konsooli, lisades view() väikse tähega tehakse tulemustest kena html tabel. Suure tabeli Näiteks võtame 1957 aasta ülevaate gapminderis,

library(summarytools)
## Registered S3 method overwritten by 'pryr':
##   method      from
##   print.bytes Rcpp
## For best results, restart R session and update pander using devtools:: or remotes::install_github('rapporter/pander')
## 
## Attaching package: 'summarytools'
## The following object is masked from 'package:tibble':
## 
##     view
gapminder %>% 
  filter(year==1957) %>% 
  dfSummary()
## Data Frame Summary  
## gapminder  
## Dimensions: 142 x 6  
## Duplicates: 0  
## 
## -----------------------------------------------------------------------------------------------------------------------------
## No   Variable      Stats / Values                         Freqs (% of Valid)    Graph                      Valid    Missing  
## ---- ------------- -------------------------------------- --------------------- -------------------------- -------- ---------
## 1    country       1. Afghanistan                           1 ( 0.7%)                                      142      0        
##      [character]   2. Albania                               1 ( 0.7%)                                      (100%)   (0%)     
##                    3. Algeria                               1 ( 0.7%)                                                        
##                    4. Angola                                1 ( 0.7%)                                                        
##                    5. Argentina                             1 ( 0.7%)                                                        
##                    6. Australia                             1 ( 0.7%)                                                        
##                    7. Austria                               1 ( 0.7%)                                                        
##                    8. Bahrain                               1 ( 0.7%)                                                        
##                    9. Bangladesh                            1 ( 0.7%)                                                        
##                    10. Belgium                              1 ( 0.7%)                                                        
##                    [ 132 others ]                         132 (93.0%)           IIIIIIIIIIIIIIIIII                           
## 
## 2    continent     1. Africa                              52 (36.6%)            IIIIIII                    142      0        
##      [character]   2. Americas                            25 (17.6%)            III                        (100%)   (0%)     
##                    3. Asia                                33 (23.2%)            IIII                                         
##                    4. Europe                              30 (21.1%)            IIII                                         
##                    5. Oceania                              2 ( 1.4%)                                                         
## 
## 3    year          1 distinct value                       1957 : 142 (100.0%)   IIIIIIIIIIIIIIIIIIII       142      0        
##      [numeric]                                                                                             (100%)   (0%)     
## 
## 4    lifeExp       Mean (sd) : 51.5 (12.2)                142 distinct values       :                      142      0        
##      [numeric]     min < med < max:                                               . : :       :            (100%)   (0%)     
##                    30.3 < 48.4 < 73.5                                             : : :     : :                              
##                    IQR (CV) : 21.8 (0.2)                                        : : : : : : : : .                            
##                                                                                 : : : : : : : : :                            
## 
## 5    pop           Mean (sd) : 18763412.5 (65504285.5)    142 distinct values   :                          142      0        
##      [numeric]     min < med < max:                                             :                          (100%)   (0%)     
##                    61325 < 4282942 < 637408000                                  :                                            
##                    IQR (CV) : 8248786.8 (3.5)                                   :                                            
##                                                                                 :                                            
## 
## 6    gdpPercap     Mean (sd) : 4299.4 (9869.7)            142 distinct values   :                          142      0        
##      [numeric]     min < med < max:                                             :                          (100%)   (0%)     
##                    336 < 2173.2 < 113523.1                                      :                                            
##                    IQR (CV) : 3945.8 (2.3)                                      :                                            
##                                                                                 :                                            
## -----------------------------------------------------------------------------------------------------------------------------
eu_lifeExp %>% 
  select(unit,sex,age,geo,matches("0$|5$")) %>% 
  filter(age=="Y1"&sex=="T") %>% 
  dfSummary() %>% 
  view()
## Switching method to 'browser'
## Output file written: /tmp/RtmpdGCQSW/file36b21c4e7df8.html
ess9_ee %>% 
  select(starts_with("trst")) %>% 
  dfSummary() %>% 
  view()
## Switching method to 'browser'
## Output file written: /tmp/RtmpdGCQSW/file36b2519da5cd.html

Me võime trükkida ka kogu tabeli. Suure tabeli ülevaate loomine võib võtta natuke aega.

ess9_ee %>% 
  dfSummary() %>% 
  view()
## Switching method to 'browser'
## Output file written: /tmp/RtmpdGCQSW/file36b27300f12d.html

6.1.1.1 Puuduvad väärtused

Märkasime ka ühes tabelis probleemi. Nimelt on küsimuste vastustel üks võimalik vastus koolon :, mis tähistab andmestikus puuduvat andmemärki. Samuti võiks

eu_lifeExp <- read_tsv("data/demo_mlexpec.tsv", na = ":")
## Parsed with column specification:
## cols(
##   .default = col_double(),
##   `unit,sex,age,geo\time` = col_character(),
##   `2018` = col_logical(),
##   `2014` = col_number()
## )
## See spec(...) for full column specifications.
## Warning: 153 parsing failures.
##  row  col           expected actual                    file
## 4761 2018 1/0/T/F/TRUE/FALSE   80.5 'data/demo_mlexpec.tsv'
## 4762 2018 1/0/T/F/TRUE/FALSE   79.7 'data/demo_mlexpec.tsv'
## 4763 2018 1/0/T/F/TRUE/FALSE   84.1 'data/demo_mlexpec.tsv'
## 4764 2018 1/0/T/F/TRUE/FALSE   78.3 'data/demo_mlexpec.tsv'
## 4765 2018 1/0/T/F/TRUE/FALSE   83.9 'data/demo_mlexpec.tsv'
## .... .... .................. ...... .......................
## See problems(...) for more details.
eu_lifeExp <-
  eu_lifeExp %>% 
  separate(col=1,into=c("unit","sex","age","geo"), sep=",")

eu_lifeExp %>% 
  select("2016") %>% 
  unique() %>% 
  arrange(get("2016"))
## # A tibble: 817 x 1
##    `2016`
##     <dbl>
##  1    3.7
##  2    3.9
##  3    4  
##  4    4.2
##  5    4.4
##  6    4.5
##  7    4.6
##  8    4.7
##  9    4.8
## 10    4.9
## # … with 807 more rows
eu_lifeExp %>% 
  select(unit,sex,age,geo,matches("0$|5$")) %>% 
  filter(age=="Y1"&sex=="T") %>% 
  dfSummary() %>% 
  view()
## Switching method to 'browser'
## Output file written: /tmp/RtmpdGCQSW/file36b22d844d50.html

6.1.1.2 Sildid andmeväärtustel

trst_cols <- ess9_ee %>% 
  select(idno,cntry,matches("trst"))

view(dfSummary(trst_cols))
## Switching method to 'browser'
## Output file written: /tmp/RtmpdGCQSW/file36b26e9a9d32.html
trst_chars <- trst_cols %>% 
  rio::factorize()
view(dfSummary(trst_chars,max.distinct.values = 15))
## Switching method to 'browser'
## Output file written: /tmp/RtmpdGCQSW/file36b24fa4537c.html

6.1.2 skimr

Teine funktsioon ülevaadete saamiseks, mis trükib tulemused veidi kompaktsemalt konsooli on skim() skimr paketist. Näiteks võime võtta ülevaate 1952 aasta gapminder andmetest, sünnist oodatava eluea euroopa riikides (pane tähele ajaga kahanev puuduvate väärtuste arv) ja usaldusega seotud mõõdikute kohta. ess9_ee puhul tuleb kasutada vahepeal haven paketi lisafunktsiooni zap_labels(), mis eemaldab andmestikult SPSS failiga kaasa tulnud sildid. R-is tavaliselt silte andmete küljes ei hoita, pigem dokumentatsioonis, mistõttu mitmed funktsioonid, nagu ka skim(), ei pruugi töötada ilma eelnevalt silte eemaldamata.

library(skimr)

gapminder %>% 
  filter(year==1952) %>% 
  skim()
Data summary
Name Piped data
Number of rows 142
Number of columns 6
_______________________
Column type frequency:
character 2
numeric 4
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
country 0 1 4 24 0 142 0
continent 0 1 4 8 0 5 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
year 0 1 1952.00 0.00 1952.00 1952.00 1952.00 1952.00 1952.00 ▁▁▇▁▁
lifeExp 0 1 49.06 12.23 28.80 39.06 45.14 59.77 72.67 ▅▇▃▃▅
pop 0 1 16950402.46 58100862.94 60011.00 1452026.25 3943953.00 9168197.75 556263527.00 ▇▁▁▁▁
gdpPercap 0 1 3725.28 9321.06 298.85 864.75 1968.53 3913.49 108382.35 ▇▁▁▁▁
eu_lifeExp %>% 
  filter(age=="Y1",sex=="T") %>% 
  skim()
Data summary
Name Piped data
Number of rows 56
Number of columns 63
_______________________
Column type frequency:
character 4
logical 1
numeric 58
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
unit 0 1 2 2 0 1 0
sex 0 1 1 1 0 1 0
age 0 1 2 2 0 1 0
geo 0 1 2 10 0 56 0

Variable type: logical

skim_variable n_missing complete_rate mean count
2018 56 0 NaN :

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
2017 5 0.91 79.05 2.98 72.8 76.20 80.30 81.30 83.0 ▃▃▃▆▇
2016 6 0.89 79.16 2.90 72.4 77.23 80.30 81.30 83.0 ▂▃▃▆▇
2015 5 0.91 78.68 3.03 72.1 75.90 80.00 80.95 82.4 ▂▃▂▃▇
2014 6 0.89 78.90 3.11 71.3 76.45 80.30 81.30 82.7 ▁▃▃▃▇
2013 8 0.86 78.88 2.80 72.0 76.65 79.90 80.93 82.4 ▁▃▂▆▇
2012 5 0.91 78.46 3.30 70.7 75.85 79.80 80.60 84.6 ▁▃▁▇▁
2011 6 0.89 78.23 3.30 70.0 75.58 79.70 80.57 82.2 ▁▂▂▂▇
2010 5 0.91 77.81 3.54 68.5 75.15 79.30 80.35 82.0 ▁▂▂▃▇
2009 5 0.91 77.58 3.37 68.3 74.60 79.00 80.10 81.7 ▁▂▃▃▇
2008 5 0.91 77.20 3.72 67.5 74.30 78.80 79.85 81.9 ▁▁▃▃▇
2007 5 0.91 76.85 3.80 67.2 73.75 78.50 79.60 81.4 ▁▂▃▃▇
2006 5 0.91 76.67 3.83 66.3 73.75 78.30 79.40 81.2 ▁▁▃▂▇
2005 11 0.80 77.14 2.95 70.2 74.70 78.30 79.00 80.8 ▂▂▁▆▇
2004 12 0.79 77.18 2.91 70.6 75.12 78.25 78.93 81.2 ▂▁▁▇▃
2003 12 0.79 76.60 2.76 70.3 74.50 77.60 78.38 80.2 ▃▂▁▇▆
2002 12 0.79 76.50 2.80 69.9 74.58 77.50 78.30 80.0 ▂▂▂▇▇
2001 20 0.64 76.43 2.84 70.5 74.02 77.60 78.43 80.0 ▃▂▁▆▇
2000 21 0.62 76.15 2.74 70.7 73.90 77.20 78.10 79.4 ▃▂▁▇▇
1999 22 0.61 76.06 2.75 70.3 74.40 77.30 78.15 79.2 ▃▂▂▇▇
1998 22 0.61 75.81 2.84 69.3 74.25 76.90 77.88 79.0 ▂▂▁▃▇
1997 23 0.59 75.56 2.85 69.7 73.50 76.80 77.60 78.8 ▃▂▁▇▇
1996 23 0.59 75.34 2.82 69.4 73.40 76.40 77.50 78.6 ▃▂▂▇▇
1995 23 0.59 75.00 2.96 67.7 72.80 76.20 77.20 78.3 ▂▁▂▃▇
1994 24 0.57 74.94 3.18 66.6 72.65 76.05 77.43 78.6 ▁▂▃▅▇
1993 27 0.52 74.57 2.93 68.1 72.60 75.70 76.90 78.4 ▂▃▂▇▇
1992 29 0.48 74.48 2.82 69.1 71.75 75.10 76.90 78.2 ▃▃▂▇▇
1991 29 0.48 74.31 2.66 69.5 71.55 75.20 76.65 77.4 ▅▂▂▆▇
1990 29 0.48 74.29 2.62 69.4 71.25 75.00 76.60 77.5 ▃▃▂▆▇
1989 30 0.46 74.37 2.43 69.6 71.90 74.85 76.38 77.6 ▃▂▂▆▇
1988 30 0.46 74.27 2.24 70.2 72.12 74.85 76.20 77.1 ▅▂▂▅▇
1987 30 0.46 74.14 2.24 70.0 72.05 74.55 76.05 77.0 ▅▂▂▅▇
1986 30 0.46 73.98 2.20 69.6 72.17 74.30 75.90 77.4 ▅▂▂▇▆
1985 32 0.43 73.58 2.38 69.5 71.07 74.05 75.78 77.0 ▇▂▅▆▇
1984 35 0.38 73.34 2.48 69.5 71.10 73.70 76.00 77.0 ▇▃▃▅▇
1983 35 0.38 73.09 2.31 69.3 70.80 73.30 75.80 76.2 ▃▇▃▅▇
1982 35 0.38 73.20 2.25 69.8 71.20 73.20 75.70 76.6 ▇▅▅▂▇
1981 35 0.38 72.93 2.14 69.6 71.10 73.00 75.50 75.9 ▅▅▅▃▇
1980 35 0.38 72.78 2.18 69.7 70.60 72.80 75.30 76.4 ▇▂▆▁▇
1979 37 0.34 72.71 1.94 69.7 71.15 72.70 74.45 76.0 ▆▇▆▂▇
1978 36 0.36 72.66 2.08 69.8 71.00 72.05 74.62 76.5 ▇▅▂▅▃
1977 36 0.36 72.73 1.90 70.1 71.15 72.15 74.58 76.0 ▇▇▂▂▇
1976 37 0.34 72.58 1.90 70.0 71.10 72.10 74.30 76.5 ▇▆▁▆▁
1975 37 0.34 72.47 1.80 70.2 70.95 71.80 74.30 75.5 ▇▇▁▂▇
1974 38 0.32 72.39 1.70 69.9 71.03 71.95 74.15 75.5 ▇▇▃▃▆
1973 39 0.30 72.14 1.66 69.8 70.90 71.90 74.10 75.0 ▆▆▆▁▇
1972 39 0.30 72.11 1.59 70.4 71.00 71.50 73.80 74.9 ▇▆▁▁▅
1971 39 0.30 71.82 1.70 69.4 70.60 71.50 73.30 75.1 ▃▇▁▂▃
1970 40 0.29 71.93 1.66 70.0 70.68 71.40 73.42 74.9 ▇▃▁▂▃
1969 42 0.25 71.74 1.69 69.1 70.60 71.15 73.42 74.4 ▆▇▃▂▇
1968 42 0.25 72.02 1.49 69.8 70.95 71.25 73.72 74.0 ▂▇▁▂▅
1967 44 0.21 72.08 1.39 69.4 71.38 71.75 73.25 74.2 ▂▃▇▂▅
1966 44 0.21 72.02 1.45 68.9 71.42 71.65 72.85 74.1 ▁▁▇▂▃
1965 44 0.21 71.98 1.45 69.4 71.15 71.40 72.92 74.1 ▂▇▇▅▇
1964 44 0.21 72.08 1.38 69.0 71.55 71.85 72.90 74.0 ▂▁▇▅▅
1963 44 0.21 71.67 1.35 68.9 71.00 71.45 72.33 73.8 ▁▁▇▁▃
1962 44 0.21 71.53 1.58 68.8 70.57 71.20 72.35 74.0 ▂▅▇▁▅
1961 44 0.21 71.83 1.64 68.1 71.18 71.75 72.75 73.9 ▂▁▇▇▆
1960 46 0.18 71.13 1.32 68.7 70.62 71.00 71.55 73.9 ▂▆▇▂▂
ess9_ee %>% 
  select(idno,starts_with("trst")) %>% 
  zap_labels() %>%
  skim()
Data summary
Name Piped data
Number of rows 1904
Number of columns 8
_______________________
Column type frequency:
numeric 8
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
idno 0 1.00 24170.26 13955.91 6 11755.25 24549 35822.5 48636 ▇▇▇▇▇
trstprl 14 0.99 4.86 2.45 0 3.00 5 7.0 10 ▃▅▇▅▁
trstlgl 27 0.99 5.93 2.44 0 5.00 6 8.0 10 ▂▃▇▇▃
trstplc 6 1.00 7.03 2.24 0 6.00 8 9.0 10 ▁▁▅▇▅
trstplt 19 0.99 3.89 2.24 0 2.00 4 5.0 10 ▆▆▇▂▁
trstprt 23 0.99 3.75 2.17 0 2.00 4 5.0 10 ▆▆▇▂▁
trstep 131 0.93 4.63 2.54 0 3.00 5 6.0 10 ▅▅▇▅▁
trstun 153 0.92 4.94 2.61 0 3.00 5 7.0 10 ▅▅▇▅▂

skim() tulemuse saab samamoodi nagu iga R-i funktsiooni tulemuse salvestada muutujasse ning tekkinud tabelit võib omakorda edasi töödelda. Näiteks võime võtta top_n() funktsiooniga kaks tunnust, millel on kõige vähem puuduvaid väärtusi. Esimene neist on identifikaator, teine usaldus politseisse.

skim_ess9_ee <- ess9_ee %>% 
  select(idno,starts_with("trst")) %>% 
  zap_labels() %>%
  skim()

ess9_ee %>% 
  select(idno,starts_with("trst")) %>% 
  zap_labels() %>%
  skim() %>% 
  top_n(2,complete_rate)
Data summary
Name Piped data
Number of rows 1904
Number of columns 8
_______________________
Column type frequency:
numeric 2
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
idno 0 1 24170.26 13955.91 6 11755.25 24549 35822.5 48636 ▇▇▇▇▇
trstplc 6 1 7.03 2.24 0 6.00 8 9.0 10 ▁▁▅▇▅
ess9_ee %>% 
  select(idno,starts_with("trst")) %>% 
  #rio::characterize() %>% 
  zap_labels() %>% 
  skim()
Data summary
Name Piped data
Number of rows 1904
Number of columns 8
_______________________
Column type frequency:
numeric 8
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
idno 0 1.00 24170.26 13955.91 6 11755.25 24549 35822.5 48636 ▇▇▇▇▇
trstprl 14 0.99 4.86 2.45 0 3.00 5 7.0 10 ▃▅▇▅▁
trstlgl 27 0.99 5.93 2.44 0 5.00 6 8.0 10 ▂▃▇▇▃
trstplc 6 1.00 7.03 2.24 0 6.00 8 9.0 10 ▁▁▅▇▅
trstplt 19 0.99 3.89 2.24 0 2.00 4 5.0 10 ▆▆▇▂▁
trstprt 23 0.99 3.75 2.17 0 2.00 4 5.0 10 ▆▆▇▂▁
trstep 131 0.93 4.63 2.54 0 3.00 5 6.0 10 ▅▅▇▅▁
trstun 153 0.92 4.94 2.61 0 3.00 5 7.0 10 ▅▅▇▅▂

6.2 Andmete grupeerimine

Andmestikku on ka võimalik mingil alusel grupeerida funktsiooniga group_by(). Sellisel juhul saab paljusid funktsioone rakendada grupi kaupa. Ja tekitada koondtabeleid funktsiooniga nest(). nest() koondab tabeli gruppide kaupa kokku, nii et tekib nö tabel tabelis. group_by() esialgu lihtsalt lisab tabelile tunnuse. nest() koondab gruppide kaupa ülejäänud tunnused eraldi tabeliteks. Grupeerida ja koondada saab korraga mitme tunnuse alusel. Koondatud tabelis on võimalik kasutada funktsioone iga koondvälja kohta. Sellest siin me ei räägi, aga edasi võib lugeda sel teemal Grolemund & Wickham, 2017 raamatust siit.

gapminder %>% 
  group_by(country)
## # A tibble: 1,704 x 6
## # Groups:   country [142]
##    country     continent  year lifeExp      pop gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.
## # … with 1,694 more rows
gapminder %>% 
  group_by(country) %>% 
  nest()
## # A tibble: 142 x 2
## # Groups:   country [142]
##    country     data             
##    <chr>       <list>           
##  1 Afghanistan <tibble [12 × 5]>
##  2 Albania     <tibble [12 × 5]>
##  3 Algeria     <tibble [12 × 5]>
##  4 Angola      <tibble [12 × 5]>
##  5 Argentina   <tibble [12 × 5]>
##  6 Australia   <tibble [12 × 5]>
##  7 Austria     <tibble [12 × 5]>
##  8 Bahrain     <tibble [12 × 5]>
##  9 Bangladesh  <tibble [12 × 5]>
## 10 Belgium     <tibble [12 × 5]>
## # … with 132 more rows
gapminder %>% 
  group_by(country,continent) %>% 
  nest()
## # A tibble: 142 x 3
## # Groups:   country, continent [142]
##    country     continent data             
##    <chr>       <chr>     <list>           
##  1 Afghanistan Asia      <tibble [12 × 4]>
##  2 Albania     Europe    <tibble [12 × 4]>
##  3 Algeria     Africa    <tibble [12 × 4]>
##  4 Angola      Africa    <tibble [12 × 4]>
##  5 Argentina   Americas  <tibble [12 × 4]>
##  6 Australia   Oceania   <tibble [12 × 4]>
##  7 Austria     Europe    <tibble [12 × 4]>
##  8 Bahrain     Asia      <tibble [12 × 4]>
##  9 Bangladesh  Asia      <tibble [12 × 4]>
## 10 Belgium     Europe    <tibble [12 × 4]>
## # … with 132 more rows

6.2.1 Grupi parameetrite abil filtreerimine

Grupeerimine muudab ka veidi teiste funktsioonide toimeviisi. Nimelt, kus vähegi midagi arvutatakse, tehakse seda grupi kaupa. Selle jaoks on R-is hulk funktsioone - lihtsamad neist on mean(), median(), sd(), min(), max(), row_number(), first(), last(), n(). Nende sisu peaks olema üldiselt ennastseletav. Täpsema info jaoks lisage mõiste ette küsimärk ?, nt ?row_number ja uurige lähemalt.

Kui me filtreerime andmestikku ilma gruppideta, siis iga funktsioon töötab terve andmestiku peal. Näiteks row_number()<10 võtab esimesed 10 rida andmestikust. Püüdes võtta keskmist filtri aluseks, kasutades funktsiooni mean() tunnuse pop peal, võtab tabel keskmise kõigi vaatlusandmete peale. (Antud juhul 29.6 miljonit.) Kui me nüüd proovime filtreerida selle osa tabelist, kus on keskmine rahvaarv üle 30 miljoni, saame vastuseks tühja tabeli, kuna keskmine on väiksem. Otsides ridu, millel keskmine on väiksem, saame kõik read tagasi.

gapminder %>% 
  filter(row_number()<10)
## # A tibble: 9 x 6
##   country     continent  year lifeExp      pop gdpPercap
##   <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
## 1 Afghanistan Asia       1952    28.8  8425333      779.
## 2 Afghanistan Asia       1957    30.3  9240934      821.
## 3 Afghanistan Asia       1962    32.0 10267083      853.
## 4 Afghanistan Asia       1967    34.0 11537966      836.
## 5 Afghanistan Asia       1972    36.1 13079460      740.
## 6 Afghanistan Asia       1977    38.4 14880372      786.
## 7 Afghanistan Asia       1982    39.9 12881816      978.
## 8 Afghanistan Asia       1987    40.8 13867957      852.
## 9 Afghanistan Asia       1992    41.7 16317921      649.
gapminder %>% 
  filter(mean(pop)>30000000)
## # A tibble: 0 x 6
## # … with 6 variables: country <chr>, continent <chr>, year <dbl>,
## #   lifeExp <dbl>, pop <dbl>, gdpPercap <dbl>
gapminder %>% 
  filter(mean(pop)<30000000)
## # A tibble: 1,704 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.
## # … with 1,694 more rows

Me saame sama teha aga olles grupeerinud andmestiku riigi kaupa ja sel juhul row_number()<5 annab meile igas grupis esimesed 5 rida, max(pop)>30000000 annab meile ainult riigid, kus oli rahvaarv ka keskmiselt suurem kui 30 miljonit läbi ajaperioodi. sample_n() funktsioon annab samas kindla arvu juhuslikke väärtusi igas grupis.

# 4 esimest aastat iga riigi kohta
gapminder %>% 
  group_by(country) %>% 
  filter(row_number()<5)
## # A tibble: 568 x 6
## # Groups:   country [142]
##    country     continent  year lifeExp      pop gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Albania     Europe     1952    55.2  1282697     1601.
##  6 Albania     Europe     1957    59.3  1476505     1942.
##  7 Albania     Europe     1962    64.8  1728137     2313.
##  8 Albania     Europe     1967    66.2  1984060     2760.
##  9 Algeria     Africa     1952    43.1  9279525     2449.
## 10 Algeria     Africa     1957    45.7 10270856     3014.
## # … with 558 more rows
# Riigid, kus oli keskmine rahvaarv üle 30 000 000
gapminder %>% 
  group_by(country) %>% 
  filter(mean(pop)>30000000)
## # A tibble: 312 x 6
## # Groups:   country [26]
##    country    continent  year lifeExp       pop gdpPercap
##    <chr>      <chr>     <dbl>   <dbl>     <dbl>     <dbl>
##  1 Bangladesh Asia       1952    37.5  46886859      684.
##  2 Bangladesh Asia       1957    39.3  51365468      662.
##  3 Bangladesh Asia       1962    41.2  56839289      686.
##  4 Bangladesh Asia       1967    43.5  62821884      721.
##  5 Bangladesh Asia       1972    45.3  70759295      630.
##  6 Bangladesh Asia       1977    46.9  80428306      660.
##  7 Bangladesh Asia       1982    50.0  93074406      677.
##  8 Bangladesh Asia       1987    52.8 103764241      752.
##  9 Bangladesh Asia       1992    56.0 113704579      838.
## 10 Bangladesh Asia       1997    59.4 123315288      973.
## # … with 302 more rows
# Riigid, kus oli maksimaalne rahvaarv üle 100 000 000
gapminder %>% 
  group_by(country) %>% 
  filter(mean(pop)>100000000)
## # A tibble: 72 x 6
## # Groups:   country [6]
##    country continent  year lifeExp       pop gdpPercap
##    <chr>   <chr>     <dbl>   <dbl>     <dbl>     <dbl>
##  1 Brazil  Americas   1952    50.9  56602560     2109.
##  2 Brazil  Americas   1957    53.3  65551171     2487.
##  3 Brazil  Americas   1962    55.7  76039390     3337.
##  4 Brazil  Americas   1967    57.6  88049823     3430.
##  5 Brazil  Americas   1972    59.5 100840058     4986.
##  6 Brazil  Americas   1977    61.5 114313951     6660.
##  7 Brazil  Americas   1982    63.3 128962939     7031.
##  8 Brazil  Americas   1987    65.2 142938076     7807.
##  9 Brazil  Americas   1992    67.1 155975974     6950.
## 10 Brazil  Americas   1997    69.4 168546719     7958.
## # … with 62 more rows
# 4 esimest aastat iga riigi kohta
gapminder %>% 
  group_by(continent) %>% 
  sample_n(5)
## # A tibble: 25 x 6
## # Groups:   continent [5]
##    country                  continent  year lifeExp      pop gdpPercap
##    <chr>                    <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Central African Republic Africa     1967    41.5  1733638     1136.
##  2 Lesotho                  Africa     1962    47.7   893143      412.
##  3 Tunisia                  Africa     1962    49.6  4286552     1660.
##  4 Ethiopia                 Africa     1982    44.9 38111756      578.
##  5 Reunion                  Africa     1992    73.6   622191     6101.
##  6 Ecuador                  Americas   1972    58.8  6298651     5281.
##  7 Canada                   Americas   1967    72.1 20819767    16077.
##  8 Costa Rica               Americas   1987    74.8  2799811     5630.
##  9 Nicaragua                Americas   1987    62.0  3344353     2956.
## 10 Panama                   Americas   1992    72.5  2484997     6619.
## # … with 15 more rows

6.2.2 Koondülevaated gruppide kaupa

Samuti võime kasutada group_by() funktsiooni, koos skim() funktsioonis, mis koondab siis ülevaate iga grupi kohta eraldi. Grupeerime tabeli aastate kaupa ja kasutame skim() funktsiooni seal.

# Tervikandmestiku ülevaade
gapminder %>% 
  select(year,lifeExp) %>% 
  skim()
Data summary
Name Piped data
Number of rows 1704
Number of columns 2
_______________________
Column type frequency:
numeric 2
________________________
Group variables None

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
year 0 1 1979.50 17.27 1952.0 1965.75 1979.50 1993.25 2007.0 ▇▅▅▅▇
lifeExp 0 1 59.47 12.92 23.6 48.20 60.71 70.85 82.6 ▁▆▇▇▇
# Aastate kaupa ülevaade
gapminder %>% 
  select(year,lifeExp) %>% 
  group_by(year) %>% 
  skim()
Data summary
Name Piped data
Number of rows 1704
Number of columns 2
_______________________
Column type frequency:
numeric 1
________________________
Group variables year

Variable type: numeric

skim_variable year n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
lifeExp 1952 0 1 49.06 12.23 28.80 39.06 45.14 59.77 72.67 ▅▇▃▃▅
lifeExp 1957 0 1 51.51 12.23 30.33 41.25 48.36 63.04 73.47 ▃▇▃▃▅
lifeExp 1962 0 1 53.61 12.10 32.00 43.47 50.88 65.23 73.68 ▃▇▃▃▆
lifeExp 1967 0 1 55.68 11.72 34.02 46.03 53.83 67.42 74.16 ▃▇▅▃▇
lifeExp 1972 0 1 57.65 11.38 35.40 48.50 56.53 69.25 74.72 ▃▆▅▃▇
lifeExp 1977 0 1 59.57 11.23 31.22 50.48 59.67 70.38 76.11 ▁▅▆▅▇
lifeExp 1982 0 1 61.53 10.77 38.45 52.94 62.44 70.92 77.11 ▂▃▅▅▇
lifeExp 1987 0 1 63.21 10.56 39.91 54.94 65.83 71.88 78.67 ▃▃▅▆▇
lifeExp 1992 0 1 64.16 11.23 23.60 56.12 67.70 72.58 79.36 ▁▁▃▅▇
lifeExp 1997 0 1 65.01 11.56 36.09 55.63 69.39 74.17 80.69 ▂▃▃▅▇
lifeExp 2002 0 1 65.69 12.28 39.19 55.52 70.83 75.46 82.00 ▃▃▃▆▇
lifeExp 2007 0 1 67.01 12.07 39.61 57.16 71.94 76.41 82.60 ▂▃▃▆▇

6.2.3 Juhusliku grupi valimine

sample_n() funktsioon valib üldiselt juhusliku rea. Kasutades group_by() ja nest() funktsiooni ning neid õigel hetkel lahti harutades ungroup() ja unnest() funktsioonidega võime ka leida ühe juhusliku riigi ning võtta kõik andmed selle kohta. Juhusliku grupi saamiseks andmestikust on üpris palju viise, levinuim ja selgem variant on ehk kasutada selleks mõnd välist muutujat ja filtrit, mis valitud juhusliku riigi hetkeks salvestab.

gapminder %>%
  group_by(country) %>% 
  sample_n(1)
## # A tibble: 142 x 6
## # Groups:   country [142]
##    country     continent  year lifeExp       pop gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>     <dbl>     <dbl>
##  1 Afghanistan Asia       1962    32.0  10267083      853.
##  2 Albania     Europe     1957    59.3   1476505     1942.
##  3 Algeria     Africa     1972    54.5  14760787     4183.
##  4 Angola      Africa     1982    39.9   7016384     2757.
##  5 Argentina   Americas   1952    62.5  17876956     5911.
##  6 Australia   Oceania    2002    80.4  19546792    30688.
##  7 Austria     Europe     1982    73.2   7574613    21597.
##  8 Bahrain     Asia       1992    72.6    529491    19036.
##  9 Bangladesh  Asia       2007    64.1 150448339     1391.
## 10 Belgium     Europe     1957    69.2   8989111     9715.
## # … with 132 more rows
gapminder %>%
  group_by(country) %>% 
  nest() %>% 
  ungroup() %>% 
  sample_n(1)
## # A tibble: 1 x 2
##   country  data             
##   <chr>    <list>           
## 1 Bulgaria <tibble [12 × 5]>
gapminder %>% 
  group_by(country) %>%
  nest() %>% 
  ungroup() %>% 
  sample_n(1) %>% 
  unnest() %>% 
  skim()
## Warning: `cols` is now required.
## Please use `cols = c(data)`
Data summary
Name Piped data
Number of rows 12
Number of columns 6
_______________________
Column type frequency:
character 2
numeric 4
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
country 0 1 16 16 0 1 0
continent 0 1 4 4 0 1 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
year 0 1 1979.50 18.03 1952.00 1965.75 1979.50 1993.25 2007.00 ▇▅▅▅▇
lifeExp 0 1 73.49 6.69 60.96 69.41 74.53 78.20 82.21 ▅▂▇▇▇
pop 0 1 4792259.33 1615040.81 2125900.00 3618400.00 4924100.00 5996251.50 6980412.00 ▅▅▅▇▇
gdpPercap 0 1 16228.70 12207.33 3054.42 5821.63 12873.34 25662.61 39724.98 ▇▃▃▃▂
selected <- gapminder %>% 
  sample_n(1) %>% 
  pull(country)

gapminder %>% 
  filter(country==selected) %>% 
  skim()
Data summary
Name Piped data
Number of rows 12
Number of columns 6
_______________________
Column type frequency:
character 2
numeric 4
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
country 0 1 5 5 0 1 0
continent 0 1 6 6 0 1 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
year 0 1 1979.50 18.03 1952.00 1965.75 1979.50 1993.25 2007.00 ▇▅▅▅▇
lifeExp 0 1 44.56 6.51 37.44 39.96 41.94 48.37 56.87 ▇▂▁▁▂
pop 0 1 6857373.83 3094078.75 3379468.00 4419548.50 6059637.00 8711176.50 12894865.00 ▇▃▃▂▃
gdpPercap 0 1 781.08 171.55 580.31 615.03 785.39 920.84 1054.38 ▇▂▃▃▃

7 Tunnuste loomine

Seni oleme vaadanud kuidas tabelist soovitud tunnuseid ja ridu kätte saada ning valimit koostada. Enamasti tuleb andmete analüüsis aga olemasolevaid andmeid ka muundada ja uusi väärtusi välja arvutada. Selleks on peamised funktsioonid mutate(), mis lisab tabelile tulba, ja summarise(), mis teeb grupeerivate tunnuste kohta käiva tulba koondtabelis. Need käivad koos funktsioonidega group_by() ja ungroup() grupeerimiseks. Lisaks võib kasutada funktsiooni arrange() tulemuste järjestamiseks. Tunnuste loomisel on hulk lihtsamaid funktsioone, nt mean(), max(), min(), sd(), log(), n(), row_number(), first(), last(), rank(), mille tähendus võiks olla nimest mõistetav. Täpsemaks uurimiseks kasutage küsimärki funktsiooni ees, nt ?rank. arrange() käsku saab kasutada tabeli mingi tulba järgi järjestamiseks, desc() funktsioon selle sees teeb järjestuse kahanevaks.

  • summarise() võtad andmed kokku mõne funktsiooniga
  • mutate() loo uus muutuja
  • mean(), max(), min(), sd(), log(), n(), row_number(), first(), last(), rank()

  • group_by() grupeeri andmestik
  • ungroup()
  • arrange() järjesta väärtuse järgi

Käsk mutate() teeb uue muutuja. Parameetrina antakse seal uue tunnuse nimi ja selle sisu. Kui uue tunnuse nimi kattub vanaga, siis kirjutatakse see ümber. Lihtsa näidisena võime arvutada uue tunnuse nimega GDP korrutades GDP inimese kohta rahvaarvuga. Tulemuseks on uus tunnus tabelis, GDP. Tähele tasub panna, et samamoodi nagu muude käskudega, tulemused ei salvestu muutujasse enne kui me seda ise teeme.

gapminder %>% 
  mutate(gdp = pop * gdpPercap)
## # A tibble: 1,704 x 7
##    country     continent  year lifeExp      pop gdpPercap          gdp
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>        <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.  6567086330.
##  2 Afghanistan Asia       1957    30.3  9240934      821.  7585448670.
##  3 Afghanistan Asia       1962    32.0 10267083      853.  8758855797.
##  4 Afghanistan Asia       1967    34.0 11537966      836.  9648014150.
##  5 Afghanistan Asia       1972    36.1 13079460      740.  9678553274.
##  6 Afghanistan Asia       1977    38.4 14880372      786. 11697659231.
##  7 Afghanistan Asia       1982    39.9 12881816      978. 12598563401.
##  8 Afghanistan Asia       1987    40.8 13867957      852. 11820990309.
##  9 Afghanistan Asia       1992    41.7 16317921      649. 10595901589.
## 10 Afghanistan Asia       1997    41.8 22227415      635. 14121995875.
## # … with 1,694 more rows

7.1 Koondtunnuse loomine

summarise() käsk arvutab koondväärtusi grupeerimistunnuste alusel. Kui meil pole tabel grupeeritud kuidagi, annab summarise() ühe vastuse. Näiteks saame sellega arvutada suurima gdp terve tabeli peale funktsiooniga max(). Selle funktsioni sisse saame asetada ükskõik mis tehte, mille tulemuseks on arvväärtus. Niisiis võime arvutada gdp väärtuse otse selle sees. Alternatiivina võime alguses teha uue tulba ja siis võtta sellest maksimumi. Tulemus on sama.

gapminder %>% 
 summarise(maxgdp = max(pop * gdpPercap))
## # A tibble: 1 x 1
##    maxgdp
##     <dbl>
## 1 1.29e13
gapminder %>% 
  mutate(gdp = pop * gdpPercap) %>% 
  summarise(maxgdp = max(gdp))
## # A tibble: 1 x 1
##    maxgdp
##     <dbl>
## 1 1.29e13

Et luua mitu uut tulpa või koondtulpa, võime kirjutada funktsiooni sees mitme uue tulba sisendi ja eraldada need komadega.

gapminder %>% 
 summarise(maxpop=max(pop), maxgdppercap=max(gdpPercap), maxgdp = max(pop * gdpPercap))
## # A tibble: 1 x 3
##       maxpop maxgdppercap  maxgdp
##        <dbl>        <dbl>   <dbl>
## 1 1318683096      113523. 1.29e13

7.2 Koondtabelid

Kombineerides summarise() group_by() funktsiooniga, saame tekitada mitmesuguseid koondtabeleid. Näiteks 1) suurim gdp maailmjao kohta, suurim gdp riigi kohta

# group_by() + summarise()
# Suurim gdp maailmajao kohta
gapminder %>% 
  mutate(gdp = pop * gdpPercap) %>% 
  group_by(continent) %>% 
  summarise(max_gdp = max(gdp))
## # A tibble: 5 x 2
##   continent max_gdp
##   <chr>       <dbl>
## 1 Africa    4.48e11
## 2 Americas  1.29e13
## 3 Asia      6.54e12
## 4 Europe    2.65e12
## 5 Oceania   7.04e11
# Suurim gdp riigi kohta 
gapminder %>% 
  group_by(country) %>% 
  summarise(max_gdpPercap = max(gdpPercap)) %>% 
  arrange(desc(max_gdpPercap))
## # A tibble: 142 x 2
##    country          max_gdpPercap
##    <chr>                    <dbl>
##  1 Kuwait                 113523.
##  2 Norway                  49357.
##  3 Singapore               47143.
##  4 United States           42952.
##  5 Ireland                 40676.
##  6 Hong Kong, China        39725.
##  7 Switzerland             37506.
##  8 Netherlands             36798.
##  9 Canada                  36319.
## 10 Iceland                 36181.
## # … with 132 more rows

7.3 Lisatunnuse loomine

Kui summarise() teeb sellest koondtulba, siis mutate() teeb sellesisulise uue tulba. Kui käsk nagu max() annab grupi kohta ainult ühe väärtuse, siis mutate() paneb igale positsioonile selle tulemuse.

gapminder %>% 
  group_by(country) %>% 
  mutate(max_gdpPercap=max(gdpPercap))
## # A tibble: 1,704 x 7
## # Groups:   country [142]
##    country     continent  year lifeExp      pop gdpPercap max_gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>         <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.          978.
##  2 Afghanistan Asia       1957    30.3  9240934      821.          978.
##  3 Afghanistan Asia       1962    32.0 10267083      853.          978.
##  4 Afghanistan Asia       1967    34.0 11537966      836.          978.
##  5 Afghanistan Asia       1972    36.1 13079460      740.          978.
##  6 Afghanistan Asia       1977    38.4 14880372      786.          978.
##  7 Afghanistan Asia       1982    39.9 12881816      978.          978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.          978.
##  9 Afghanistan Asia       1992    41.7 16317921      649.          978.
## 10 Afghanistan Asia       1997    41.8 22227415      635.          978.
## # … with 1,694 more rows

Seda omakorda saab kasutada edasises töötluses. Näiteks, kui meid huvitab mis aastal oli riigil kõrgeim gdp inimese kohta, saame filtreerida loodud tulba järgi.

gapminder %>% 
  group_by(country) %>% 
  mutate(max_gdpPercap=max(gdpPercap)) %>% 
  filter(gdpPercap == max_gdpPercap) %>% 
  select(country,continent,year,gdpPercap) %>% 
  arrange(desc(gdpPercap))
## # A tibble: 142 x 4
## # Groups:   country [142]
##    country          continent  year gdpPercap
##    <chr>            <chr>     <dbl>     <dbl>
##  1 Kuwait           Asia       1957   113523.
##  2 Norway           Europe     2007    49357.
##  3 Singapore        Asia       2007    47143.
##  4 United States    Americas   2007    42952.
##  5 Ireland          Europe     2007    40676.
##  6 Hong Kong, China Asia       2007    39725.
##  7 Switzerland      Europe     2007    37506.
##  8 Netherlands      Europe     2007    36798.
##  9 Canada           Americas   2007    36319.
## 10 Iceland          Europe     2007    36181.
## # … with 132 more rows

Võime omakorda eraldada sellest riigid, mil “rikkaim” aasta inimese kohta ei olnud viimane aasta.

gapminder %>% 
  group_by(country) %>% 
  mutate(max_gdpPercap=max(gdpPercap),max_year=max(year)) %>% 
  filter(gdpPercap == max_gdpPercap) %>% 
  filter(!year==max_year) %>% 
  select(country,continent,year,gdpPercap) %>% 
  arrange(year)
## # A tibble: 40 x 4
## # Groups:   country [40]
##    country                  continent  year gdpPercap
##    <chr>                    <chr>     <dbl>     <dbl>
##  1 Congo, Dem. Rep.         Africa     1957      906.
##  2 Kuwait                   Asia       1957   113523.
##  3 Central African Republic Africa     1962     1193.
##  4 Angola                   Africa     1967     5523.
##  5 Niger                    Africa     1967     1054.
##  6 Zambia                   Africa     1967     1777.
##  7 Comoros                  Africa     1972     1938.
##  8 Djibouti                 Africa     1972     3694.
##  9 Jamaica                  Americas   1972     7434.
## 10 Liberia                  Africa     1972      803.
## # … with 30 more rows

Neid arvutusi saab teha ka filter() käsu sees, mis nähtamatult tekitab uue tulba ja siis filtreerib selle põhjal. Järgmiste ridadega saame sama tulemuse.

gapminder %>% 
  group_by(country) %>% 
  filter(gdpPercap == max(gdpPercap), !year == max(year)) %>% 
  select(country,continent,year,gdpPercap) %>% 
  arrange(year)
## # A tibble: 40 x 4
## # Groups:   country [40]
##    country                  continent  year gdpPercap
##    <chr>                    <chr>     <dbl>     <dbl>
##  1 Congo, Dem. Rep.         Africa     1957      906.
##  2 Kuwait                   Asia       1957   113523.
##  3 Central African Republic Africa     1962     1193.
##  4 Angola                   Africa     1967     5523.
##  5 Niger                    Africa     1967     1054.
##  6 Zambia                   Africa     1967     1777.
##  7 Comoros                  Africa     1972     1938.
##  8 Djibouti                 Africa     1972     3694.
##  9 Jamaica                  Americas   1972     7434.
## 10 Liberia                  Africa     1972      803.
## # … with 30 more rows

Võime summarise() funktsiooni abil arvutada ka mõne tunnuse keskmise, kasutades mean() funktsiooni.

# Maailmajagude keskmine gdp inimese kohta
gapminder %>% 
  group_by(continent) %>% 
  summarise(mean_gdpPercap = mean(gdpPercap)) 
## # A tibble: 5 x 2
##   continent mean_gdpPercap
##   <chr>              <dbl>
## 1 Africa             2194.
## 2 Americas           7136.
## 3 Asia               7902.
## 4 Europe            14469.
## 5 Oceania           18622.
# Kontinentide võrdlus ajas, gdp
gapminder %>% 
  group_by(continent,year) %>% 
  summarise(mean_gdpPercap = mean(gdpPercap))
## # A tibble: 60 x 3
## # Groups:   continent [5]
##    continent  year mean_gdpPercap
##    <chr>     <dbl>          <dbl>
##  1 Africa     1952          1253.
##  2 Africa     1957          1385.
##  3 Africa     1962          1598.
##  4 Africa     1967          2050.
##  5 Africa     1972          2340.
##  6 Africa     1977          2586.
##  7 Africa     1982          2482.
##  8 Africa     1987          2283.
##  9 Africa     1992          2282.
## 10 Africa     1997          2379.
## # … with 50 more rows

Võime summarise() funktsiooni abil arvutada ka mõne tunnuse keskmise, kasutades mean() funktsiooni. Lisades komadega tunnuseid, saame arvutada ka muid väärtusi.

# Maailmajagude keskmine gdp inimese kohta
gapminder %>% 
  group_by(continent) %>% 
  summarise(mean_gdpPercap = mean(gdpPercap),sd_gdpPercap = sd(gdpPercap), median_gdpPercap=median(gdpPercap),min_gdpPercap = min(gdpPercap),max_gdpPercap = max(gdpPercap)) 
## # A tibble: 5 x 6
##   continent mean_gdpPercap sd_gdpPercap median_gdpPercap min_gdpPercap
##   <chr>              <dbl>        <dbl>            <dbl>         <dbl>
## 1 Africa             2194.        2828.            1192.          241.
## 2 Americas           7136.        6397.            5466.         1202.
## 3 Asia               7902.       14045.            2647.          331 
## 4 Europe            14469.        9355.           12082.          974.
## 5 Oceania           18622.        6359.           17983.        10040.
## # … with 1 more variable: max_gdpPercap <dbl>

Kui me tahame arvutada midagi koondtunnuste põhjal, peame arvutama selle pärast koondtunnuseid.

# Maailmajagude keskmine gdp inimese kohta ja selle paremusjärjestus.
gapminder %>% 
  group_by(continent) %>% 
  summarise(mean_gdpPercap = mean(gdpPercap),sd_gdpPercap = sd(gdpPercap), median_gdpPercap=median(gdpPercap),min_gdpPercap = min(gdpPercap),max_gdpPercap = max(gdpPercap)) %>% 
  mutate(rank=rank(-mean_gdpPercap))
## # A tibble: 5 x 7
##   continent mean_gdpPercap sd_gdpPercap median_gdpPercap min_gdpPercap
##   <chr>              <dbl>        <dbl>            <dbl>         <dbl>
## 1 Africa             2194.        2828.            1192.          241.
## 2 Americas           7136.        6397.            5466.         1202.
## 3 Asia               7902.       14045.            2647.          331 
## 4 Europe            14469.        9355.           12082.          974.
## 5 Oceania           18622.        6359.           17983.        10040.
## # … with 2 more variables: max_gdpPercap <dbl>, rank <dbl>

7.4 Arvutused üle mitme tulba

On võimalik ka rea kaupa grupeerida, siis võib võtta näiteks keskmiste väärtusi üle tulpade.

ess9_ee %>% 
  select(idno,starts_with("trst")) %>% 
  group_by(row_number()) %>% 
  mutate(extracol=mean(c(trstprl,trstlgl,trstplc)))
## # A tibble: 1,904 x 10
## # Groups:   row_number() [1,904]
##     idno trstprl trstlgl  trstplc trstplt trstprt   trstep trstun `row_number()`
##    <dbl> <dbl+l> <dbl+l> <dbl+lb> <dbl+l> <dbl+l> <dbl+lb> <dbl+>          <int>
##  1     6   5 [5]   5 [5]  7 [7]     4 [4] 5 [5]    5 [5]    5 [5]              1
##  2    22   6 [6]   6 [6]  8 [8]     6 [6] 5 [5]    8 [8]    9 [9]              2
##  3    33   8 [8]   8 [8]  8 [8]     3 [3] 3 [3]    6 [6]    7 [7]              3
##  4    48   3 [3]   4 [4]  5 [5]     5 [5] 5 [5]    5 [5]    5 [5]              4
##  5    51   5 [5]   5 [5]  8 [8]     7 [7] 7 [7]   NA       NA                  5
##  6   101   7 [7]   3 [3] 10 [Com…   1 [1] 0 [No … 10 [Com…  3 [3]              6
##  7   102   4 [4]   7 [7]  8 [8]     3 [3] 3 [3]    5 [5]    8 [8]              7
##  8   113   7 [7]   8 [8]  7 [7]     6 [6] 6 [6]    7 [7]    7 [7]              8
##  9   114   6 [6]   9 [9]  9 [9]     2 [2] 2 [2]    8 [8]    9 [9]              9
## 10   121   7 [7]   7 [7] 10 [Com…   7 [7] 7 [7]   NA       NA                 10
## # … with 1,894 more rows, and 1 more variable: extracol <dbl>

7.5 Kategooriliste faktortunnuste loomine

Tihti on meil tarvis teha arvu jada kategooriliseks väärtuseks. Selleks on mitmeid võimalusi. Peamise teeb ära käsk cut(), mis lõikab numbertunnuse ettenähtud arvu gruppideks või ettenähtud kohtadest. Näiteks teeme gapminder andmestikus oodatava eluea tunnuse gruppideks etteantud kohtadest või neljaks grupiks, mille ulatus tunnuse skaalal oleks enamvähem sama suur.

cut() tüüpi käsud teevad numbrijadast järjestatud faktori, lisades tüüpideabil väärtuse. Oluline on, et kui seda võtta numberväärtusena siis on nii…

gapminder %>% 
  filter(year==1957) %>% 
  mutate(lifeExp_cut=cut(lifeExp,breaks=c(0,30,60,70,80,90))) %>% 
  sample_n(10)
## # A tibble: 10 x 7
##    country            continent  year lifeExp      pop gdpPercap lifeExp_cut
##    <chr>              <chr>     <dbl>   <dbl>    <dbl>     <dbl> <fct>      
##  1 Cuba               Americas   1957    62.3  6640752     6092. (60,70]    
##  2 Venezuela          Americas   1957    57.9  6702668     9802. (30,60]    
##  3 Morocco            Africa     1957    45.4 11406350     1642. (30,60]    
##  4 Bolivia            Americas   1957    41.9  3211738     2128. (30,60]    
##  5 Burundi            Africa     1957    40.5  2667518      380. (30,60]    
##  6 Mali               Africa     1957    35.3  4241884      490. (30,60]    
##  7 Japan              Asia       1957    65.5 91563009     4318. (60,70]    
##  8 Indonesia          Asia       1957    39.9 90124000      859. (30,60]    
##  9 Libya              Africa     1957    45.3  1201578     3448. (30,60]    
## 10 Dominican Republic Americas   1957    49.8  2923186     1544. (30,60]
gapminder %>% 
  filter(year==1957) %>% 
  mutate(lifeExp_cut=cut(lifeExp,breaks=4)) %>% 
  sample_n(10)
## # A tibble: 10 x 7
##    country      continent  year lifeExp      pop gdpPercap lifeExp_cut
##    <chr>        <chr>     <dbl>   <dbl>    <dbl>     <dbl> <fct>      
##  1 Vietnam      Asia       1957    42.9 28998543      676. (41.1,51.9]
##  2 Honduras     Americas   1957    44.7  1770390     2220. (41.1,51.9]
##  3 Bahrain      Asia       1957    53.8   138655    11636. (51.9,62.7]
##  4 Canada       Americas   1957    70.0 17010154    12490. (62.7,73.5]
##  5 Bangladesh   Asia       1957    39.3 51365468      662. (30.3,41.1]
##  6 Togo         Africa     1957    41.2  1357445      926. (41.1,51.9]
##  7 Oman         Asia       1957    40.1   561977     2243. (30.3,41.1]
##  8 Algeria      Africa     1957    45.7 10270856     3014. (41.1,51.9]
##  9 Libya        Africa     1957    45.3  1201578     3448. (41.1,51.9]
## 10 Sierra Leone Africa     1957    31.6  2295678     1004. (30.3,41.1]

Me võime asendada väärtusi piiritlevad grupid ka muude siltidega.

gapminder %>% 
  filter(year==1957) %>% 
  mutate(lifeExp_cut=cut(lifeExp,breaks=3,labels=c("madal","keskmine","kõrge"))) %>% 
  sample_n(10)
## # A tibble: 10 x 7
##    country         continent  year lifeExp      pop gdpPercap lifeExp_cut
##    <chr>           <chr>     <dbl>   <dbl>    <dbl>     <dbl> <fct>      
##  1 Slovak Republic Europe     1957    67.4  3844277     6093. kõrge      
##  2 United Kingdom  Europe     1957    70.4 51430000    11283. kõrge      
##  3 Panama          Americas   1957    59.2  1063506     2962. kõrge      
##  4 Nicaragua       Americas   1957    45.4  1358828     3457. keskmine   
##  5 Pakistan        Asia       1957    45.6 46679944      747. keskmine   
##  6 Switzerland     Europe     1957    70.6  5126000    17909. kõrge      
##  7 Canada          Americas   1957    70.0 17010154    12490. kõrge      
##  8 Cuba            Americas   1957    62.3  6640752     6092. kõrge      
##  9 Serbia          Europe     1957    61.7  7271135     4981. kõrge      
## 10 Haiti           Americas   1957    40.7  3507701     1727. madal

Tidyverse pakettides on selleks ka paar abifunktsiooni, cut_interval(), cut_number(), cut_width(), mis kasutavad eri meetodeid grupisuuruste arvutamiseks. cut_interval() teeb rühmad, millel n rühma on sama intervall, cut_number() teeb n rühma, millel on enamvähem sama palju liikmeid, cut_width() teeb rühmad ettemääratud intervalli järgi. Loeme kokku palju igas grupis on count() funktsiooni kaudu. count() funktsioon teeb sama kui group_by() ja summarise(n=n()) koos.

gapminder %>% 
  filter(year==1957) %>%
  mutate(group= cut_interval(lifeExp,4)) %>%
  count(group)
## # A tibble: 4 x 2
##   group           n
##   <fct>       <int>
## 1 [30.3,41.1]    35
## 2 (41.1,51.9]    45
## 3 (51.9,62.7]    26
## 4 (62.7,73.5]    36
gapminder %>% 
  filter(year==1957) %>%
  mutate(group= cut_number(lifeExp,4)) %>%
  count(group)
## # A tibble: 4 x 2
##   group           n
##   <fct>       <int>
## 1 [30.3,41.2]    36
## 2 (41.2,48.4]    35
## 3 (48.4,63]      35
## 4 (63,73.5]      36
gapminder %>% 
  filter(year==1957) %>%
  mutate(group= cut_width(lifeExp,4)) %>% 
  count(group)
## # A tibble: 11 x 2
##    group       n
##    <fct>   <int>
##  1 [30,34]     7
##  2 (34,38]    11
##  3 (38,42]    22
##  4 (42,46]    25
##  5 (46,50]    11
##  6 (50,54]     9
##  7 (54,58]     6
##  8 (58,62]    12
##  9 (62,66]    11
## 10 (66,70]    19
## 11 (70,74]     9
# Sama group_by() ja summarise() kaudu
# gapminder %>% 
#   filter(year==1957) %>%
#   mutate(group= cut_width(lifeExp,4)) %>% 
#   group_by(group) %>% 
#   summarise(n=n())

Kui me tahame muuta olemasoleva faktortunnuse silte, siis on selleks olemas funktsioon fct_recode(). fct_recode ootab sisendiks faktortunnuse tasandite nimetusi. Nii võime anda uued nimed näiteks ühekaupa käsitsi muutes “madal” = “[30.3,43.4]”,“keskmine”=“(43.4,59.2]”,“kõrge”=“(59.2,73.5]”.

Kui me ei pruugi teada täpselt, kuhu gruppide vahepunktid täpselt lähevad, on lihtsam jätta kõrvale vahemikku märkivad sildid. Selleks võime me jätta cut() funktsioonis sildid määramata, lisades parameetri label=F. Sama tulemuse saavutame võttes faktortunnust numbritena as.numeric() funktsiooni abil, nagu sai näidatud sissejuhatuses. cut() funktsioonid hoiavad tasemete järjestust väiksemast suurimani. Faktorite tasemeid võib ümber nimetada ka R-i baasfunktsiooni levels() kaudu, veidi teistsuguse loogikaga. Vaadake ?levels lähemalt.

gapminder %>% 
  filter(year==1957) %>%
  mutate(group_label1= cut_number(lifeExp,3)) %>% 
  mutate(group_label2= fct_recode(factor(group_label1), "madal" = "[30.3,43.4]","keskmine"="(43.4,59.2]","kõrge"="(59.2,73.5]"))
## # A tibble: 142 x 8
##    country   continent  year lifeExp     pop gdpPercap group_label1 group_label2
##    <chr>     <chr>     <dbl>   <dbl>   <dbl>     <dbl> <fct>        <fct>       
##  1 Afghanis… Asia       1957    30.3  9.24e6      821. [30.3,43.4]  madal       
##  2 Albania   Europe     1957    59.3  1.48e6     1942. (59.2,73.5]  kõrge       
##  3 Algeria   Africa     1957    45.7  1.03e7     3014. (43.4,59.2]  keskmine    
##  4 Angola    Africa     1957    32.0  4.56e6     3828. [30.3,43.4]  madal       
##  5 Argentina Americas   1957    64.4  1.96e7     6857. (59.2,73.5]  kõrge       
##  6 Australia Oceania    1957    70.3  9.71e6    10950. (59.2,73.5]  kõrge       
##  7 Austria   Europe     1957    67.5  6.97e6     8843. (59.2,73.5]  kõrge       
##  8 Bahrain   Asia       1957    53.8  1.39e5    11636. (43.4,59.2]  keskmine    
##  9 Banglade… Asia       1957    39.3  5.14e7      662. [30.3,43.4]  madal       
## 10 Belgium   Europe     1957    69.2  8.99e6     9715. (59.2,73.5]  kõrge       
## # … with 132 more rows
gapminder %>% 
  filter(year==1957) %>%
  mutate(group_label1= cut_number(lifeExp,3)) %>% 
  mutate(group_rank= cut_number(lifeExp,3,label=F)) %>%
  mutate(group_numeric= as.numeric(group_label1)) %>%
  mutate(group_label2= fct_recode(factor(group_rank), "madal" = "1","keskmine"="2","kõrge"="3"))
## # A tibble: 142 x 10
##    country continent  year lifeExp    pop gdpPercap group_label1 group_rank
##    <chr>   <chr>     <dbl>   <dbl>  <dbl>     <dbl> <fct>             <int>
##  1 Afghan… Asia       1957    30.3 9.24e6      821. [30.3,43.4]           1
##  2 Albania Europe     1957    59.3 1.48e6     1942. (59.2,73.5]           3
##  3 Algeria Africa     1957    45.7 1.03e7     3014. (43.4,59.2]           2
##  4 Angola  Africa     1957    32.0 4.56e6     3828. [30.3,43.4]           1
##  5 Argent… Americas   1957    64.4 1.96e7     6857. (59.2,73.5]           3
##  6 Austra… Oceania    1957    70.3 9.71e6    10950. (59.2,73.5]           3
##  7 Austria Europe     1957    67.5 6.97e6     8843. (59.2,73.5]           3
##  8 Bahrain Asia       1957    53.8 1.39e5    11636. (43.4,59.2]           2
##  9 Bangla… Asia       1957    39.3 5.14e7      662. [30.3,43.4]           1
## 10 Belgium Europe     1957    69.2 8.99e6     9715. (59.2,73.5]           3
## # … with 132 more rows, and 2 more variables: group_numeric <dbl>,
## #   group_label2 <fct>

Kui me teame täpselt, mis tingimustele me tahame et muutuja vastaks, võime me kasutada ka käske if_else() ja case_when(). if_else() määrab alguses tõetingimused, näiteks rahvaarv peab olema suurem kui miljon. Järgmisena määratakse, mis on väärtuseks siis kui tingimused vastavad tõele ja mis on väärtuseks siis kui need ei vasta tõele. case_when() puhul määratakse ära mitu tingimust ja tilde ~ järel väärtus, mida kasutatakse kui tingimused vastavad tõele. case_when() esialgu jätab ühe juhu katmata - kui elanikke on vähem kui miljon. Selle saame lahendada, kasutades if_else() tingimusega, et väärtus on puuduv is.na(). case_when() määrab kõik tingimustesse mitte mahtuvad tunnused puuduvaks.

gapminder %>% 
  filter(year==1957) %>% 
  mutate(popsize=if_else(pop>1000000,true="miljon+",false="vähem"))
## # A tibble: 142 x 7
##    country     continent  year lifeExp      pop gdpPercap popsize
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl> <chr>  
##  1 Afghanistan Asia       1957    30.3  9240934      821. miljon+
##  2 Albania     Europe     1957    59.3  1476505     1942. miljon+
##  3 Algeria     Africa     1957    45.7 10270856     3014. miljon+
##  4 Angola      Africa     1957    32.0  4561361     3828. miljon+
##  5 Argentina   Americas   1957    64.4 19610538     6857. miljon+
##  6 Australia   Oceania    1957    70.3  9712569    10950. miljon+
##  7 Austria     Europe     1957    67.5  6965860     8843. miljon+
##  8 Bahrain     Asia       1957    53.8   138655    11636. vähem  
##  9 Bangladesh  Asia       1957    39.3 51365468      662. miljon+
## 10 Belgium     Europe     1957    69.2  8989111     9715. miljon+
## # … with 132 more rows
gapminder %>% 
  filter(year==1957) %>% 
  mutate(popsize=case_when(pop>1000000&pop<=5000000~"miljon+",
                           pop>5000000&pop<=10000000~"5miljon+",
                           pop>10000000~"10miljon+"))
## # A tibble: 142 x 7
##    country     continent  year lifeExp      pop gdpPercap popsize  
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl> <chr>    
##  1 Afghanistan Asia       1957    30.3  9240934      821. 5miljon+ 
##  2 Albania     Europe     1957    59.3  1476505     1942. miljon+  
##  3 Algeria     Africa     1957    45.7 10270856     3014. 10miljon+
##  4 Angola      Africa     1957    32.0  4561361     3828. miljon+  
##  5 Argentina   Americas   1957    64.4 19610538     6857. 10miljon+
##  6 Australia   Oceania    1957    70.3  9712569    10950. 5miljon+ 
##  7 Austria     Europe     1957    67.5  6965860     8843. 5miljon+ 
##  8 Bahrain     Asia       1957    53.8   138655    11636. <NA>     
##  9 Bangladesh  Asia       1957    39.3 51365468      662. 10miljon+
## 10 Belgium     Europe     1957    69.2  8989111     9715. 5miljon+ 
## # … with 132 more rows
gapminder %>% 
  filter(year==1957) %>% 
  mutate(popsize=case_when(pop>1000000&pop<=5000000~"miljon+",
                           pop>5000000&pop<=10000000~"5miljon+",
                           pop>10000000~"10miljon+")) %>% 
  mutate(popsize=if_else(is.na(popsize),"vähem",popsize))
## # A tibble: 142 x 7
##    country     continent  year lifeExp      pop gdpPercap popsize  
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl> <chr>    
##  1 Afghanistan Asia       1957    30.3  9240934      821. 5miljon+ 
##  2 Albania     Europe     1957    59.3  1476505     1942. miljon+  
##  3 Algeria     Africa     1957    45.7 10270856     3014. 10miljon+
##  4 Angola      Africa     1957    32.0  4561361     3828. miljon+  
##  5 Argentina   Americas   1957    64.4 19610538     6857. 10miljon+
##  6 Australia   Oceania    1957    70.3  9712569    10950. 5miljon+ 
##  7 Austria     Europe     1957    67.5  6965860     8843. 5miljon+ 
##  8 Bahrain     Asia       1957    53.8   138655    11636. vähem    
##  9 Bangladesh  Asia       1957    39.3 51365468      662. 10miljon+
## 10 Belgium     Europe     1957    69.2  8989111     9715. 5miljon+ 
## # … with 132 more rows

Nende funktsioonidega võime näiteks ümber kodeerida küsimuste tulemusi, juhul kui me arvame et 10-punktiline lineaare skaala ei ole meie küsimusele vastuse leidmiseks parim. Me võime selleks kasutada näiteks cut() funktsiooni või case_when().

ess9_ee %>% 
  select(idno,trstplt) %>% 
  mutate(trstplc_fct=cut(trstplt,breaks=c(0,2,4,6,8,10),labels=c("ei","pigem ei","erapooletu","pigem jah","jah")))
## # A tibble: 1,904 x 3
##     idno   trstplt trstplc_fct
##    <dbl> <dbl+lbl> <fct>      
##  1     6     4 [4] pigem ei   
##  2    22     6 [6] erapooletu 
##  3    33     3 [3] pigem ei   
##  4    48     5 [5] erapooletu 
##  5    51     7 [7] pigem jah  
##  6   101     1 [1] ei         
##  7   102     3 [3] pigem ei   
##  8   113     6 [6] erapooletu 
##  9   114     2 [2] ei         
## 10   121     7 [7] pigem jah  
## # … with 1,894 more rows
ess9_ee %>% 
  select(idno,trstplt) %>% 
  mutate(trstplc_fct=case_when(trstplt<4~"pigem ei",
                               trstplt>=4&trstplt<=6~"erapooletu",
                               trstplt>=6~"pigem jah"))
## # A tibble: 1,904 x 3
##     idno   trstplt trstplc_fct
##    <dbl> <dbl+lbl> <chr>      
##  1     6     4 [4] erapooletu 
##  2    22     6 [6] erapooletu 
##  3    33     3 [3] pigem ei   
##  4    48     5 [5] erapooletu 
##  5    51     7 [7] pigem jah  
##  6   101     1 [1] pigem ei   
##  7   102     3 [3] pigem ei   
##  8   113     6 [6] erapooletu 
##  9   114     2 [2] pigem ei   
## 10   121     7 [7] pigem jah  
## # … with 1,894 more rows

Samamoodi kuluvad need ära kui meil on numberväärtus, mis tuleb kindlasti kategooriliseks lugeda. Numbertunnust või tähttunnust saab teha faktortunnuseks käsuga factor(). Kategoorilist faktortunnust, kui väärtused sisaldavad numbreid saab teha numbriteks funktsiooniga as.numeric(as.character()). Tehes kategoorilise faktortunnuse lihtsalt numbriteks as.numeric() käsuga, võetakse numberväärtused faktortunnuse tasemete järjekorra mitte sildi järgi.

ess9_ee %>% 
  select(idno,admge) %>%
  mutate(admge= factor(admge))
## # A tibble: 1,904 x 2
##     idno admge
##    <dbl> <fct>
##  1     6 1    
##  2    22 2    
##  3    33 1    
##  4    48 2    
##  5    51 1    
##  6   101 2    
##  7   102 1    
##  8   113 1    
##  9   114 1    
## 10   121 1    
## # … with 1,894 more rows
ess9_ee %>% 
  select(idno,admge) %>%
  mutate(admge= case_when(admge==1~"mees",
                          admge==2~"naine"))
## # A tibble: 1,904 x 2
##     idno admge
##    <dbl> <chr>
##  1     6 mees 
##  2    22 naine
##  3    33 mees 
##  4    48 naine
##  5    51 mees 
##  6   101 naine
##  7   102 mees 
##  8   113 mees 
##  9   114 mees 
## 10   121 mees 
## # … with 1,894 more rows
ess9_ee %>% 
  select(idno,admge) %>%
  mutate(admge= factor(admge)) %>% 
  mutate(admge= fct_recode(admge,"mees"="1","naine"="2"))
## # A tibble: 1,904 x 2
##     idno admge
##    <dbl> <fct>
##  1     6 mees 
##  2    22 naine
##  3    33 mees 
##  4    48 naine
##  5    51 mees 
##  6   101 naine
##  7   102 mees 
##  8   113 mees 
##  9   114 mees 
## 10   121 mees 
## # … with 1,894 more rows

8 Tabelite pööramine ja liitmine

8.1 Tabeli pööramine

Nagu failide sisselugemisel mainitud, oli meil tabeleid “pikal” ja “laial” kujul ning vastavalt sellele kujule, kuidas tabel oli, tuli sellega ringi käia veidi erineval. Näiteks laial kujul on eri mõõtmiste liigid tihti tunnustena ja nendega töötamiseks on käsk select(), kui pikal kujul on eri liiki mõõtmised eri ridadel ning õigete leidmisel aitab filter. Olenevalt ülesandest võib olla tarvilik just üks neist tabeli kujudest. Enamasti nõuab R-is mudelite ja jooniste tegemine tabelit pigem “pikal” kujul, kus iga uus vaatlus oleks eraldi real, mitte grupeeritud tunnusteks. Nende vahel on aga kerge vahetada. Selleks on meil kaks käsku pivot_longer(), mis teeb tabeli pikemaks ja pivot_wider() mis teeb tabeli laiemaks. Teistes pakettides kasutatakse samal otstarbel veel käske melt() ja dcast().

Proovime seda meie andmestike peal. gapminder andmestik on tüüpiline “pikas” formaadis andmestik. Selleks, et seda laiemaks harutada, valime välja ühe tunnuse (pop) ja kasutame käsku pivot_wider(), lisades identifikaator tulpade nimetused, siis tulba, kust võtta tunnuste nimetused ja teise tulba, kust võtta tunnuste väärtused. Selle järgi on ka illustratsioon protsessist Grolemund & Wickham, 2017 raamatust.

gapminder
## # A tibble: 1,704 x 6
##    country     continent  year lifeExp      pop gdpPercap
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.
## # … with 1,694 more rows
gapminder %>% 
  select(country,continent,year,pop) %>% 
  pivot_wider(id_cols=c("country","continent"),names_from="year",values_from="pop")
## # A tibble: 142 x 14
##    country continent `1952` `1957` `1962` `1967` `1972` `1977` `1982` `1987`
##    <chr>   <chr>      <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
##  1 Afghan… Asia      8.43e6 9.24e6 1.03e7 1.15e7 1.31e7 1.49e7 1.29e7 1.39e7
##  2 Albania Europe    1.28e6 1.48e6 1.73e6 1.98e6 2.26e6 2.51e6 2.78e6 3.08e6
##  3 Algeria Africa    9.28e6 1.03e7 1.10e7 1.28e7 1.48e7 1.72e7 2.00e7 2.33e7
##  4 Angola  Africa    4.23e6 4.56e6 4.83e6 5.25e6 5.89e6 6.16e6 7.02e6 7.87e6
##  5 Argent… Americas  1.79e7 1.96e7 2.13e7 2.29e7 2.48e7 2.70e7 2.93e7 3.16e7
##  6 Austra… Oceania   8.69e6 9.71e6 1.08e7 1.19e7 1.32e7 1.41e7 1.52e7 1.63e7
##  7 Austria Europe    6.93e6 6.97e6 7.13e6 7.38e6 7.54e6 7.57e6 7.57e6 7.58e6
##  8 Bahrain Asia      1.20e5 1.39e5 1.72e5 2.02e5 2.31e5 2.97e5 3.78e5 4.55e5
##  9 Bangla… Asia      4.69e7 5.14e7 5.68e7 6.28e7 7.08e7 8.04e7 9.31e7 1.04e8
## 10 Belgium Europe    8.73e6 8.99e6 9.22e6 9.56e6 9.71e6 9.82e6 9.86e6 9.87e6
## # … with 132 more rows, and 4 more variables: `1992` <dbl>, `1997` <dbl>,
## #   `2002` <dbl>, `2007` <dbl>

Seevastu eu_lifeExp andmestik on meil algselt “laias” formaadi, kus numbrid on toodud eraldi tunnustena. Sele “pikaks” tegemiseks võime kasutada pivot_longer() funktsiooni, kus meil on vaja öelda, millised tulbad teha eraldi liiki mõõtmisteks ridadel, mis tulpa koondada nende nimed ja mis tulpa nende väärtused. Selle järgi on samuti illustratsioon protsessist Grolemund & Wickham, 2017 raamatust.

eu_lifeExp
## # A tibble: 14,448 x 63
##    unit  sex   age   geo   `2018` `2017` `2016` `2015` `2014` `2013` `2012`
##    <chr> <chr> <chr> <chr> <lgl>   <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
##  1 YR    F     Y1    AL    NA       79.7   79.8   79.2   79.8   79.6   NA  
##  2 YR    F     Y1    AM    NA       78.5   78     77.9   NA     NA     NA  
##  3 YR    F     Y1    AT    NA       83.2   83.4   83     83.3   83     82.8
##  4 YR    F     Y1    AZ    NA       77.7   NA     77.5   77     76.9   76.5
##  5 YR    F     Y1    BE    NA       83.2   83.2   82.6   83.1   82.5   82.4
##  6 YR    F     Y1    BG    NA       77.9   78     77.6   77.6   78.1   77.4
##  7 YR    F     Y1    BY    NA       78.6   78.4   78.2   77.8   77.3   77.1
##  8 YR    F     Y1    CH    NA       84.9   84.9   84.4   84.7   84.3   84.2
##  9 YR    F     Y1    CY    NA       83.3   84.1   82.9   83.4   84     82.6
## 10 YR    F     Y1    CZ    NA       81.2   81.3   80.8   81.1   80.5   80.4
## # … with 14,438 more rows, and 52 more variables: `2011` <dbl>, `2010` <dbl>,
## #   `2009` <dbl>, `2008` <dbl>, `2007` <dbl>, `2006` <dbl>, `2005` <dbl>,
## #   `2004` <dbl>, `2003` <dbl>, `2002` <dbl>, `2001` <dbl>, `2000` <dbl>,
## #   `1999` <dbl>, `1998` <dbl>, `1997` <dbl>, `1996` <dbl>, `1995` <dbl>,
## #   `1994` <dbl>, `1993` <dbl>, `1992` <dbl>, `1991` <dbl>, `1990` <dbl>,
## #   `1989` <dbl>, `1988` <dbl>, `1987` <dbl>, `1986` <dbl>, `1985` <dbl>,
## #   `1984` <dbl>, `1983` <dbl>, `1982` <dbl>, `1981` <dbl>, `1980` <dbl>,
## #   `1979` <dbl>, `1978` <dbl>, `1977` <dbl>, `1976` <dbl>, `1975` <dbl>,
## #   `1974` <dbl>, `1973` <dbl>, `1972` <dbl>, `1971` <dbl>, `1970` <dbl>,
## #   `1969` <dbl>, `1968` <dbl>, `1967` <dbl>, `1966` <dbl>, `1965` <dbl>,
## #   `1964` <dbl>, `1963` <dbl>, `1962` <dbl>, `1961` <dbl>, `1960` <dbl>
eu_lifeExp %>% 
  pivot_longer(cols=matches("[0-9]"), names_to="year", values_to="lifeExp")
## # A tibble: 852,432 x 6
##    unit  sex   age   geo   year  lifeExp
##    <chr> <chr> <chr> <chr> <chr>   <dbl>
##  1 YR    F     Y1    AL    2018     NA  
##  2 YR    F     Y1    AL    2017     79.7
##  3 YR    F     Y1    AL    2016     79.8
##  4 YR    F     Y1    AL    2015     79.2
##  5 YR    F     Y1    AL    2014     79.8
##  6 YR    F     Y1    AL    2013     79.6
##  7 YR    F     Y1    AL    2012     NA  
##  8 YR    F     Y1    AL    2011     NA  
##  9 YR    F     Y1    AL    2010     NA  
## 10 YR    F     Y1    AL    2009     NA  
## # … with 852,422 more rows

8.2 Tabelite järjestikku liitmine

Tabelitega töötamisel tuleb tihti mõte, et võiks sellele lisada paar rida või paar tulpa. Juhul, kui andmepunktid on tabelites täpselt samas järjekorras on võimalik liita uus tulp käsuga bind_cols(). Ridade liitmisel saab kasutada käsku bind_rows(). Väga sarnased käsud on cbind() ja rbind(). Neid käske kasutatakse eelkõige andmestike loomisel.

Me võime näiteks teha gdp tulba gapminderi andmestiku põhjal. Salvestada selle eraldi ja siis lisada selle gapminderisse. bind_cols() funktsiooni läheb vaja suhteliselt harva. Mõnikord läheb seda vaja kui muutujad on salvestatud eri failides. Kui me liidame nii andmestiku, millel on samanimelisi tulpasid, siis muudab käsk viimase tabeli tulpade nimesid, et need eristuks. Näiteks kõrvutades gapminderi iseendaga, saame kaks korda laiema tabeli, kus on lisatud 1 igale muutuja nimele.

gdp_gapminder <- gapminder %>% 
  mutate(gdp = pop * gdpPercap) %>% 
  select(gdp)

bind_cols(gapminder, gdp_gapminder)
## # A tibble: 1,704 x 7
##    country     continent  year lifeExp      pop gdpPercap          gdp
##    <chr>       <chr>     <dbl>   <dbl>    <dbl>     <dbl>        <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.  6567086330.
##  2 Afghanistan Asia       1957    30.3  9240934      821.  7585448670.
##  3 Afghanistan Asia       1962    32.0 10267083      853.  8758855797.
##  4 Afghanistan Asia       1967    34.0 11537966      836.  9648014150.
##  5 Afghanistan Asia       1972    36.1 13079460      740.  9678553274.
##  6 Afghanistan Asia       1977    38.4 14880372      786. 11697659231.
##  7 Afghanistan Asia       1982    39.9 12881816      978. 12598563401.
##  8 Afghanistan Asia       1987    40.8 13867957      852. 11820990309.
##  9 Afghanistan Asia       1992    41.7 16317921      649. 10595901589.
## 10 Afghanistan Asia       1997    41.8 22227415      635. 14121995875.
## # … with 1,694 more rows
bind_cols(gapminder, gapminder)
## # A tibble: 1,704 x 12
##    country continent  year lifeExp    pop gdpPercap country1 continent1 year1
##    <chr>   <chr>     <dbl>   <dbl>  <dbl>     <dbl> <chr>    <chr>      <dbl>
##  1 Afghan… Asia       1952    28.8 8.43e6      779. Afghani… Asia        1952
##  2 Afghan… Asia       1957    30.3 9.24e6      821. Afghani… Asia        1957
##  3 Afghan… Asia       1962    32.0 1.03e7      853. Afghani… Asia        1962
##  4 Afghan… Asia       1967    34.0 1.15e7      836. Afghani… Asia        1967
##  5 Afghan… Asia       1972    36.1 1.31e7      740. Afghani… Asia        1972
##  6 Afghan… Asia       1977    38.4 1.49e7      786. Afghani… Asia        1977
##  7 Afghan… Asia       1982    39.9 1.29e7      978. Afghani… Asia        1982
##  8 Afghan… Asia       1987    40.8 1.39e7      852. Afghani… Asia        1987
##  9 Afghan… Asia       1992    41.7 1.63e7      649. Afghani… Asia        1992
## 10 Afghan… Asia       1997    41.8 2.22e7      635. Afghani… Asia        1997
## # … with 1,694 more rows, and 3 more variables: lifeExp1 <dbl>, pop1 <dbl>,
## #   gdpPercap1 <dbl>

Veidi sagemini läheb vaja bind_rows() käsku, mis liidab tabelile uusi ridu. bind_rows() ühitab kokku samanimelised tulbad. Näiteks võib juhtuda, et meil on eri riikide andmestikud eri failides. Sellisel juhul saab need liita bind_rows käsuga.

finland <- gapminder %>% 
  filter(country=="Finland")

norway <- gapminder %>% 
  filter(country=="Norway")

bind_rows(finland, norway) %>% 
  filter(year>2000)
## # A tibble: 4 x 6
##   country continent  year lifeExp     pop gdpPercap
##   <chr>   <chr>     <dbl>   <dbl>   <dbl>     <dbl>
## 1 Finland Europe     2002    78.4 5193039    28205.
## 2 Finland Europe     2007    79.3 5238460    33207.
## 3 Norway  Europe     2002    79.0 4535591    44684.
## 4 Norway  Europe     2007    80.2 4627926    49357.

Samuti võime bind_rows() käsuga lisada ise mõne rea andmestikku. Lisame näidisrea Eesti kohta.

bind_rows(finland, norway) %>% 
  filter(year>2000) %>% 
  bind_rows(tibble(country="Estonia",continent="Europe",year=2018,lifeExp=78,pop=1318700,gdpPercap=19948))
## # A tibble: 5 x 6
##   country continent  year lifeExp     pop gdpPercap
##   <chr>   <chr>     <dbl>   <dbl>   <dbl>     <dbl>
## 1 Finland Europe     2002    78.4 5193039    28205.
## 2 Finland Europe     2007    79.3 5238460    33207.
## 3 Norway  Europe     2002    79.0 4535591    44684.
## 4 Norway  Europe     2007    80.2 4627926    49357.
## 5 Estonia Europe     2018    78   1318700    19948

8.3 Tabelite liitmine ühise tunnuse põhjal

Hulka sagedamini tuleb meil liita tabeleid mõne tunnuse alusel. Selleks on R-i pakettides ka hulk funktsioone. Tidyverse pakettides on selleks join() tüüpi käsud. join() käsud võtavad tabelis ühe või mitu tunnust ning proovib seda klapitada valitud tunnuse või tunnustega teises tabelis. Kõik read, kus on tunnuste kaupa täpselt sama väärtus on võimalik ühendada. Teistes pakettides kasutatakse siin merge() käsku, mis töötab sama loogikaga. Selle kohta on ka lisatud joonis.

Pildi peal on kujutatud see ridadehulk, mis alles jääb. Täpsemalt öeldes, left_join() hoiab esimese tabeli terviklikuna. right_join() hoiab teise tabeli terviklikuna. inner_join() hoiab alles ainult kattuvad read. full_join() hoiab mõlemad tabelid terviklikuna. Ning anti_join() eemaldab teise tabeliga kattuvad read esimesest tabelist.

  • left_join() - liidab vasakpoolse andmestiku külge need read, mis sobivad paremast.
  • right_join() - liidab parempoolse andmestiku külge need read, mis sobivad vasakust.
  • inner_join() - jätab alles ainult sobivad read kummastki
  • full_join() - jätab alles kõik read mõlemast tabelist, isegi kui ükski ei kattu.
  • anti_join() - töötab vastupidiselt ja eemaldab vasakust kõik read, mis ühtivad parempoolse tabeliga.

Võtame selle jaoks appi teise tabeli. Siin näites kasutame Euroopa GDP inimese kohta andmeid. Veel võib katsetada ka teiste andmestikule lisatud andmetega. Need tulevad lõpuks mängu selle osa kodutöös.

  • Real GDP per capita (sdg_08_10.tsv) link
  • Population by year (tps00001.tsv) link
  • Activity rate - % of total population aged 15-64 (tipslm60.tsv) link
# EUROSTAT andmed on laetud alla oma kodulehelt .tsv kujul.
eu_gdpPercap <- read_tsv("data/sdg_08_10.tsv", na = ":") 
## Parsed with column specification:
## cols(
##   .default = col_double(),
##   `unit,na_item,geo\time` = col_character()
## )
## See spec(...) for full column specifications.
eu_gdpPercap <- eu_gdpPercap %>% # Nagu varemgi peame faili iseärasuste tõttu jaotama tunnusteks
  separate(col=1,into=c("unit","na_item","geo"), sep=",")

# Seejärel võime teha kummastki tabelist "pika" variandi
eu_lifeExp_long <- eu_lifeExp %>% 
  filter(sex=="T",age=="Y1") %>% 
  select(-unit,-sex,-age) %>% 
  pivot_longer(cols=matches("[0-9]"), names_to="year", values_to="lifeExp")

eu_gdpPercap_long <- eu_gdpPercap %>% 
  filter(unit=="CLV10_EUR_HAB") %>% 
  select(-unit,-na_item) %>% 
  pivot_longer(cols=matches("[0-9]"), names_to="year", values_to="gdpPercap")


# Ja lõpuks need kokku siduda riikide ja aastate kaupa. Nüüd on meil kõrvuti eluiga ja antud väärtus sellest.
eu_lifeExp_gdpPercap <- eu_lifeExp_long %>% 
  left_join(eu_gdpPercap_long,by=c("geo","year"))

9 Andmete salvestamine faili

Viimaks salvestame siis selle faili. Selleks on taas hulk käske. tidyverse paketis leiab need käsud üldiselt asendades read write-iga. Niisiis write_csv(), write_csv2(), write_tsv(), write_delim(), write_sav() jne töötavad. Kui salvestamisfunktsioonid on eraldi pakettides on sellest juttu üldiselt ka lugemisfunktsioonide juures. Abiotsing ?read_csv või ?read_sav aitab siin välja.

write_tsv(eu_lifeExp_gdpPercap,"output/eu_life_gdp.tsv")

write_csv2(eu_lifeExp_gdpPercap,"output/eu_life_gdp_euro.csv")

write_delim(eu_lifeExp_gdpPercap,"output/eu_life_gdp_customdelim.csv",delim="@")

write_excel_csv2(eu_lifeExp_gdpPercap,"output/eu_life_gdp.xlsx")

write_sav(eu_lifeExp_gdpPercap,"output/eu_life_gdp.sav")

9.1 Kuhu ja kuidas faile salvestada

Selle projekti kataloogistruktuur on järgmine. Nagu märgata on eraldi kataloogid tehtud andmetele, illustratsioonidele ja ka väljundandmetele. Kood on juurkataloogis koos juhendi, projektifaili ja “loe mind” failiga. Readme.md on hea fail, mida kasutada kuna failihalduskeskkonnad juba tihti teavad ette, et seal on oluline info.

# .
# └── intro_tidy_SV
#     ├── data
#     ├── figures
#     ├── license
#     ├── output
#     ├── intro_tidy.html
#     ├── intro_tidy.R 
#     ├── intro_tidy.RProj
#     └── readme.md

Faile võib paigutada väga erineval viisil. Hea struktuur sõltub projekti suurusest ja mis seal sees teha. Tihti algab projekt ühest skriptifailist ja ühest andmefailist ning kasvab uute allikate ja versioonidega. Et töö käik oleks mõistetav ka kauakestnud projektil tasub otsida endale sobivat kataloogistruktuuri ja kasutada seda pidevalt. See, milline andmekogu struktuur sobib Sinu projektidele tasub omaette läbimõtlemist.

Näiteks on suuremates projektides soovitav hoida toorandmed ja töödeldud andmed eraldi, et kogemata ei hakkaks toorandmeid muutma ning väljundite jaoks võib olla eraldi kataloog. Avalikel andmeprojektidel tuleks alati lisada ka litsents - kas ja mis tingimustel võivad teised neid materjale kasutada. Ainult siis kui litsents on määratletud, saab olla kindel, et materjalide taaskasutamiseks on õigused ka antud. Litsentside toimeviisidega tasub ennast kurssi viia.

Näiteks selles õppetükis toodud kood on antud MIT litsentsiga, mis annab igaühele õiguse kasutada seda, kuidas tahes, õppematerjalid aga on antud CC-BY-4.0 litsentsiga, mis eeldab, et nende taaskasutamisel tuleks algallikale viidata.

# .
# └── projekt
#     ├── code
#     ├── data
#     │   ├── raw
#     │   └── processed
#     ├── output
#     │   ├── figures
#     │   └── report
#     ├── meta.R
#     ├── projekt.Rproj 
#     ├── LICENSE
#     └── README.md

Soovitan vaadata ülevaateid siin ja siin. Väga soovitan vaadata Software Carpentry artiklit Good Enough Practices for Scientific Computing, kus on omaette osa ka uurimisprojekti failide organiseerimise kohta.

Kataloogistruktuuri sättimise juures soovitan vaadata veel paketti here, mis aitab failide asukohti korraldada. Kui R-i rohkem kasutada, siis failide otsimine võib erineda veidi .R ja .Rmd failide vahel ja sõltudes olukorrast. Pakett here lahendab paljuski need probleemid.

Viited