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!
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
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.
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
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.
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.
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.
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.
Materjalid on jagatud eraldi .zip failis, mis tuleb alla laadida. Selle avamiseks RStudios on mitmeid võimalusi.
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().
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
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.
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)
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
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.
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
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
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
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.
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.
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()
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.
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.
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
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.
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
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")
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()
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'
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
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())
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.
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=",")
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.
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
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>
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
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>, …
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.
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
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
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
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()
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()
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()
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)
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()
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 | ▅▅▇▅▂ |
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
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
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()
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()
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 | ▂▃▃▆▇ |
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)`
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()
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 | ▇▂▃▃▃ |
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.
mean(), max(), min(), sd(), log(), n(), row_number(), first(), last(), rank()
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
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
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
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>
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>
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
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
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
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.
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.
# 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"))
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")
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.