Statistiline andmeteadus ja visualiseerimine MTMS.01.100     Praktikumid     Projektid

dplyr minimalistlikud näited

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    150

select()

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    30

filter()

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    200

arrange()

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    150

mutate()

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

summarise()

agregeeri tunnuse väärtused üheks väärtuseks

summarise(andmed, keskmine_pikkus = mean(pikkus))
##   keskmine_pikkus
## 1        176.6667

group_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            1

Sageli 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    200

Enne 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    150

Mitme 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    200

Eelnevat %>% 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_andmed

Lisamä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] 1

Täiendav abimaterjal

Täiendavat informatsiooni dplyr funktsionaalsuse kohta leiab: