dplyr minimalistlikud näited
Andmetabelist info kättesaamiseks kasutame R-i paketti dplyr. See pakett muudab mugavaks ja kiireks sageli ettetulevad operatsioonid nagu andmestiku filtreerimise, sorteerimise ja grupeerimise. Paketi süntaks omab mitmeidki ühisjooni SQL süntaksi või suuremahuliste andmete töötlemise keelega Pig Latin.
Esmakordsel kasutamisel tuleb pakett installeerida.
install.packages("dplyr")Kui pakett on installeeritud, tuleb kasutamiseks see laadida käsuga
library(dplyr)Paketi dplyr peamised käsud on:
- select(): vali alamhulk veergudest
- filter(): vali alamhulk ridadest
- arrange(): sorteeri ridu
- mutate(): lisa uusi veerge
- summarise(): agregeeri mitu väärtust üheks tunnuseks
- group_by(): muuda andmestik grupeeritud andmestikuks, et seejärel rakendada funktsioone igale grupile eraldi
- ungroup(): eemaldab andmetabelilt grupeeringu
- top_n(): vali n esimest/viimast vaatlust
Nende funktsioonide esimeseks argumendiks on alati data.frame ning alati tagastatakse data.frame.
Järgnevalt on toodud minimalistlikud näited, mis iseloomustavad paketi dplyr funktsionaalsust.
andmed = data.frame(sugu = c("M", "M", "N"),
                  vanus = c(20, 60, 30),
                  pikkus = c(180, 200, 150))
andmed##   sugu vanus pikkus
## 1    M    20    180
## 2    M    60    200
## 3    N    30    150select()
vali alamhulk veergudest
# Näide 1
select(andmed, vanus)##   vanus
## 1    20
## 2    60
## 3    30# Näide 2
select(andmed, sugu, vanus)##   sugu vanus
## 1    M    20
## 2    M    60
## 3    N    30# Näide 3 (annab sama tulemuse, mis näide 2)
select(andmed, -pikkus)##   sugu vanus
## 1    M    20
## 2    M    60
## 3    N    30filter()
vali alamhulk ridadest
# Näide 1
filter(andmed, pikkus > 160)##   sugu vanus pikkus
## 1    M    20    180
## 2    M    60    200# Näide 2
filter(andmed, pikkus > 160, vanus > 30)##   sugu vanus pikkus
## 1    M    60    200# Näide 3 (sama, mis näide 2)
filter(andmed, pikkus > 160 & vanus > 30)##   sugu vanus pikkus
## 1    M    60    200arrange()
sorteeri ridu
# Näide 1
arrange(andmed, pikkus)##   sugu vanus pikkus
## 1    N    30    150
## 2    M    20    180
## 3    M    60    200# Näide 2 (sorteeri kahanevalt)
arrange(andmed, desc(pikkus))##   sugu vanus pikkus
## 1    M    60    200
## 2    M    20    180
## 3    N    30    150mutate()
lisa uusi veerge
# Näide 1
mutate(andmed, pikkus2 = pikkus/100)##   sugu vanus pikkus pikkus2
## 1    M    20    180     1.8
## 2    M    60    200     2.0
## 3    N    30    150     1.5# Näide 2 (mitme tunnuse lisamine)
mutate(andmed, pikkus2 = pikkus/100,
       suvaline_tunnus = pikkus*vanus,
       keskmine_vanus = mean(vanus))##   sugu vanus pikkus pikkus2 suvaline_tunnus keskmine_vanus
## 1    M    20    180     1.8            3600       36.66667
## 2    M    60    200     2.0           12000       36.66667
## 3    N    30    150     1.5            4500       36.66667summarise()
agregeeri tunnuse väärtused üheks väärtuseks
summarise(andmed, keskmine_pikkus = mean(pikkus))##   keskmine_pikkus
## 1        176.6667group_by()
muuda andmestik grupeeritud andmestikuks, kus funktsioone rakendatakse eraldi gruppidele
andmed_grupeeritult = group_by(andmed, sugu)
# Rakendame funktsiooni summarise iga grupi jaoks eraldi
summarise(andmed_grupeeritult, keskmine_pikkus = mean(pikkus))## # A tibble: 2 x 2
##     sugu keskmine_pikkus
##   <fctr>           <dbl>
## 1      M             190
## 2      N             150# Lisaks keskmisele pikkusele võime ka iga grupi kohta loendada vaatluste arvu
summarise(andmed_grupeeritult, 
          keskmine_pikkus = mean(pikkus), 
          inimeste_arv = n())## # A tibble: 2 x 3
##     sugu keskmine_pikkus inimeste_arv
##   <fctr>           <dbl>        <int>
## 1      M             190            2
## 2      N             150            1Sageli muudavad analüüsi kiireks ja mugavaks funktsioonid:
- distinct()- eralda unikaalsed väärtused
- sample_n()- tõmba n juhuslikku väärtust etteantud veerust
- n()- loe kokku andmepunktide arv
- n_distinct()- loe kokku unikaalsete väärtuste arv
ungroup()
muuda grupeeritud andmestik grupeerimata andmestikuks. Oluline näiteks olukorras, kus on soov filtereerida andmestikku, mis koosneb paljudest pisikestest andmestikest (palju gruppe). Grupeeritud andmestiku korral filtreeritakse igat gruppi eraldi, mis tingib suurt ebaefektiivsust ja koodi aeglust.
top_n()
eralda andmestikust mingi tunnuse järgi TOP n vaatlust (kuid peab arvestama, et tagastatav andmetabel ei ole sorteeritud soovitava tunnuse järgi)
# top 1 pikkuse järgi
top_n(andmed, 1, pikkus)##   sugu vanus pikkus
## 1    M    60    200# top 2 pikkuse järgi (näeme, et ei ole sorteeritud)
top_n(andmed, 2, pikkus)##   sugu vanus pikkus
## 1    M    20    180
## 2    M    60    200Enne vaatluste järjestamist saab tunnusele rakendada ka mingit funktsiooni.
# bottom 2 pikkuse järgi
top_n(andmed, 2, -pikkus)##   sugu vanus pikkus
## 1    M    20    180
## 2    N    30    150# inimene, kelle pikkus on kõige lähemal 160-le
top_n(andmed, 1, -abs(pikkus-160) )##   sugu vanus pikkus
## 1    N    30    150Mitme funktsiooni järjest rakendamine
Näide: Sorteerime pikkuse järgi ning valime välja ainult read, kus sugu == “M”
# Variant 1
sorteeritud = arrange(andmed, pikkus)
filter(sorteeritud, sugu == "M")##   sugu vanus pikkus
## 1    M    20    180
## 2    M    60    200# Variant 2 (ilma vahetulemust salvestamata)
filter(arrange(andmed, pikkus), 
       sugu == "M")##   sugu vanus pikkus
## 1    M    20    180
## 2    M    60    200%>% operaator
Funktsioonide järjest rakendamist võimaldab dplyr kirja panna pipe operaatori %>% abil.
See operaator võtab vasakul oleva objekti, ning annab selle edasi paremal oleva funktsiooni esimeseks argumendiks. Näiteks f(x, y) võime kirjutada x %>% f(y).
# Eelneva näite jätk:
# Variant 3, pipe operaatoriga
andmed %>% 
  arrange(pikkus) %>%
  filter(sugu == "M")##   sugu vanus pikkus
## 1    M    20    180
## 2    M    60    200Eelnevat %>% abil kirja pandud koodi võib lugeda järgnevalt
Võta andmestik "andmed", seejärel
  sorteeri see pikkuse järgi, seejärel
  eralda sellised read, kus sugu == "M"Nii saadud kood on paremini loetav, eriti kui järjest rakendatakse mitmeid funktsioone.
Näiteks eelnevalt kirja pandud näite
andmed_grupeeritult = group_by(andmed, sugu)
summarise(andmed_grupeeritult, keskmine_pikkus = mean(pikkus))saab %>% abil kirja panna
andmed %>%
  group_by(sugu) %>%
  summarise(keskmine_pikkus = mean(pikkus))Lisamärkus 1. Kui töötlemise tulemust on vaja salvestada eraldi R muutujana, võib tunduda ilus kasutada selleks operaatorit ->.
andmed %>%
  group_by(sugu) %>%
  summarise(keskmine_pikkus = mean(pikkus)) -> uued_andmedLisamärkus 2. Võib-olla on mõistlik mainida, et operaatorit %>% saab kasutada ka teiste funktsioonide (mitte ainult dplyr enda funktsioonide) jaoks.
c(1,3) %>% mean() %>% log(base=2)## [1] 1Täiendav abimaterjal
Täiendavat informatsiooni dplyr funktsionaalsuse kohta leiab: