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 veergudestfilter()
: vali alamhulk ridadestarrange()
: sorteeri ridumutate()
: lisa uusi veergesummarise()
: agregeeri mitu väärtust üheks tunnuseksgroup_by()
: muuda andmestik grupeeritud andmestikuks, et seejärel rakendada funktsioone igale grupile eraldiungroup()
: eemaldab andmetabelilt grupeeringutop_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äärtusedsample_n()
- tõmba n juhuslikku väärtust etteantud veerustn()
- loe kokku andmepunktide arvn_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: