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:
- Mine kohta: “C:/Users/Public/Documents/” (kopeeri see asukohareale)
- Kas on kataloog nimega “Rstudio_packages”. Kui seda ei ole, siis tee see.
- 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.
edetabel%>%
filter(artist=="Smilers") %>%
select(year,song) %>%
filter(year>2000) %>%
filter(year<2008)
## # 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.
edetabel%>%
filter(artist=="Smilers") %>%
select(year,song) %>%
filter(year==2001 | year==2002 | year==2003 | year==2004 | year==2005 | year==2006 | year==2007)
## # 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.
edetabel %>%
group_by(artist) %>%
summarise(first=min(year), last=max(year)) %>%
arrange(desc(last))
## # 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()
edetabel %>%
group_by(artist) %>%
mutate(n=n()) %>%
filter(n>10) %>%
ungroup() %>%
summarise(mean=mean(rank))
## # 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.
edetabel %>%
group_by(artist) %>%
arrange(artist, rank) %>%
mutate(artistbest=row_number()) %>%
filter(artistbest==1) %>%
ungroup()
## # 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
edetabel %>%
mutate(skoor=41-rank) %>%
group_by(song) %>%
summarise(summa=sum(skoor)) %>%
arrange(desc(summa))
## # 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.
edetabel %>%
mutate(skoor=41-rank) %>%
group_by(artist) %>%
summarise(summa=sum(skoor)) %>%
arrange(desc(summa))
## # 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
Leidke artistid, kes olid kõige populaarsemad 2000ndatel.
Leidke kõik lood, mis olid üle ühe aasta edetabelis.
Leidke artistid, kel oli iga tabelisoldud aasta kohta kõige rohkem lugusid.
Leidke lood, mis olid edetabelis mitu aastat.
Nende lugude seast leidke lood, mille maksimaalne häälte hulk ületas nende minimaalse hääle hulga rohkem kui 5 korda.