Statistiline andmeteadus ja visualiseerimine MTMS.01.100     Praktikumid     Projektid

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

## Warning: package 'dplyr' was built under R version 3.2.3
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

alt text

# 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

alt text

# 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

alt text

# 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

alt text

# 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)
##   sugu vanus pikkus pikkus2 suvaline_tunnus
## 1    M    20    180     1.8            3600
## 2    M    60    200     2.0           12000
## 3    N    30    150     1.5            4500

summarise()

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

alt text

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

group_by()

muuda andmestik grupeeritud andmestikuks, kus funktsioone rakendatakse eraldi gruppidele

alt text

andmed_grupeeritult = group_by(andmed, sugu)
# Rakendame funktsiooni summarise iga grupi jaoks eraldi
summarise(andmed_grupeeritult, keskmine_pikkus = mean(pikkus))
## Source: local data frame [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())
## Source: local data frame [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

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: