Peatükk 4 Tidyverse paketid

4.1 Paketid

Selles peatükis teeme algust tidyverse paketi kasutamisega. Paketid annavad R-i kasutades olulisi lisavõimalusi nagu sai kirjeldatud eelmises peatükis.

Iga pakett tuleb kõigepealt installida. Tavapakettide puhul piisab selleks käsust install.packages(), millele tuleb sisendiks anda paketi nimi jutumärkides. Käivitage järgnev käsk. Kui tidyverse pole arvutisse varem installitud, installib R selle nüüd. Kui pakett on juba installitud, püüab R seda uuendada.

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).

Tidyverse loetleb avamisel avatud paketid ja mainib paari konflikti teiste pakettide pärast, mille pärast Sa ei pea parasjagu muretsema. Kontrolli, kas Su konsoolis näitas midagi sarnast nagu siin juhendis ülal.

Vajalikud paketid tuleb avada iga kord pärast Rstudio käivitamist, R ei tee eeldusi selle kohta, milliseid pakette Sul võiks vaja minna..

4.1.1 Tidyverse arvutiklassis

Mõnede pakettide installimine nõuab arvutis rohkem kui tavakasutaja ligipääsu. Hiljaeaegu sai ka Tidyverse nende pakettide hulka ja kui ligipääsuõiguseid ei ole, nagu näiteks arvutiklassis, siis on vaja teha veel järgmist. Isiklikus arvutis ei ole tõenäoliselt seda vaja teha. Kui tidyverse sisselaadimine ülal töötas, jäta see osa vahele.

JUHUL KUI eelolev ei töötanud täpselt nii nagu oodatud, siis väljuge Rstudiost ja käivitage see uuesti ning kontrollige järgmist:

  1. Mine kohta: “C:/Users/Public/Documents/” (kopeeri see asukohareale)
  2. Kas on kataloog nimega “Rstudio_packages”. Kui seda ei ole, siis tee see.
  3. Jooksuta järgmist käsku.

See määrab, et R otsib oma pakette just sealt kataloogist. Ja ka uued paketid installitakse sinna. Arvutiklassis on seda vaja, kuna sinu kasutajal ei ole arvuti juures kõiki õigusi. Juhul kui paketid olid varem installitud mujale, ei pruugi R neid enam üles leida ning vastavalt proovib neid sinna installida. Isiklikul arvutil seda tõenäoliselt ei ole vaja teha ning kui ligipääsuprobleeme pole, ärge seda käsku käivitage.

Pärast selle määramist proovi installida tidyverse paketti uuesti. Uue asukohaga peaks installimine töötama ja paketi saab siis sisse lugeda.

4.2 R ja andmed

Kuigi R-i võib kasutada ka lihtsateks numbriarvutusteks, siis üldiselt kasutatakse R-i tööks andmistekega. Andmestikud on enamasti salvestatud failidesse teatud formaadis (näiteks .csv, .tsv või .xls). Faili sisse lugemiseks on hulk erinevaid käske ja on vähe failitüüpe, millest R pakettide abiga jagu ei saa. Praegu on meil fail .tsv formaadis ja selle lugemiseks sobib meile käsk read_tsv().

## Parsed with column specification:
## cols(
##   year = col_double(),
##   rank = col_double(),
##   votes = col_double(),
##   artist = col_character(),
##   song = col_character(),
##   filename = col_character(),
##   source = col_double(),
##   lyrics = col_character(),
##   language = col_character()
## )
## # A tibble: 1,000 x 9
##     year  rank votes artist   song    filename     source lyrics        language
##    <dbl> <dbl> <dbl> <chr>    <chr>   <chr>         <dbl> <chr>         <chr>   
##  1  1994     1    NA Ummamuu… Kõnõtr… lyrics-umma…      1 ":,:Välän kü… et      
##  2  1994     2    NA Vennask… Pille-… lyrics-venn…      1 "Taevas sine… et      
##  3  1994     3    NA Jam      See 5   lyrics-jam-…      1 "See viis ha… et      
##  4  1994     4    NA The Tub… Lillek… lyrics-the_…      1 "Tüdruk vaat… et      
##  5  1994     5    NA The Tub… Põhjam… lyrics-the_…      1 "Kui käes on… et      
##  6  1994     6    NA Jam      Su Jär… lyrics-jam-…      1 "Enne sind e… et      
##  7  1994     7    NA 2 Quick… Olen L… lyrics-2_qu…      1 "1. PÕHJUST … et      
##  8  1994     8    NA Termina… Torm    lyrics-term…      1 "Olen tulnud… et      
##  9  1994     9    NA 2 Quick… Sinu J… lyrics-2_qu…      1 "1. EKSISIN … et      
## 10  1994    10    NA D-Gän    Seib    lyrics-d-ga…      1 "ELASID KOOS… et      
## # … with 990 more rows

Siit saime kaks väljatrükki. Esiteks tabeli enda kohta - read_tsv() ütleb, mis tüüpi andmetulpasid ta failist leidis. Siin antud juhul col_character() ehk tekstitulp ja col_double() ehk numbritulp. Oodatavat tüüpi saab ka lugemisel ise määrata. Ja teise asjana trükkis ta välja andmestiku enda, kus näeme, et andmed näevad välja, nagu oodata.

Andmestiku salvestamiseks kasutame tuttavat noole <- tähist. Siis on meil edaspidi andmestik kättesaadav muutuja edetabel all.

## Parsed with column specification:
## cols(
##   year = col_double(),
##   rank = col_double(),
##   votes = col_double(),
##   artist = col_character(),
##   song = col_character(),
##   filename = col_character(),
##   source = col_double(),
##   lyrics = col_character(),
##   language = col_character()
## )

RStudios näete nüüd “environment” väljal, paremal ülal, et sinna on ilmunud sektsioon ‘data’ ning selle alla muutuja ’edetabel, kus on 1000 vaatlust ja 9 muutujat ehk 1000 rida ja 9 tulpa. Kui vajutate RStudios hiirega selle peale, avaneb see tabelina ülevaatuseks. Skriptiaknas, vaskul ülal, on nüüd uus sälk andmetele ning tagasi koodifaili saab vajutades koodifaili sälgule. (Selleks saab kasutada ka Ctrl+Tab ja Shift+Ctrl+Tab).

Muu hulgas näete, et konsoolis jooksis uus käsk

View(edetabel)

View käsk näitab andmemuutuja sisu eraldi aknas. Proovi kirjutada konsooli sama käsk.

Ülevaatest on näha, et tabelis on järgmised tulbad.

  • year - edetabeli aasta
  • rank - koht edetabelis
  • votes - häälte arv (kui on)
  • artist - esineja
  • song - loo pealkiri
  • filename - faili nimi hoidlas
  • source - sõnade allikas (1 - Sasslantis, 2 - muu)
  • lyrics - laulusõnad
  • language - keel (et - eesti, en - inglise)

4.3 Tidy andmestruktuurid

Tidy ehk puhtad andmestruktuurid on kujunenud välja andmeanalüütikute vajadustest. Nimelt taipasid mõned neist, et kui andmestikke salvestatakse pidevalt väga erinevatel kujudel - igaüks mõtleb välja oma viisi - siis andmeanalüüsi jaoks on hea kui nad on suhteliselt samas formaadis ja ehk mida lihtsam seda parem. Tidy andmeloogika on võtnu omaks põhimõtte, et iga andmepunkti kohta võiks olla üks rida ja iga mõõdiku kohta üks tulp. Vastavalt sellele, mida me täpselt tahame teada saada võib erineda see, mis on meie andmepunkt. Andmepunktiks võiks olla näiteks majandusnäitajate Harju keskmine 1990ndate jooksul või siis Eesti riigi koondnäitaja 2019 aasta esimeses kvartalis. Meid võib huvitada üks tekst, üks lause või üks sõna.

Tidy andmeloogika järgi püütakse siis andmestik ümber kujundada selliselt, et ükskõik mida me teada tahame oleks sel sama struktuur

  • Iga rida on üks vaatlus (selle kohta, mida me tahame vaadelda).
  • Iga tulp on üks vaatluse omadus või omadustekomplekt.

Illustratsioon sellest on juhendis all. Kui seda vaadata, võiks mõelda, et kuidas saaks üldse teisiti. Aga andmestikke on koostatud ja koostatakse pidevalt väga erinevates viisides, mis toimivad ehk ühe koostaja või sisestaja jaoks, aga ei pruugi tunduda teistele sama head. Tidy andmeloogika üritab pakkuda lihtsaimat reeglit, mille järgi orienteeruda.

4.4 Tidyverse andmetöötlus

Tidyverse üritab leida ühise aluse ka andmetöötlusele. Eelkõige üritab tidyverse andmetöötluse jaotada selgelt järjestikku operatsioonidest ning järgida literate programming loogikat. Selle loogika järgi peaks masinale mõeldud kood olema lihtsalt ja selgelt loetav ka inimese jaoks. Tidyverse püüab ühtse käskude grammatika järgi aidata nii algajal oskusi omandada kui panna andmeid omavahel ühtima. Kuigi tidyverse kood püüab hoida lihtsat ja arusaadavat kuju, ei tähenda, et selle võimekus oleks piiratud. Peaaegu iga käsku on võimalik kirjutada ka tidyverse viisil.

Tidyverse stiilis töötlusel näeb üks R-i käskudekomplekt välja järgmine.

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

Alustuseks on R-is sisse loetud andmed, siis nendega tehakse protsess1() ja siis protsess2(). Selle järjestuse juhendamiseks kasutab tidyverse toru %>% funktsiooni mis suunab andmestiku protsessi ning selle protsessi tulemuse omakorda protsessi. Üks viis selles mõelda on nii, et muutujad on nimisõnad ja protsessid on tegusõnad ja kokkuvõttes huvitab meid, mis algsest nimisõnalisest tegelasest saab.

Andmete töötlemiseks kasutame niisiis rea lõpus toru %>% funktsiooni. Selle võib trükkida välja või võib vajutada korraga ka Ctrl+Shift+M mis asetab %>% torumärgi teksti.

Töötluse näites, kui me trükime edetabel %>% names(), saame andmestiku kõikide tulpade nimed jadana. Proovi järgi: mine reale ja vajuta Ctrl+Enter. R teab, et %>% torumärgile peaks järgnema veel käsk ja ta loeb seda edasi, isegi kui selleks peab minema järgmisele reale. Seda ära kasutades ning töötluse loetavuse nimel paigutatakse tidyverse stiilis iga käsk eraldi reale. Kui koostad keerulise funktsiooni, võid küll sellest ise kergesti aru saada, aga juhuslikule lugejale on palju kergem kui kõik operatsioonid on selgelt eraldatud.

## [1] "year"     "rank"     "votes"    "artist"   "song"     "filename" "source"  
## [8] "lyrics"   "language"

4.5 filter(), select(), unique(), sample_n()

Teades põhiprintsiipi lähebki vaja hakata operatsioone omavahel kombineerima ja järjestama, et saada andmestikust kätte täpselt seda informatsiooni, mida vaja. Võtame alustuseks neli käsku, mis on mõeldud tabeli osade valimiseks ja loendamiseks. Nimelt filter(), count(), select(), unique().

  • %>% - viib andmed järgmisesse protsessi
  • select() valib tunnused andmestikust
  • filter() viib andmestiku läbi filtri/sõela
  • unique() - võtab tabelist ainult unikaalsed read
  • sample_n() - võtab ettemääratud suurusega hulga ridu tabelist

Käsk select() valib andmestikust teatud tulbad. Seda võib teha nime kaudu või mingil muul alusel, nii võib saada ühe või mitu tulpa. Kirjutades select(year) toru järgi valime siis year-nimelise tulba, ehk tulba kus on aastaarvud.

## # A tibble: 1,000 x 1
##     year
##    <dbl>
##  1  1994
##  2  1994
##  3  1994
##  4  1994
##  5  1994
##  6  1994
##  7  1994
##  8  1994
##  9  1994
## 10  1994
## # … with 990 more rows

Käsk unique() valib andmestikust kõik read, mis on unikaalse. Näiteks valides unikaalsed read aasta tulbast saame jada 25-st erinevast aastast, mis on andmestikus.

## # A tibble: 25 x 1
##     year
##    <dbl>
##  1  1994
##  2  1995
##  3  1996
##  4  1997
##  5  1998
##  6  1999
##  7  2000
##  8  2001
##  9  2002
## 10  2003
## # … with 15 more rows

Kui me võtame unikaalsed read tervest andmestikust, saame vastuseks sama andmestiku, kuna kõik read on seal unikaalsed.

## # A tibble: 1,000 x 9
##     year  rank votes artist   song    filename     source lyrics        language
##    <dbl> <dbl> <dbl> <chr>    <chr>   <chr>         <dbl> <chr>         <chr>   
##  1  1994     1    NA Ummamuu… Kõnõtr… lyrics-umma…      1 ":,:Välän kü… et      
##  2  1994     2    NA Vennask… Pille-… lyrics-venn…      1 "Taevas sine… et      
##  3  1994     3    NA Jam      See 5   lyrics-jam-…      1 "See viis ha… et      
##  4  1994     4    NA The Tub… Lillek… lyrics-the_…      1 "Tüdruk vaat… et      
##  5  1994     5    NA The Tub… Põhjam… lyrics-the_…      1 "Kui käes on… et      
##  6  1994     6    NA Jam      Su Jär… lyrics-jam-…      1 "Enne sind e… et      
##  7  1994     7    NA 2 Quick… Olen L… lyrics-2_qu…      1 "1. PÕHJUST … et      
##  8  1994     8    NA Termina… Torm    lyrics-term…      1 "Olen tulnud… et      
##  9  1994     9    NA 2 Quick… Sinu J… lyrics-2_qu…      1 "1. EKSISIN … et      
## 10  1994    10    NA D-Gän    Seib    lyrics-d-ga…      1 "ELASID KOOS… et      
## # … with 990 more rows

Kui me soovime kätte saada mingeid konkreetseid ridu, mis vastavad teatud tunnustele, võime andmestiku läbi lasta filter() käsust. Sellisel juhul peame filter() sisse kirjutama tingimuse, mis peab vastama kas tõele või väärale ehk see peab kontrollima võrdsust nagu eelmises tükis sai näidatud.

Näiteks, kui me tahame leida kõiki Smilersi lugusid võime me otsida välja kõik read, kus tunnus artist on sama kui tekst “Smilers”. Tähtis on selle päringu juures, et see tunnus peab olema täpselt sama. Pane tähele ka, et siin on siis kasutatud topeltvõrdumärki ==.

## # A tibble: 47 x 9
##     year  rank votes artist  song    filename    source lyrics          language
##    <dbl> <dbl> <dbl> <chr>   <chr>   <chr>        <dbl> <chr>           <chr>   
##  1  1996     4  1192 Smilers Tahan … lyrics-smi…      1 hellalt luban … et      
##  2  1997    23   216 Smilers Viis K… lyrics-smi…      1 tunne on hea j… et      
##  3  1997    30   146 Smilers Lähme … lyrics-smi…      1 sa väljakutsuv… et      
##  4  1998     1  1216 Smilers Tantsi… lyrics-smi…      1 Kuu on täis is… et      
##  5  1998    12   267 Smilers Mõtlen… lyrics-smi…      1 täna ärkasin v… et      
##  6  1998    18   169 Smilers Ära Vi… lyrics-smi…      1 Tahan olla su … et      
##  7  1998    21   133 Smilers Mõistu… lyrics-smi…      1 suhe meil suju… et      
##  8  1998    22   129 Smilers Nagu H… lyrics-smi…      1 Ma tean et see… et      
##  9  1998    28   101 Smilers Aega P… lyrics-smi…      1 ma ennast jäll… et      
## 10  1998    29   100 Smilers Sinu K… lyrics-smi…      1 Oma kolmteist … et      
## # … with 37 more rows

Kui me kasutame nime smilers väikse algustähega, siis me neid tulemusi ei leia, kuna tulemus pole täpselt sama. Kui me suurest või väiksest algustähest ei hooli, võime muuta terve tunnuse selliseks, et tal on väike algustäht või kasutada regulaaravaldisi vaste leidmiseks. Sellest on näiteid hiljem.

## # A tibble: 0 x 9
## # … with 9 variables: year <dbl>, rank <dbl>, votes <dbl>, artist <chr>,
## #   song <chr>, filename <chr>, source <dbl>, lyrics <chr>, language <chr>

Proovi nüüd ise leida kõik Ummamuudu lood, kirjutades sarnane koodijupp siia alla.

Me võime ka kombineerida omavahel filter() ja select(), et saata väiksema ülevaate tabelist. Näiteks võime võtta välja kõikide Smilersi lugude aastad ja pealkirjad.

## # A tibble: 47 x 2
##     year song                 
##    <dbl> <chr>                
##  1  1996 Tahan Sind           
##  2  1997 Viis Kasti Õlut      
##  3  1997 Lähme sõidame        
##  4  1998 Tantsin Sinuga Taevas
##  5  1998 Mõtlen Sinust        
##  6  1998 Ära Viska Mind Ära   
##  7  1998 Mõistus On Kadunud   
##  8  1998 Nagu Hunt            
##  9  1998 Aega Parajaks Teen   
## 10  1998 Sinu Küljes Kinni    
## # … with 37 more rows

Neid käske võib ka korduvalt lisada. Näiteks saame võtta kõigepealt Smilersi lood ja siis nende seast välja ainult lood, mis olid edetabelis aastal 1998.

## # A tibble: 7 x 2
##    year song                 
##   <dbl> <chr>                
## 1  1998 Tantsin Sinuga Taevas
## 2  1998 Mõtlen Sinust        
## 3  1998 Ära Viska Mind Ära   
## 4  1998 Mõistus On Kadunud   
## 5  1998 Nagu Hunt            
## 6  1998 Aega Parajaks Teen   
## 7  1998 Sinu Küljes Kinni

Või näiteks 2000 ja 2008 aasta vahel.

## # A tibble: 23 x 2
##     year song                      
##    <dbl> <chr>                     
##  1  2001 Mina, Pets, Margus & Priit
##  2  2001 Jalgpall on parem kui seks
##  3  2001 Kalamaja cowboy           
##  4  2001 Upun su silmadesse        
##  5  2001 Mõtlen sinust             
##  6  2001 Meteoriitide sajus        
##  7  2002 Meteoriitide sajus        
##  8  2002 Jalgpall on parem kui sex 
##  9  2002 Kvaliteetaeg              
## 10  2003 Käime katuseid mööda      
## # … with 13 more rows

Soovi korral võib mitu filtrit ka ühendada ühte käsku. Sel juhul tuleb kasutada & märki nende ühendamiseks.

## # A tibble: 23 x 2
##     year song                      
##    <dbl> <chr>                     
##  1  2001 Mina, Pets, Margus & Priit
##  2  2001 Jalgpall on parem kui seks
##  3  2001 Kalamaja cowboy           
##  4  2001 Upun su silmadesse        
##  5  2001 Mõtlen sinust             
##  6  2001 Meteoriitide sajus        
##  7  2002 Meteoriitide sajus        
##  8  2002 Jalgpall on parem kui sex 
##  9  2002 Kvaliteetaeg              
## 10  2003 Käime katuseid mööda      
## # … with 13 more rows

Me võime ka kõik filtrid panna kokku ühte käsku

## # A tibble: 23 x 2
##     year song                      
##    <dbl> <chr>                     
##  1  2001 Mina, Pets, Margus & Priit
##  2  2001 Jalgpall on parem kui seks
##  3  2001 Kalamaja cowboy           
##  4  2001 Upun su silmadesse        
##  5  2001 Mõtlen sinust             
##  6  2001 Meteoriitide sajus        
##  7  2002 Meteoriitide sajus        
##  8  2002 Jalgpall on parem kui sex 
##  9  2002 Kvaliteetaeg              
## 10  2003 Käime katuseid mööda      
## # … with 13 more rows

Filtrite puhul võime kasutada ka või | märki. Näiteks võime sama käsku väljedada ka mitte piirkondadega, vaid andes ette võimalikud variandi võiga.

## # A tibble: 23 x 2
##     year song                      
##    <dbl> <chr>                     
##  1  2001 Mina, Pets, Margus & Priit
##  2  2001 Jalgpall on parem kui seks
##  3  2001 Kalamaja cowboy           
##  4  2001 Upun su silmadesse        
##  5  2001 Mõtlen sinust             
##  6  2001 Meteoriitide sajus        
##  7  2002 Meteoriitide sajus        
##  8  2002 Jalgpall on parem kui sex 
##  9  2002 Kvaliteetaeg              
## 10  2003 Käime katuseid mööda      
## # … with 13 more rows

Viimaks võime kasutada ka eelpool mainitud %in% käsku, mis kontrollib väärtuse olemasolu jadas.

## # A tibble: 23 x 2
##     year song                      
##    <dbl> <chr>                     
##  1  2001 Mina, Pets, Margus & Priit
##  2  2001 Jalgpall on parem kui seks
##  3  2001 Kalamaja cowboy           
##  4  2001 Upun su silmadesse        
##  5  2001 Mõtlen sinust             
##  6  2001 Meteoriitide sajus        
##  7  2002 Meteoriitide sajus        
##  8  2002 Jalgpall on parem kui sex 
##  9  2002 Kvaliteetaeg              
## 10  2003 Käime katuseid mööda      
## # … with 13 more rows

Proovi nüüd kätte saada kõik lood mis olnud smilersil küll esikümnes, aga mitte esiviies. (Vihje: vaata tulpa rank.)

Proovi leida ka kõik lood, mis olid 1990ndatel tabelis inglise keeles. (Vihje: vaata tulpa language.)

Tihti soovime näha või kasutada mitte tervet andmestikku, vaid juhuslikku osa sellest. Lihtsa valimi tekitamiseks on ka olemas omaette käsk. sample_n() võtab hulgast välja juhusliku n rida, kus n-i väärtuse me määrame sulgude sees. Teeme väikse katse iseendaga, trükime välja 10 lugu aastast 1997 ja 10 lugu aastast 2017. Vaatame ja võrdleme. Mitu lugu ja esinejat tunneme ära rohkem kui 20 aastat tagasi, mitu esinejat tunneme ära hiljutisest edetabelist. Tulemused ütlevad siinkohal küll rohkem lugeja enda kohta kui andmestiku kohta.

## # A tibble: 10 x 9
##     year  rank votes artist   song     filename     source lyrics       language
##    <dbl> <dbl> <dbl> <chr>    <chr>    <chr>         <dbl> <chr>        <chr>   
##  1  1997    11   347 Black V… Öö Silm… lyrics-blac…      1 "Tunnen süd… et      
##  2  1997    17   295 Maarja   Keelatu… lyrics-maar…      1 "Miks aina … et      
##  3  1997    39    78 Termina… Kristal… lyrics-term…      1 "Ma tean et… et      
##  4  1997    16   296 Bläck R… Itimees  lyrics-blac…      1 "Itimees Rä… et      
##  5  1997    21   234 2 Quick… Oled Ku… lyrics-2_qu…      1 "Ma nägin p… et      
##  6  1997     8   707 Code One Nüüd Võ… lyrics-code…      1 "Ühel hetke… et      
##  7  1997    27   163 Folkmill Käib Sa… lyrics-folk…      1 "sõidab tas… et      
##  8  1997    22   231 Maria    La-La-La <NA>             NA  <NA>        <NA>    
##  9  1997    24   197 Me, mys… I Don't… <NA>             NA  <NA>        <NA>    
## 10  1997    34   120 The Tub… Okkalin… lyrics-the_…      1 "Üks mis ki… et
## # A tibble: 10 x 9
##     year  rank votes artist   song    filename    source lyrics         language
##    <dbl> <dbl> <dbl> <chr>    <chr>   <chr>        <dbl> <chr>          <chr>   
##  1  2017     4   512 Respekt  Peapeal lyrics-res…      1 Meid nähti se… et      
##  2  2017    18   137 Koit To… Verona  lyrics-koi…      1 Sleeping all … en      
##  3  2017    21   105 Ott Lep… Siin m… lyrics-ott…      1 Käes on aeg, … et      
##  4  2017    20   118 Grete P… Wasted… <NA>            NA <NA>           <NA>    
##  5  2017    28    83 Karl-Er… Ei      <NA>            NA <NA>           <NA>    
##  6  2017    37    55 DND      Kontse… lyrics-dnd…      1 Ma nägin su s… et      
##  7  2017    35    57 Iiris    Strang… lyrics-iir…      1 Come on lift … en      
##  8  2017     3   575 Naised … Aasta … lyrics-nai…      1 Aasta emaks e… et      
##  9  2017    29    82 Miljard… Vilkuv… lyrics-mil…      1 kasvab lapsi … et      
## 10  2017     8   284 Shanon   NaNaNa… <NA>            NA <NA>           <NA>

Proovi ise! Võta andmestikust välja 10 juhuslikku esikohalugu. Vaata, kas neid tead?

4.6 count(), group_by()

Et meil on tegemist edetabeliga, siis püüame kõigepealt selle tippudest aru saada. Selle jaoks on tidyverse andmetöötluses olemas eraldi käsk count(). Kasulik on siin vaadata ka käsku group_by().

  • count() - loeb esinemiste arvu
  • group_by() - grupeerib tabeli mingi tunnuse alusel.

Et saada tabelist ja selle sisust paremat ülevaadet, on võimalik selles esinevaid väärtusi ka loendada. Näiteks vaatame artistide esinemiskordasid top 40s. Esinemiskordade arv sai salvestatud tulpa n.

## # A tibble: 348 x 2
##    artist                            n
##    <chr>                         <int>
##  1 2 Quick Start                    24
##  2 2 Quick Start & Hedvig Hanson     1
##  3 4 Ever                            1
##  4 5miinust                          1
##  5 5MIINUST                          1
##  6 5MIINUST x Sass Henno             1
##  7 6-Pack                            1
##  8 A-Rühm                            7
##  9 Agape                             1
## 10 Agent M                           1
## # … with 338 more rows

Käskudele saab ka lisada parameetreid. Need on eraldatud sisendist komaga. Näiteks count() puhul on võimalik lisada parameeter sort=T, mis järjestab loenduse tulemused suurest väiksemani. Täpsemalt ütleme siis käsule, et lugegu sort väärtuseks T, kui vaikimisi võib ta olla midagi muud.

Nii saame kätte artistid, kes said kõige enam tabelisse.

## # A tibble: 348 x 2
##    artist                    n
##    <chr>                 <int>
##  1 Smilers                  47
##  2 Terminaator              46
##  3 2 Quick Start            24
##  4 Ines                     21
##  5 Tanel Padar & The Sun    16
##  6 Ott Lepland              15
##  7 Caater                   14
##  8 Põhja-Tallinn            14
##  9 Jam                      12
## 10 Laura                    12
## # … with 338 more rows

Selliseid lisavõimalusi leiab iga käsu juhendist, mida saab vaadata lisades käsu ette küsimärgi. Näiteks ?count. Proovi seda! All vasakul avaneb seepeale juhend Help aknas. Failivaatele tagasi saab vajutades sälgule Files.

Niiviisi võime loendada ka ükskõik mida. Näiteks, palju oli lugusid eri keeltes.

## # A tibble: 6 x 2
##   language     n
##   <chr>    <int>
## 1 et         686
## 2 <NA>       178
## 3 en         133
## 4 es           1
## 5 fr           1
## 6 it           1

Näeme et 686 lugu on eestikeelset, 133 lugu on ingliskeelset ja 178 loo puhul ei tea me täpselt, mis keeles need on. See on andmestiku eripära, enamikes andmestikes on puuduvaid andmeid. Andmete puuduvuse kontrollimine ei käi võrdusmärkidega, aga funktsiooniga is.na(). Näiteks filter(is.na(language)) annab meile kõik lood, kus on keel puudu.

## # A tibble: 178 x 9
##     year  rank votes artist        song          filename source lyrics language
##    <dbl> <dbl> <dbl> <chr>         <chr>         <chr>     <dbl> <chr>  <chr>   
##  1  1994    13    NA Nancy         Mul luba loo… <NA>         NA <NA>   <NA>    
##  2  1994    16    NA Kuldne Trio   Ütlen Sulle A <NA>         NA <NA>   <NA>    
##  3  1994    20    NA Kuldne Trio   Ulla-Tralla   <NA>         NA <NA>   <NA>    
##  4  1994    27    NA Evelin Samuel Vari Ja Roos  <NA>         NA <NA>   <NA>    
##  5  1994    29    NA Jam           Öised Teed    <NA>         NA <NA>   <NA>    
##  6  1994    32    NA Kuldne Trio   Vana roosa    <NA>         NA <NA>   <NA>    
##  7  1994    36    NA Evelin Samuel Flight        <NA>         NA <NA>   <NA>    
##  8  1994    37    NA MC Leo        Keegi Veel    <NA>         NA <NA>   <NA>    
##  9  1994    39    NA Double +      Sel Tänaval   <NA>         NA <NA>   <NA>    
## 10  1994    40    NA Agape         Grungemees    <NA>         NA <NA>   <NA>    
## # … with 168 more rows

Võime salvestada tulemuse, et seda lähemalt vaadata.

Ja vaatame talle sisse.

Selgub, et keel on puudu, sellepärast et lauludel ei ole sõnu lisatud. Sellega tuleb andmestikes arvestada. Samas artistide või laulupealkirjade loendamiseks sobivad need siiski.

Katsetame veel count() funktsiooni. Võime näiteks kokku lugeda, mitu korda esineb iga aastat, ehk et mitu lugu on igas aastas. Näeme, et kenasti 40 lugu aastas on top 40-s.

## # A tibble: 25 x 2
##     year     n
##    <dbl> <int>
##  1  1994    40
##  2  1995    40
##  3  1996    40
##  4  1997    40
##  5  1998    40
##  6  1999    40
##  7  2000    40
##  8  2001    40
##  9  2002    40
## 10  2003    40
## # … with 15 more rows

Me võime loendada mitut gruppi korraga. Näiteks loendades, mitu korda on artist ja aastaarv koos, saame teada mitu lugu artistilt sel aastal edetabelis oli.

## # A tibble: 687 x 3
##    artist                 year     n
##    <chr>                 <dbl> <int>
##  1 Jam                    1994     7
##  2 Smilers                1998     7
##  3 Smilers                2001     6
##  4 Tanel Padar @ The Sun  2007     6
##  5 Tanel Padar & The Sun  2006     6
##  6 Terminaator            2003     6
##  7 2 Quick Start          1994     5
##  8 Ines                   2005     5
##  9 Nancy                  1995     5
## 10 Nexus                  2005     5
## # … with 677 more rows

Me võime ka loendada neid gruppe korduvalt. Näiteks loendades seal veelkord aastaarvu, saame teada, mitu erinevat artisti oli konkreetsel aastal edetabelis.

## # A tibble: 25 x 2
##     year     n
##    <dbl> <int>
##  1  1994    20
##  2  1995    25
##  3  1996    25
##  4  1997    23
##  5  1998    23
##  6  1999    26
##  7  2000    31
##  8  2001    25
##  9  2002    29
## 10  2003    20
## # … with 15 more rows

Võime seda kombineerida ka filtritega. Näiteks võime vaadata iga aasta kohta, mitu eesti popmuusika lipulaevade lugu edetabelis oli.

## # A tibble: 19 x 2
##     year     n
##    <dbl> <int>
##  1  1996     1
##  2  1997     2
##  3  1998     7
##  4  1999     3
##  5  2000     1
##  6  2001     6
##  7  2002     3
##  8  2003     3
##  9  2004     4
## 10  2005     3
## 11  2006     1
## 12  2007     3
## 13  2008     1
## 14  2009     2
## 15  2011     2
## 16  2013     2
## 17  2014     1
## 18  2015     1
## 19  2016     1
## # A tibble: 17 x 2
##     year     n
##    <dbl> <int>
##  1  1994     2
##  2  1995     3
##  3  1996     4
##  4  1997     4
##  5  1998     4
##  6  1999     1
##  7  2000     3
##  8  2001     5
##  9  2002     1
## 10  2003     6
## 11  2004     1
## 12  2005     1
## 13  2006     4
## 14  2007     3
## 15  2008     1
## 16  2009     2
## 17  2017     1

Nad mõlemad alustasid 1990ndate keskel, aga on hitte teinud veel 2016 ja 2017 aastail.

Proovi veel ühe enda valitud artistiga, mis aastail kui palju lugusid neil on olnud.

Proovi ka teada saada, mitu lugu oli mis keeles 1994 aastal ja 2014 aastal.

Võib märgata, et kui me loendame tunnuste väärtuseid tabelis, siis me jaotame oma andmestiku gruppideks ja ütleme kui palju seal väärtuseid on. Selleks on olemas R-is ka üldisem funktsioon group_by(). Kui me loendasime artiste aasta peale kasutades count() käsus kaht tunnust, nagu all, siis võime seda teisiti sõnastada ka, et me grupeerisime andmestiku artistide kaupa ja loendasime esinemisi aastas.

## # A tibble: 687 x 3
##    artist                 year     n
##    <chr>                 <dbl> <int>
##  1 Jam                    1994     7
##  2 Smilers                1998     7
##  3 Smilers                2001     6
##  4 Tanel Padar @ The Sun  2007     6
##  5 Tanel Padar & The Sun  2006     6
##  6 Terminaator            2003     6
##  7 2 Quick Start          1994     5
##  8 Ines                   2005     5
##  9 Nancy                  1995     5
## 10 Nexus                  2005     5
## # … with 677 more rows
## # A tibble: 687 x 3
## # Groups:   artist [348]
##    artist                 year     n
##    <chr>                 <dbl> <int>
##  1 Jam                    1994     7
##  2 Smilers                1998     7
##  3 Smilers                2001     6
##  4 Tanel Padar @ The Sun  2007     6
##  5 Tanel Padar & The Sun  2006     6
##  6 Terminaator            2003     6
##  7 2 Quick Start          1994     5
##  8 Ines                   2005     5
##  9 Nancy                  1995     5
## 10 Nexus                  2005     5
## # … with 677 more rows

Kui count() on spetsiaalne käsk loendamiseks, siis group_by() on laiema kasutusega käsk, kuidas grupeerida ka teisi operatsioone.

Me võime grupeerimist ka filtritega. Näiteks võime võrrelda, kui palju oli lugusid eri keeltes 1990ndate aastate keskel ja 2010ndate aastate keskel.

## # A tibble: 6 x 3
##   language  year     n
##   <chr>    <dbl> <int>
## 1 en        1994     2
## 2 en        2014     8
## 3 et        1994    28
## 4 et        2014    28
## 5 <NA>      1994    10
## 6 <NA>      2014     4

Ja sama võrdlus group_by() funktsiooniga.

## # A tibble: 6 x 3
## # Groups:   year [2]
##    year language     n
##   <dbl> <chr>    <int>
## 1  1994 en           2
## 2  1994 et          28
## 3  1994 <NA>        10
## 4  2014 en           8
## 5  2014 et          28
## 6  2014 <NA>         4

Proovi ise! Grupeeri andmestik lugude kaupa ning vaata, mitmel aastal nad tabelisse said.

4.7 arrange(), mutate(), row_number(), summarise(), n()

R-i tõeline väärtus aga tuleb ette kui see, mida me teada tahame, ei ole lihtsalt andmestikus sees, vaid see tuleb sealt alles välja arvutada. Andmestiku muutmiseks on lihtsamad käsud arrange(), mutate(), row_number(), summarise(), n().

  • arrange() - muudab tabeli elementide järjekorda, vähim väärtus ees
  • arrange(desc()) - muudab tabeli elementide järjekorda, suurim väärtus ees
  • mutate() - lisab tabelile uue tulba
  • row_number() - väljastab rea järjekorranumbri
  • summarise() - teeb tabelist kokkuvõtte
  • n() - loendab kokku, mitu tunnust grupis on

arrange() käsk järjestab andmestiku mingi tunnuse järgi. Näiteks järjestame tabeli nii, et tipus on kõik esikohad, järgnevad teised kohad ja nii edasi.

## # A tibble: 1,000 x 9
##     year  rank votes artist  song    filename     source lyrics         language
##    <dbl> <dbl> <dbl> <chr>   <chr>   <chr>         <dbl> <chr>          <chr>   
##  1  1994     1    NA Ummamu… Kõnõtr… lyrics-umma…      1 ":,:Välän kül… et      
##  2  1995     1  1132 Termin… Juulik… lyrics-term…      1 "Kõik ei ole … et      
##  3  1996     1  1940 Best B4 Ma Arm… lyrics-best…      1 "Nagu varju e… et      
##  4  1997     1  1923 Black … 17      lyrics-blac…      1 "On õhtu häma… et      
##  5  1998     1  1216 Smilers Tantsi… lyrics-smil…      1 "Kuu on täis … et      
##  6  1999     1  1125 Caater  Osi Ne… <NA>             NA  <NA>          <NA>    
##  7  2000     1  2097 Ines    Once I… lyrics-ines…      1 "I don't wish… en      
##  8  2001     1  2149 2 Quic… Ühega … lyrics-2_qu…      1 "Võin niimood… et      
##  9  2002     1  1882 Termin… Romula  lyrics-term…      1 "Õhtu saabunu… et      
## 10  2003     1  2262 Nexus   Nii Ku… lyrics-nexu…      1 "Üksikuna lei… et      
## # … with 990 more rows

Me võime järjestada ka mitme tunnuse alusel. Järjestame nad kõigepealt edetabelikoha järgi, aga lisame, et uuemad lood võiksid olla ees. Selle jaoks saame lisada lihtsalt komaga eraldatult uue tunnuse. desc() funktsioon pöörab tunnuse järjestuse ümber, nii et suurim väärtus on eespool

## # A tibble: 1,000 x 9
##     year  rank votes artist    song   filename     source lyrics        language
##    <dbl> <dbl> <dbl> <chr>     <chr>  <chr>         <dbl> <chr>         <chr>   
##  1  2018     1   877 Nublu     Mina … lyrics-nubl…      1 Sest sa ei t… et      
##  2  2017     1   845 Põhja-Ta… Alati… lyrics-pohj…      1 Pole ma eale… et      
##  3  2016     1   837 Shanon    Suvi … lyrics-shan…      1 Kuumus tõsta… et      
##  4  2015     1  1609 Karl-Eri… Segas… lyrics-karl…      1 Me vahel sõd… et      
##  5  2014     1   702 Curly St… Kauge… lyrics-curl…      1 Kauges külas… et      
##  6  2013     1   796 Smilers   Mojito lyrics-smil…      1 Kahte pikka … et      
##  7  2012     1  1385 Põhja-Ta… Meil … lyrics-pohj…      1 Refrään (2x)… et      
##  8  2011     1  1166 Ewert An… Good … lyrics-ewer…      1 Here is a st… en      
##  9  2010     1  1583 Koit Too… Mäles… lyrics-koit…      1 leidsin saht… et      
## 10  2009     1  1296 Koit Too… Kauge… lyrics-koit…      1 Olen tagasi … et      
## # … with 990 more rows

Samuti ei pruugi järjestada ainult numbrite alusel, vaid saab järjestada ka tekstijuppe tähestiku alusel. Näiteks saame asetada lood tähestiku järjekorda. Seejuures numbrid ja sümbolid on sellistes järjestustes enamasti paigutatud tähtedest ettepoole.

## # A tibble: 1,000 x 9
##     year  rank votes artist   song     filename     source lyrics       language
##    <dbl> <dbl> <dbl> <chr>    <chr>    <chr>         <dbl> <chr>        <chr>   
##  1  2018    24   124 Frankie… (Can't … lyrics-fran…      1 "You were m… en      
##  2  2011     6   716 Ewert A… (In The… lyrics-ewer…      1 "shake me u… en      
##  3  2000    13   261 Vennask… 101.Kil… lyrics-venn…      1 "Käisid tüd… et      
##  4  2013    31    88 Metsaku… 11       <NA>             NA  <NA>        <NA>    
##  5  2017    30    77 Termina… 13 sammu lyrics-term…      1 "Kord kokku… et      
##  6  1997     9   446 Vennask… 15       lyrics-venn…      1 "Kuigi juba… et      
##  7  2005    26   447 Ines     15 maga… lyrics-ines…      1 "iseendale … et      
##  8  1997     1  1923 Black V… 17       lyrics-blac…      1 "On õhtu hä… et      
##  9  2003     7   780 Sõpruse… 1905     lyrics-sopr…      1 "Vabrikute … et      
## 10  2008    40   130 Mari-Le… 1987     lyrics-mari…      1 "Ma pühin t… et      
## # … with 990 more rows

Kui me tahaksime kätte saada kõik kolmanda koha lood, võime kasutada käsku filter().

## # A tibble: 25 x 9
##     year  rank votes artist  song    filename     source lyrics         language
##    <dbl> <dbl> <dbl> <chr>   <chr>   <chr>         <dbl> <chr>          <chr>   
##  1  1994     3    NA Jam     See 5   lyrics-jam-…      1 See viis haar… et      
##  2  1995     3   613 Ummamu… Tunnen… lyrics-umma…      1 Ma tunnen ära… et      
##  3  1996     3  1393 Code O… On Kül… lyrics-code…      1 On küll hilja… et      
##  4  1997     3   844 Mari L… Teine … lyrics-mari…      1 ref: miks mee… et      
##  5  1998     3    NA 2 Quic… Teine … lyrics-2_qu…      1 Su pilk on tu… et      
##  6  1999     3   958 2 Quic… C'est … lyrics-2_qu…      1 Pilk peale jä… et      
##  7  2000     3   960 Caater  Dance … <NA>             NA <NA>           <NA>    
##  8  2001     3  1160 Hannah  Salaja  lyrics-hann…      1 Salaja kuulas… et      
##  9  2002     3  1258 Tanel … Unistus lyrics-tane…      1 Iga päevaga r… et      
## 10  2003     3  1425 Smilers Käime … lyrics-smil…      1 Käime katusei… et      
## # … with 15 more rows

Kui me aga tahaksime kätte saada populaarsuselt kolmanda artisti, siis ei ole meil filtreerimiseks kohe alust.

## # A tibble: 348 x 2
##    artist                    n
##    <chr>                 <int>
##  1 Smilers                  47
##  2 Terminaator              46
##  3 2 Quick Start            24
##  4 Ines                     21
##  5 Tanel Padar & The Sun    16
##  6 Ott Lepland              15
##  7 Caater                   14
##  8 Põhja-Tallinn            14
##  9 Jam                      12
## 10 Laura                    12
## # … with 338 more rows

Me võiksime küll peale vaadata, et kolmanda koha artistil oli edetabelis laule täpselt 24 korda või rohkem kui 21 ja vähem kui 46 korda aga see lahendus toimib juhtumisi ainult selles andmestikus ja ainult praegu. Võimalik, et meil on näiteks artisti nimedes vigu ja lõplikud väärtused ei ole täpselt sellised.

Et saada kätte kolmanda koha, peame lisama andmestikule uut informatsiooni, näiteks järjekorranumbri. Selleks on tidyverse pakettides käsk mutate(), mis muudab üht andmestiku tulpa. Kui anda sisendiks tulba nimi, mis veel ei eksisteeri, saab käsk selle lisada. Ja teine käsk, mida me saame siin kasutada on row_number(). See tekitab jada, mis algab ühest ja lõppeb rea pikkusega. Tulba lisamiseks märgime nii mutate(tulbanimi = sisend) ehk praegu mutate(rownr = row_number()).

## # A tibble: 348 x 3
##    artist                    n rownr
##    <chr>                 <int> <int>
##  1 Smilers                  47     1
##  2 Terminaator              46     2
##  3 2 Quick Start            24     3
##  4 Ines                     21     4
##  5 Tanel Padar & The Sun    16     5
##  6 Ott Lepland              15     6
##  7 Caater                   14     7
##  8 Põhja-Tallinn            14     8
##  9 Jam                      12     9
## 10 Laura                    12    10
## # … with 338 more rows

Näeme, et uus tulp on lisatud. Nüüd saame selle alusel omakorda võtta välja täpselt kolmanda koha selles tabelis, ükskõik, mis väärtusega n ka parasjagu ei ole.

## # A tibble: 1 x 3
##   artist            n rownr
##   <chr>         <int> <int>
## 1 2 Quick Start    24     3

Tidyverse lubab siinkohal ka natuke lõigata. Nimelt filtrisse minev number ei pruugi olla arvutatud, vaid selle võib ka filtreerimise käigus arvutada. Nii saab täpselt samad tulemused jättes ka mutate() käsu kõrvale. Sisuliselt siiski arvutab filter andmestikus uue muutuja, seda lihtsalt ei jäädvustata kusagile.

## # A tibble: 1 x 2
##   artist            n
##   <chr>         <int>
## 1 2 Quick Start    24

mutate() võib kohaldada igal pool. Näiteks võime lisada tabelisse väärtuse artisti kohast tähestiku jä

## # A tibble: 1,000 x 10
##     year  rank votes artist  song  filename source lyrics language alphabet_rank
##    <dbl> <dbl> <dbl> <chr>   <chr> <chr>     <dbl> <chr>  <chr>            <int>
##  1  1994     7    NA 2 Quic… Olen… lyrics-…      1 "1. P… et                   1
##  2  1994     9    NA 2 Quic… Sinu… lyrics-…      1 "1. E… et                   2
##  3  1994    12    NA 2 Quic… Neiu… lyrics-…      1 "On t… et                   3
##  4  1994    15    NA 2 Quic… King… lyrics-…      1 "Olle… et                   4
##  5  1994    17    NA 2 Quic… Kaks… lyrics-…      1 "Silm… et                   5
##  6  1995    14   287 2 Quic… Kirg… lyrics-…      1 "enda… et                   6
##  7  1995    18   253 2 Quic… Siis… lyrics-…      1 "Elu … et                   7
##  8  1995    33   110 2 Quic… King… lyrics-…      1 "Olle… et                   8
##  9  1996    10   578 2 Quic… Lõpu… lyrics-…      1 "Välg… et                   9
## 10  1996    18   290 2 Quic… Nii … lyrics-…      1 "Sinu… et                  10
## # … with 990 more rows

Ja võime sellest filtreerida välja esimesed 100 artisti tähestikus.

## # A tibble: 100 x 10
##     year  rank votes artist  song  filename source lyrics language alphabet_rank
##    <dbl> <dbl> <dbl> <chr>   <chr> <chr>     <dbl> <chr>  <chr>            <int>
##  1  1994     7    NA 2 Quic… Olen… lyrics-…      1 "1. P… et                   1
##  2  1994     9    NA 2 Quic… Sinu… lyrics-…      1 "1. E… et                   2
##  3  1994    12    NA 2 Quic… Neiu… lyrics-…      1 "On t… et                   3
##  4  1994    15    NA 2 Quic… King… lyrics-…      1 "Olle… et                   4
##  5  1994    17    NA 2 Quic… Kaks… lyrics-…      1 "Silm… et                   5
##  6  1995    14   287 2 Quic… Kirg… lyrics-…      1 "enda… et                   6
##  7  1995    18   253 2 Quic… Siis… lyrics-…      1 "Elu … et                   7
##  8  1995    33   110 2 Quic… King… lyrics-…      1 "Olle… et                   8
##  9  1996    10   578 2 Quic… Lõpu… lyrics-…      1 "Välg… et                   9
## 10  1996    18   290 2 Quic… Nii … lyrics-…      1 "Sinu… et                  10
## # … with 90 more rows

mutate() naaberkäsk on summarise(). Nad mõlemad püüavad tabelit muuta, mutate() teeb seda info lisamise või asendamise kaudu. summarise() teeb seda info kokkuvõtmise kaudu. Näiteks võime tabelist välja võtta selle esimese aasta ja viimase aasta min() ja max() kaudu.

## # A tibble: 1 x 2
##   first  last
##   <dbl> <dbl>
## 1  1994  2018

Või võime ka kokku lugeda, mitu rida andmestikus on käsuga n().

## # A tibble: 1 x 1
##       n
##   <int>
## 1  1000

mutate() ja summarise() käsud muudavad oluliselt oma käitumist kui andmestik on kuidagi grupeeritud. Nimelt kui andmestik on grupeeritud, tehakse neid arvutusi gruppide sees. Näiteks grupeerime andmestiku artistide kaupa ja võtame siis kokku, mitu rida seal on.

4.8 group_by() kasutamine

## # A tibble: 348 x 2
##    artist                    n
##    <chr>                 <int>
##  1 Smilers                  47
##  2 Terminaator              46
##  3 2 Quick Start            24
##  4 Ines                     21
##  5 Tanel Padar & The Sun    16
##  6 Ott Lepland              15
##  7 Caater                   14
##  8 Põhja-Tallinn            14
##  9 Jam                      12
## 10 Laura                    12
## # … with 338 more rows

Tähelepanelik lugeja märkab, et me saime täpselt sama tulemuse kui eelnevalt count() käsuga ning need käsud ongi täpselt samad. group_by() ja summarise() käskude kombinatsiooniga saab aga teha ka enamat.

Näiteks võime välja võtta andmestikust info iga artisti esimese ja viimase aasta kohta kui nad said andmestikku. Nii saame ülevaate artistide kestvusest.

## # A tibble: 348 x 3
##    artist                        first  last
##    <chr>                         <dbl> <dbl>
##  1 2 Quick Start                  1994  2011
##  2 2 Quick Start & Hedvig Hanson  1995  1995
##  3 4 Ever                         1998  1998
##  4 5miinust                       2017  2017
##  5 5MIINUST                       2016  2016
##  6 5MIINUST x Sass Henno          2018  2018
##  7 6-Pack                         1997  1997
##  8 A-Rühm                         1998  2008
##  9 Agape                          1994  1994
## 10 Agent M                        2006  2006
## # … with 338 more rows

Võime selle tabeli reastada algusaja järgi, et näha tabelis uusi tulijaid eespool.

## # A tibble: 348 x 3
##    artist                       first  last
##    <chr>                        <dbl> <dbl>
##  1 5MIINUST x Sass Henno         2018  2018
##  2 Ans. Andur                    2015  2018
##  3 DND                           2017  2018
##  4 Egert Milder                  2018  2018
##  5 Elina Born ja Jüri Pootsmann  2018  2018
##  6 Elina Nechayeva               2018  2018
##  7 Evestus                       2018  2018
##  8 Frankie Animal                2018  2018
##  9 Iiris                         2011  2018
## 10 Jüri Pootsmann                2015  2018
## # … with 338 more rows

mutate() käsuga võib andmestikust kätte saada täpselt sama info, aga selle asemel, et kokku võtta, lisab ta selle andmestikule. Näiteks eelmised käsud lisavad siis põhiandmestikule uued tulbad.

## # A tibble: 1,000 x 11
## # Groups:   artist [348]
##     year  rank votes artist  song   filename source lyrics  language first  last
##    <dbl> <dbl> <dbl> <chr>   <chr>  <chr>     <dbl> <chr>   <chr>    <dbl> <dbl>
##  1  1994     1    NA Ummamu… Kõnõt… lyrics-…      1 ":,:Vä… et        1994  1995
##  2  1994     2    NA Vennas… Pille… lyrics-…      1 "Taeva… et        1994  2000
##  3  1994     3    NA Jam     See 5  lyrics-…      1 "See v… et        1994  2004
##  4  1994     4    NA The Tu… Lille… lyrics-…      1 "Tüdru… et        1994  2000
##  5  1994     5    NA The Tu… Põhja… lyrics-…      1 "Kui k… et        1994  2000
##  6  1994     6    NA Jam     Su Jä… lyrics-…      1 "Enne … et        1994  2004
##  7  1994     7    NA 2 Quic… Olen … lyrics-…      1 "1. PÕ… et        1994  2011
##  8  1994     8    NA Termin… Torm   lyrics-…      1 "Olen … et        1994  2017
##  9  1994     9    NA 2 Quic… Sinu … lyrics-…      1 "1. EK… et        1994  2011
## 10  1994    10    NA D-Gän   Seib   lyrics-…      1 "ELASI… et        1994  1994
## # … with 990 more rows

Samamoodi võib ka andmestikule lisada kui palju oli ühes grupis liikmeid.

## # A tibble: 1,000 x 10
## # Groups:   artist [348]
##     year  rank votes artist  song    filename   source lyrics     language     n
##    <dbl> <dbl> <dbl> <chr>   <chr>   <chr>       <dbl> <chr>      <chr>    <int>
##  1  1994     1    NA Ummamu… Kõnõtr… lyrics-um…      1 ":,:Välän… et           2
##  2  1994     2    NA Vennas… Pille-… lyrics-ve…      1 "Taevas s… et           8
##  3  1994     3    NA Jam     See 5   lyrics-ja…      1 "See viis… et          12
##  4  1994     4    NA The Tu… Lillek… lyrics-th…      1 "Tüdruk v… et           7
##  5  1994     5    NA The Tu… Põhjam… lyrics-th…      1 "Kui käes… et           7
##  6  1994     6    NA Jam     Su Jär… lyrics-ja…      1 "Enne sin… et          12
##  7  1994     7    NA 2 Quic… Olen L… lyrics-2_…      1 "1. PÕHJU… et          24
##  8  1994     8    NA Termin… Torm    lyrics-te…      1 "Olen tul… et          46
##  9  1994     9    NA 2 Quic… Sinu J… lyrics-2_…      1 "1. EKSIS… et          24
## 10  1994    10    NA D-Gän   Seib    lyrics-d-…      1 "ELASID K… et           1
## # … with 990 more rows

Sellisel juhul võime seda edasi töödelda ja võtta mitte ainult nimed, vaid ka kõik laulud tippartistidelt, kus artist oli tabelis rohkem kui kümne looga.

## # A tibble: 267 x 10
## # Groups:   artist [14]
##     year  rank votes artist  song    filename   source lyrics     language     n
##    <dbl> <dbl> <dbl> <chr>   <chr>   <chr>       <dbl> <chr>      <chr>    <int>
##  1  1994     3    NA Jam     See 5   lyrics-ja…      1 "See viis… et          12
##  2  1994     6    NA Jam     Su Jär… lyrics-ja…      1 "Enne sin… et          12
##  3  1994     7    NA 2 Quic… Olen L… lyrics-2_…      1 "1. PÕHJU… et          24
##  4  1994     8    NA Termin… Torm    lyrics-te…      1 "Olen tul… et          46
##  5  1994     9    NA 2 Quic… Sinu J… lyrics-2_…      1 "1. EKSIS… et          24
##  6  1994    12    NA 2 Quic… Neiu M… lyrics-2_…      1 "On tähin… et          24
##  7  1994    15    NA 2 Quic… Kingit… lyrics-2_…      1 "Olles kä… et          24
##  8  1994    17    NA 2 Quic… Kaksik… lyrics-2_…      1 "Silmade … et          24
##  9  1994    18    NA Jam     Tants … lyrics-ja…      1 "Mis pane… et          12
## 10  1994    22    NA Jam     Miks M… lyrics-ja…      1 "Kui sind… et          12
## # … with 257 more rows

Ja kokkuvõttes võime näiteks välja arvutada nende lugude keskmise koha. Siis kui me soovime gruppe jälle laiali lahutada, tuleb kasutada funktsiooni ungroup()

## # A tibble: 1 x 1
##    mean
##   <dbl>
## 1  17.5

Kui me gruppe laiali ei lahuta, mõõdame nii iga tippartisti keskmist tulemust

## # A tibble: 14 x 2
##    artist                 mean
##    <chr>                 <dbl>
##  1 2 Quick Start          17.9
##  2 Caater                 14.1
##  3 Ines                   20.2
##  4 Jam                    19.8
##  5 Karl-Erik Taukar       17  
##  6 Laura                  15.6
##  7 Nexus                  21.3
##  8 Ott Lepland            15.4
##  9 Põhja-Tallinn          11.3
## 10 Shanon                 12.8
## 11 Smilers                17.1
## 12 Tanel Padar & The Sun  16.3
## 13 Terminaator            20.2
## 14 Vanilla Ninja          19.8

group_by() muudab veidi ka teiste käskude käitumist. Kuivõrd filter võib viidata otse arvutusele ja mitte ainult tulbale, saab group_by() muuta ka selle käitumist. Näiteks kui me grupeeritud andmestikus kasutame filtrit ja arvutame sinna uue väärtuse, siis teeb ta seda grupi kaupa. Nii võime näiteks leida iga artisti esimesed lood, ilma uut tulpa tekitamata.

## # A tibble: 477 x 9
## # Groups:   artist [348]
##     year  rank votes artist   song    filename     source lyrics        language
##    <dbl> <dbl> <dbl> <chr>    <chr>   <chr>         <dbl> <chr>         <chr>   
##  1  1994     1    NA Ummamuu… Kõnõtr… lyrics-umma…      1 ":,:Välän kü… et      
##  2  1994     2    NA Vennask… Pille-… lyrics-venn…      1 "Taevas sine… et      
##  3  1994     3    NA Jam      See 5   lyrics-jam-…      1 "See viis ha… et      
##  4  1994     4    NA The Tub… Lillek… lyrics-the_…      1 "Tüdruk vaat… et      
##  5  1994     5    NA The Tub… Põhjam… lyrics-the_…      1 "Kui käes on… et      
##  6  1994     6    NA Jam      Su Jär… lyrics-jam-…      1 "Enne sind e… et      
##  7  1994     7    NA 2 Quick… Olen L… lyrics-2_qu…      1 "1. PÕHJUST … et      
##  8  1994     8    NA Termina… Torm    lyrics-term…      1 "Olen tulnud… et      
##  9  1994     9    NA 2 Quick… Sinu J… lyrics-2_qu…      1 "1. EKSISIN … et      
## 10  1994    10    NA D-Gän    Seib    lyrics-d-ga…      1 "ELASID KOOS… et      
## # … with 467 more rows

group_by() muudab ka select() veidi, kuna grupeerivaid faktoreid ei saa kõrvale jätta. Näiteks proovime seda eelmisel tabelil.

## Adding missing grouping variables: `artist`
## # A tibble: 477 x 3
## # Groups:   artist [348]
##    artist             year song                       
##    <chr>             <dbl> <chr>                      
##  1 Ummamuudu          1994 Kõnõtraat                  
##  2 Vennaskond         1994 Pille-Riin                 
##  3 Jam                1994 See 5                      
##  4 The Tuberkuloited  1994 Lilleke Rohus              
##  5 The Tuberkuloited  1994 Põhjamaa Neid              
##  6 Jam                1994 Su Järele Igatsen Ma       
##  7 2 Quick Start      1994 Olen Loobuda Sust Proovinud
##  8 Terminaator        1994 Torm                       
##  9 2 Quick Start      1994 Sinu Jaoks                 
## 10 D-Gän              1994 Seib                       
## # … with 467 more rows

Soovitav on sellisel juhul pärast igat grupeerimist andmestiku salvestamisel grupid uuesti lahti haakida. See aitab kaasa sellele, et vigu ei tekiks ja samas mõned funktsioonid ei tööta hästi grupeeritud andmetega - nad võivad üldse mitte toimida või muutuda väga aeglaselt kui töötluse peab tegema grupeeritud andmetega näiteks tuhandes väikses grupis ühe suure grupi asemel.

## # A tibble: 477 x 2
##     year song                       
##    <dbl> <chr>                      
##  1  1994 Kõnõtraat                  
##  2  1994 Pille-Riin                 
##  3  1994 See 5                      
##  4  1994 Lilleke Rohus              
##  5  1994 Põhjamaa Neid              
##  6  1994 Su Järele Igatsen Ma       
##  7  1994 Olen Loobuda Sust Proovinud
##  8  1994 Torm                       
##  9  1994 Sinu Jaoks                 
## 10  1994 Seib                       
## # … with 467 more rows

4.9 Käskude ühendamine

Mõtleme nüüd, kuidas võiks saada parima tulemuse saanud loo iga artisti kohta. Alustame andmete grupeerimisest artisti kaupa.

## # A tibble: 1,000 x 9
## # Groups:   artist [348]
##     year  rank votes artist   song    filename     source lyrics        language
##    <dbl> <dbl> <dbl> <chr>    <chr>   <chr>         <dbl> <chr>         <chr>   
##  1  1994     1    NA Ummamuu… Kõnõtr… lyrics-umma…      1 ":,:Välän kü… et      
##  2  1994     2    NA Vennask… Pille-… lyrics-venn…      1 "Taevas sine… et      
##  3  1994     3    NA Jam      See 5   lyrics-jam-…      1 "See viis ha… et      
##  4  1994     4    NA The Tub… Lillek… lyrics-the_…      1 "Tüdruk vaat… et      
##  5  1994     5    NA The Tub… Põhjam… lyrics-the_…      1 "Kui käes on… et      
##  6  1994     6    NA Jam      Su Jär… lyrics-jam-…      1 "Enne sind e… et      
##  7  1994     7    NA 2 Quick… Olen L… lyrics-2_qu…      1 "1. PÕHJUST … et      
##  8  1994     8    NA Termina… Torm    lyrics-term…      1 "Olen tulnud… et      
##  9  1994     9    NA 2 Quick… Sinu J… lyrics-2_qu…      1 "1. EKSISIN … et      
## 10  1994    10    NA D-Gän    Seib    lyrics-d-ga…      1 "ELASID KOOS… et      
## # … with 990 more rows

Kasutame funktsiooni arrange tulemuse alusel reastamiseks.

## # A tibble: 1,000 x 9
## # Groups:   artist [348]
##     year  rank votes artist  song     filename     source lyrics        language
##    <dbl> <dbl> <dbl> <chr>   <chr>    <chr>         <dbl> <chr>         <chr>   
##  1  2001     1  2149 2 Quic… Ühega M… lyrics-2_qu…      1 "Võin niimoo… et      
##  2  1998     3    NA 2 Quic… Teine P… lyrics-2_qu…      1 "Su pilk on … et      
##  3  1999     3   958 2 Quic… C'est L… lyrics-2_qu…      1 "Pilk peale … et      
##  4  1994     7    NA 2 Quic… Olen Lo… lyrics-2_qu…      1 "1. PÕHJUST … et      
##  5  1994     9    NA 2 Quic… Sinu Ja… lyrics-2_qu…      1 "1. EKSISIN … et      
##  6  1996    10   578 2 Quic… Lõpuks … lyrics-2_qu…      1 "Välgu valgu… et      
##  7  1994    12    NA 2 Quic… Neiu Mu… lyrics-2_qu…      1 "On tähine t… et      
##  8  1995    14   287 2 Quic… Kirg su… lyrics-2_qu…      1 "endale miks… et      
##  9  1994    15    NA 2 Quic… Kingitus lyrics-2_qu…      1 "Olles käsi … et      
## 10  2002    15   319 2 Quic… Sa tead… lyrics-2_qu…      1 "Läksin välj… et      
## # … with 990 more rows

Nüüd me peaksime kätte saama, mitmes paremuselt oli mõni lugu ühe grupi jaoks. Selleks lisame mutate() käsuga uue tulba. row_number() annab meile järjekorranumbri. Niisiis saame tulemused järjestatud artisti kaupa paremuse alusel.

## # A tibble: 1,000 x 10
## # Groups:   artist [348]
##     year  rank votes artist  song  filename  source lyrics   language artistbest
##    <dbl> <dbl> <dbl> <chr>   <chr> <chr>      <dbl> <chr>    <chr>         <int>
##  1  2001     1  2149 2 Quic… Üheg… lyrics-2…      1 "Võin n… et                1
##  2  1998     3    NA 2 Quic… Tein… lyrics-2…      1 "Su pil… et                2
##  3  1999     3   958 2 Quic… C'es… lyrics-2…      1 "Pilk p… et                3
##  4  1994     7    NA 2 Quic… Olen… lyrics-2…      1 "1. PÕH… et                4
##  5  1994     9    NA 2 Quic… Sinu… lyrics-2…      1 "1. EKS… et                5
##  6  1996    10   578 2 Quic… Lõpu… lyrics-2…      1 "Välgu … et                6
##  7  1994    12    NA 2 Quic… Neiu… lyrics-2…      1 "On täh… et                7
##  8  1995    14   287 2 Quic… Kirg… lyrics-2…      1 "endale… et                8
##  9  1994    15    NA 2 Quic… King… lyrics-2…      1 "Olles … et                9
## 10  2002    15   319 2 Quic… Sa t… lyrics-2…      1 "Läksin… et               10
## # … with 990 more rows

Nüüd saame teha filtri ainult parimate lugude jaoks ja saamegi tulemuse kätte.

## # A tibble: 348 x 10
##     year  rank votes artist  song   filename source lyrics   language artistbest
##    <dbl> <dbl> <dbl> <chr>   <chr>  <chr>     <dbl> <chr>    <chr>         <int>
##  1  2001     1  2149 2 Quic… Ühega… lyrics-…      1 "Võin n… et                1
##  2  1995    27   158 2 Quic… I Fee… <NA>         NA  <NA>    <NA>              1
##  3  1998    34    76 4 Ever  Selle… <NA>         NA  <NA>    <NA>              1
##  4  2017     6   453 5miinu… Eroot… lyrics-…      1 "Reede … et                1
##  5  2016    19    96 5MIINU… Kuum   lyrics-…      1 "Nii ku… et                1
##  6  2018    10   223 5MIINU… Trena… lyrics-…      1 "KOREA:… et                1
##  7  1997     2  1049 6-Pack  Seest… <NA>         NA  <NA>    <NA>              1
##  8  1998     2    NA A-Rühm  Popmu… lyrics-…      1 "Kozy: … et                1
##  9  1994    40    NA Agape   Grung… <NA>         NA  <NA>    <NA>              1
## 10  2006    20   397 Agent M Šokol… lyrics-…      1 "Kas tu… et                1
## # … with 338 more rows

Proovi ise! Kas suudad välja mõelda, kuidas eelmist tulemust saaks kätte ka vähema hulga ridade ja käskudega.

Proovi ise! Kuidas saad kätte iga artisti paremuselt kümnenda loo?

Kuidas saaks kätte iga artisti viimasena tabelisse pääsenud loo?

4.10 Uue muutuja loomine

Lõpuks võib proovida mutate() kaudu arvutada välja mõne uue väärtuse. Näiteks, ütleme, et anname lugudele punkte, nii, et esimene koht annab 40 punkti ja 40. koht 1 punkti. Siis on punkti väärtus 41 miinus koht.

## # A tibble: 1,000 x 10
##     year  rank votes artist  song    filename   source lyrics     language skoor
##    <dbl> <dbl> <dbl> <chr>   <chr>   <chr>       <dbl> <chr>      <chr>    <dbl>
##  1  1994     1    NA Ummamu… Kõnõtr… lyrics-um…      1 ":,:Välän… et          40
##  2  1994     2    NA Vennas… Pille-… lyrics-ve…      1 "Taevas s… et          39
##  3  1994     3    NA Jam     See 5   lyrics-ja…      1 "See viis… et          38
##  4  1994     4    NA The Tu… Lillek… lyrics-th…      1 "Tüdruk v… et          37
##  5  1994     5    NA The Tu… Põhjam… lyrics-th…      1 "Kui käes… et          36
##  6  1994     6    NA Jam     Su Jär… lyrics-ja…      1 "Enne sin… et          35
##  7  1994     7    NA 2 Quic… Olen L… lyrics-2_…      1 "1. PÕHJU… et          34
##  8  1994     8    NA Termin… Torm    lyrics-te…      1 "Olen tul… et          33
##  9  1994     9    NA 2 Quic… Sinu J… lyrics-2_…      1 "1. EKSIS… et          32
## 10  1994    10    NA D-Gän   Seib    lyrics-d-…      1 "ELASID K… et          31
## # … with 990 more rows

Ja kui meil on olemas selline koondindeks võime proovida kokkku arvutada näiteks parima loo või parima artisti. Selleks saame kasutada funktsiooni summarise(). Näiteks terve tabeli peale saab võtta miinimum ja maksimum positsiooni. Kui me tahame saada parimat lugu selle punktisumma järgi, võime need punktisummad näiteks kokku liita iga loo kohta

## # A tibble: 934 x 2
##    song                 summa
##    <chr>                <dbl>
##  1 Käime katuseid mööda    99
##  2 Salaja                  85
##  3 Mälestused              83
##  4 On Küll Hilja           74
##  5 Torm                    74
##  6 Lootusetus              72
##  7 Kaitseta                65
##  8 Kingitus                60
##  9 Mis Tegema Nüüd Pean    60
## 10 Romula                  60
## # … with 924 more rows

Käime katuseid mööda võidab suisa 99 punkti, mis tähendab et ta oli tabelis vähemalt kolmel aastal. Ja võime teha sama ka artisti kaupa ja arvutada välja populaarsuse määra, mis arvestab ka positsiooniga tabelis. Kui muidu oli lugude arvult Smilers ja Terminaator üsna ligi teineteisele, siis selle punktisumma järgi on Smilers siiski tublisti Terminaatorist ees. Terminaator vajaks veel 5-t esikümnehitti rohkem kui smilers, et talle järgi tulla.

## # A tibble: 348 x 2
##    artist                summa
##    <chr>                 <dbl>
##  1 Smilers                1124
##  2 Terminaator             958
##  3 2 Quick Start           555
##  4 Ines                    436
##  5 Põhja-Tallinn           416
##  6 Tanel Padar & The Sun   395
##  7 Ott Lepland             384
##  8 Caater                  377
##  9 Shanon                  339
## 10 Laura                   305
## # … with 338 more rows

Proovi ise! Mõtle välja uus muutuja, mida võiks arvutada ning mille alusel artiste järjestada. (Vihje: votes tulpa pole me siiani kasutanud.)

4.11 Sõnastik

  • %>% - vii andmed järgmisesse protsessi
  • select() vali muutujad
  • filter() vii andmestik läbi filtri/sõela
  • unique() - võtab tabelist ainult unikaalsed read
  • count() - loeb esinemiste arvu (võib panna mitu tulpa korraga)
  • group_by() - grupeeri andmestik mingi muutuja alusel (võib panna mitu tulpa korraga)
  • ungroup() - vii andmestik taas grupeerimata seisu
  • n() - grupi suurus
  • row_number() - rea number
  • mutate() - loo uus muutuja
  • arrange() - järjesta andmed, lisafunktsioon desc()
  • summarise() - loob uue, kokkuvõtva, tulba

4.12 Harjutusülesanded

  1. Leidke artistid, kes olid kõige populaarsemad 2000ndatel.

  2. Leidke kõik lood, mis olid üle ühe aasta edetabelis.

  3. Leidke artistid, kel oli iga tabelisoldud aasta kohta kõige rohkem lugusid.

  4. Leidke lood, mis olid edetabelis mitu aastat.

  5. Nende lugude seast leidke lood, mille maksimaalne häälte hulk ületas nende minimaalse hääle hulga rohkem kui 5 korda.