knitr::opts_chunk$set(
    echo = TRUE,
    message = FALSE,
    warning = FALSE
)

Spracované a inšpirované Notebookom Jason Locklin: Introduction to R for Education Data Analysis and Visualization

Práca s údajmi

Tradičná práca s databázou

Pre prácu s údajmi (databázou) používame najčastejšie dátový typ .data.frame.. Je to tabuľka, ktorá pozostáva zo stĺpcov rozličných typov. Jeden riadok pritom predstavuje jeden záznam databázy.

Príklad

Majme údaje o žiakoch, ktoré predstavujú tri premenné - Meno, Vek a Body:

# Working with data frames

  Meno = c("Adam", "Filip", "Barbora")
  Vek = c(24, 22, 19)
  Body = c(77, 99, 58)

Tieto tri premenné nie sú zatiaľ nijako prepojené, predstavujú izolované stĺpce tabuľky. Do tabuľky ich spojíme nasledovne

udaje <- data.frame(Meno,Vek,Body)
print(udaje)

Vysvetlenie: DataFrame má tri stĺpce: Meno, Vek a Body. Niektoré operácie s údajmi organizovanými v .data.frame. sú uvedené nasledovne

print(udaje$Vek)                 # takto adresujeme jednotlivé premenné v data.frame
[1] 24 22 19
print(mean(udaje$Vek))           # priemerny vek
[1] 21.66667
print(udaje[Meno=="Filip",])     # adresovanie celého riadku
print(udaje[3,])                 # ina moznost adresovania celeho riadku
print(udaje[,2:3])               # vypisanie druheho a tretieho stlpca tabulky
print(udaje[1,1])                # vypisanie jednej bunky tabulky
[1] "Adam"
summary(udaje)                   # zakladna deskriptivna statistika celej tabulky
     Meno                Vek             Body     
 Length:3           Min.   :19.00   Min.   :58.0  
 Class :character   1st Qu.:20.50   1st Qu.:67.5  
 Mode  :character   Median :22.00   Median :77.0  
                    Mean   :21.67   Mean   :78.0  
                    3rd Qu.:23.00   3rd Qu.:88.0  
                    Max.   :24.00   Max.   :99.0  

Ak chceme pridať k tabuľke dodatočný stĺpec, potom to robíme nasledovne

Zadaný <- c(TRUE,FALSE,TRUE)
udaje <- cbind(udaje,Zadaný)
print(udaje)

Ak chceme pridať riadok, potom

# New record (must match column order/types)
novy.riadok <- data.frame(Meno = "Zuzana", Vek = 45, Body = 44,Zadaný = FALSE)

# Append
udaje <- rbind(udaje, novy.riadok)
print(udaje)

Tabuľky v prostredí kableextra

library(knitr)
library(kableExtra)
kable(
  udaje,
#  format,
digits = 2,
#  row.names = NA,
#  col.names = NA,
  align=c("l","c","l","r"),
  caption = "Tabuľka"
#  label = NULL,
#  format.args = list(),
#  escape = TRUE,
 # ...
) %>%
      kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center")
Tabuľka
Meno Vek Body Zadaný
Adam 24 77 TRUE
Filip 22 99 FALSE
Barbora 19 58 TRUE
Zuzana 45 44 FALSE
NA
NA
NA
NA
NA

Tidyverse - moderná práca s údajmi

Tidyverse je súbor knižníc, ktoré majú zjednodušiť prácu s údajmi. Majú jednotný komunikačný štandard, vzájomne sa doplňujú.

# Load tidyverse
library(tidyverse)

dplyr - pre manipuláciu s údajmi

.dplyr. poskytuje základné možnosti manipulácie s údajmi, ako napr.:

  1. filter(): vyberá riadky

  2. select(): vyberá stĺpce

  3. mutate(): vytvára nové stĺpce tabuľky

  4. arrange(): triedi riadky

  5. summarise(): sumarizuje

V nasledovnej ukážke využijeme tzv. .pipes. %>% alebo %<% umožňuje posielať výsledky z jednej funkcie priamo do volanie nasledovnej funkcie. To umožňuje ľahšiu čitateľnosť kódov, konvencia sa ujala a má široké použitie.

Výber a triedenie

# výber a následné triedenie
udaje %>%
  filter(Body > 45) %>%     # vybera zaznamy s poctom bodov viac, ako 45
  arrange(desc(Body)) %>%     # vysledny subor triedi zostupne podla premennej Body
kable %>%
    kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  )
Meno Vek Body Zadaný
Filip 22 99 FALSE
Adam 24 77 TRUE
Barbora 19 58 TRUE

Zoskupenie a sumarizácia

# Zoskupí and sumarizuje
udaje %>%
  group_by(Zadaný) %>%      # zoskupi zaznamy podla premennej Zadaný a vypocita za kazdu skupinu jej priemer Body
  summarise(                # a taktiez spocita pocetnosti oboch skupin
    Priem.Body = mean(Body),
    count = n()
  ) %>%
 kable(
    caption = "Priemerné Body podľa premennej Zadaný",
    col.names = c("Zadaný", "Priemer Body", "Počet"),
    align = "c"
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  )
Priemerné Body podľa premennej Zadaný
Zadaný Priemer Body Počet
FALSE 71.5 2
TRUE 67.5 2

Vytváranie novej premennej

# Vytváranie novej premennej
udaje %>%
  mutate(
    grade = case_when(     # vytvara novu premennu grade podla nasledovnej relacnej schemy
      Body >= 80 ~ "A",
      Body >= 70 ~ "B",
      Body >= 60 ~ "C",
      TRUE ~ "D"
    ),
    VekPoPlnoletosti = round(Vek-18,0)
  ) %>% 
  kable %>%
   kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  ) 
Meno Vek Body Zadaný grade VekPoPlnoletosti
Adam 24 77 TRUE B 6
Filip 22 99 FALSE A 4
Barbora 19 58 TRUE D 1
Zuzana 45 44 FALSE D 27
LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSIKYXV0aG9yOiAiRGlhbmEgxI51cmlhbsSNaWtvdsOhICA8YnI+CihzIHZ5dcW+aXTDrW0gdmVyZWpuZSBkb3N0dXBuw71jaCBrw7Nkb3YpIgpkYXRlOiAiT2t0w7NiZXIgMjAyNSIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOgogICAgdG9jOiB0cnVlCiAgICB0b2NfZmxvYXQ6IHRydWUKICAgIHRoZW1lOiB1bml0ZWQKICAgIGhpZ2hsaWdodDogdGFuZ28KZWRpdG9yX29wdGlvbnM6IAogIG1hcmtkb3duOiAKICAgIHdyYXA6IDcyCi0tLQoKPHN0eWxlPgovKiB0b3RvIGplIMSNaXN0w70gSFRNTC9DU1MsIG5pZSBSLWNodW5rICovCmJvZHksIC5tYWluLWNvbnRhaW5lciB7CiAgYmFja2dyb3VuZC1jb2xvcjogI0ZGRTRFMSAhaW1wb3J0YW50OwogIGNvbG9yOiAjMjIyOwp9Cjwvc3R5bGU+CgpgYGB7cn0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KAogICAgZWNobyA9IFRSVUUsCiAgICBtZXNzYWdlID0gRkFMU0UsCiAgICB3YXJuaW5nID0gRkFMU0UKKQpgYGAKClNwcmFjb3ZhbsOpIGEgaW7FoXBpcm92YW7DqSBOb3RlYm9va29tCltKYXNvbiBMb2NrbGluOiBJbnRyb2R1Y3Rpb24gdG8gUiBmb3IgRWR1Y2F0aW9uIERhdGEgQW5hbHlzaXMgYW5kIFZpc3VhbGl6YXRpb25dKGh0dHA6Ly9ycHVicy5jb20vamFzb25ML0xhbmRMKXt0YXJnZXQ9Il9ibGFuayIgcmVsPSJub29wZW5lciJ9CgoKIyBQcsOhY2EgcyDDumRham1pCgojIyBUcmFkacSNbsOhIHByw6FjYSBzIGRhdGFiw6F6b3UKClByZSBwcsOhY3UgcyDDumRham1pIChkYXRhYsOhem91KSBwb3XFvsOtdmFtZSBuYWrEjWFzdGVqxaFpZSBkw6F0b3bDvSB0eXAgLmRhdGEuZnJhbWUuLiBKZSB0byB0YWJ1xL5rYSwga3RvcsOhIHBvem9zdMOhdmEgem8gc3TEunBjb3Ygcm96bGnEjW7DvWNoIHR5cG92LiBKZWRlbiByaWFkb2sgcHJpdG9tIHByZWRzdGF2dWplIGplZGVuIHrDoXpuYW0gZGF0YWLDoXp5LgoKIyMjIFByw61rbGFkCgpNYWptZSDDumRhamUgbyDFvmlha29jaCwga3RvcsOpIHByZWRzdGF2dWrDuiB0cmkgcHJlbWVubsOpIC0gTWVubywgVmVrIGEgQm9keToKCmBgYHtyfQojIFdvcmtpbmcgd2l0aCBkYXRhIGZyYW1lcwoKICBNZW5vID0gYygiQWRhbSIsICJGaWxpcCIsICJCYXJib3JhIikKICBWZWsgPSBjKDI0LCAyMiwgMTkpCiAgQm9keSA9IGMoNzcsIDk5LCA1OCkKYGBgCgpUaWV0byB0cmkgcHJlbWVubsOpIG5pZSBzw7ogemF0aWHEviBuaWpha28gcHJlcG9qZW7DqSwgcHJlZHN0YXZ1asO6IGl6b2xvdmFuw6kgc3TEunBjZSB0YWJ1xL5reS4gRG8gdGFidcS+a3kgaWNoIHNwb2rDrW1lIG5hc2xlZG92bmUKCmBgYHtyfQp1ZGFqZSA8LSBkYXRhLmZyYW1lKE1lbm8sVmVrLEJvZHkpCnByaW50KHVkYWplKQpgYGAKCgpWeXN2ZXRsZW5pZTogRGF0YUZyYW1lIG3DoSB0cmkgc3TEunBjZTogTWVubywgVmVrIGEgQm9keS4gTmlla3RvcsOpIG9wZXLDoWNpZSBzIMO6ZGFqbWkgb3JnYW5pem92YW7DvW1pIHYgLmRhdGEuZnJhbWUuIHPDuiB1dmVkZW7DqSBuYXNsZWRvdm5lCgpgYGB7cn0KcHJpbnQodWRhamUkVmVrKSAgICAgICAgICAgICAgICAgIyB0YWt0byBhZHJlc3VqZW1lIGplZG5vdGxpdsOpIHByZW1lbm7DqSB2IGRhdGEuZnJhbWUKcHJpbnQobWVhbih1ZGFqZSRWZWspKSAgICAgICAgICAgIyBwcmllbWVybnkgdmVrCnByaW50KHVkYWplW01lbm89PSJGaWxpcCIsXSkgICAgICMgYWRyZXNvdmFuaWUgY2Vsw6lobyByaWFka3UKcHJpbnQodWRhamVbMyxdKSAgICAgICAgICAgICAgICAgIyBpbmEgbW96bm9zdCBhZHJlc292YW5pYSBjZWxlaG8gcmlhZGt1CnByaW50KHVkYWplWywyOjNdKSAgICAgICAgICAgICAgICMgdnlwaXNhbmllIGRydWhlaG8gYSB0cmV0aWVobyBzdGxwY2EgdGFidWxreQpwcmludCh1ZGFqZVsxLDFdKSAgICAgICAgICAgICAgICAjIHZ5cGlzYW5pZSBqZWRuZWogYnVua3kgdGFidWxreQpzdW1tYXJ5KHVkYWplKSAgICAgICAgICAgICAgICAgICAjIHpha2xhZG5hIGRlc2tyaXB0aXZuYSBzdGF0aXN0aWthIGNlbGVqIHRhYnVsa3kKYGBgCgpBayBjaGNlbWUgcHJpZGHFpSBrIHRhYnXEvmtlIGRvZGF0b8SNbsO9IHN0xLpwZWMsIHBvdG9tIHRvIHJvYsOtbWUgbmFzbGVkb3ZuZQoKYGBge3J9ClphZGFuw70gPC0gYyhUUlVFLEZBTFNFLFRSVUUpCnVkYWplIDwtIGNiaW5kKHVkYWplLFphZGFuw70pCnByaW50KHVkYWplKQpgYGAKCkFrIGNoY2VtZSBwcmlkYcWlIHJpYWRvaywgcG90b20KCmBgYHtyfQojIE5ldyByZWNvcmQgKG11c3QgbWF0Y2ggY29sdW1uIG9yZGVyL3R5cGVzKQpub3Z5LnJpYWRvayA8LSBkYXRhLmZyYW1lKE1lbm8gPSAiWnV6YW5hIiwgVmVrID0gNDUsIEJvZHkgPSA0NCxaYWRhbsO9ID0gRkFMU0UpCgojIEFwcGVuZAp1ZGFqZSA8LSByYmluZCh1ZGFqZSwgbm92eS5yaWFkb2spCnByaW50KHVkYWplKQpgYGAKCiMjIyBUYWJ1xL5reSB2IHByb3N0cmVkw60ga2FibGVleHRyYQoKCmBgYHtyfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmthYmxlKAogIHVkYWplLAojICBmb3JtYXQsCmRpZ2l0cyA9IDIsCiMgIHJvdy5uYW1lcyA9IE5BLAojICBjb2wubmFtZXMgPSBOQSwKICBhbGlnbj1jKCJsIiwiYyIsImwiLCJyIiksCiAgY2FwdGlvbiA9ICJUYWJ1xL5rYSIKIyAgbGFiZWwgPSBOVUxMLAojICBmb3JtYXQuYXJncyA9IGxpc3QoKSwKIyAgZXNjYXBlID0gVFJVRSwKICMgLi4uCikgJT4lCiAgICAgIGthYmxlX3N0eWxpbmcoYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiKQoKCgoKCmBgYAoKCgojIyBUaWR5dmVyc2UgLSBtb2Rlcm7DoSBwcsOhY2EgcyDDumRham1pCgpUaWR5dmVyc2UgamUgc8O6Ym9yIGtuacW+bsOtYywga3RvcsOpIG1hasO6IHpqZWRub2R1xaFpxaUgcHLDoWN1IHMgw7pkYWptaS4gTWFqw7ogamVkbm90bsO9IGtvbXVuaWthxI1uw70gxaF0YW5kYXJkLCB2esOham9tbmUgc2EgZG9wbMWIdWrDui4KCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgTG9hZCB0aWR5dmVyc2UKbGlicmFyeSh0aWR5dmVyc2UpCmBgYAoKIyMjICBkcGx5ciAtIHByZSBtYW5pcHVsw6FjaXUgcyDDumRham1pCgouZHBseXIuIHBvc2t5dHVqZSB6w6FrbGFkbsOpIG1vxb5ub3N0aSBtYW5pcHVsw6FjaWUgcyDDumRham1pLCBha28gbmFwci46IAoKMS4gZmlsdGVyKCk6IHZ5YmVyw6EgcmlhZGt5IAoKMS4gc2VsZWN0KCk6IHZ5YmVyw6Egc3TEunBjZSAKCjEuIG11dGF0ZSgpOiB2eXR2w6FyYSBub3bDqSBzdMS6cGNlIHRhYnXEvmt5IAoKMS4gYXJyYW5nZSgpOiB0cmllZGkgcmlhZGt5IAoKMS4gc3VtbWFyaXNlKCk6IHN1bWFyaXp1amUKClYgbmFzbGVkb3ZuZWogdWvDocW+a2Ugdnl1xb5pamVtZSB0enYuIC5waXBlcy4gJT4lIGFsZWJvICU8JSB1bW/FvsWIdWplIHBvc2llbGHFpSB2w71zbGVka3kgeiBqZWRuZWogZnVua2NpZSBwcmlhbW8gZG8gdm9sYW5pZSBuYXNsZWRvdm5laiBmdW5rY2llLiBUbyB1bW/FvsWIdWplIMS+YWjFoWl1IMSNaXRhdGXEvm5vc8WlIGvDs2Rvdiwga29udmVuY2lhIHNhIHVqYWxhIGEgbcOhIMWhaXJva8OpIHBvdcW+aXRpZS4KCiMjIyMgVsO9YmVyIGEgdHJpZWRlbmllCgpgYGB7cn0KIyB2w71iZXIgYSBuw6FzbGVkbsOpIHRyaWVkZW5pZQp1ZGFqZSAlPiUKICBmaWx0ZXIoQm9keSA+IDQ1KSAlPiUgICAgICMgdnliZXJhIHphem5hbXkgcyBwb2N0b20gYm9kb3YgdmlhYywgYWtvIDQ1CiAgYXJyYW5nZShkZXNjKEJvZHkpKSAlPiUgICAgICMgdnlzbGVkbnkgc3Vib3IgdHJpZWRpIHpvc3R1cG5lIHBvZGxhIHByZW1lbm5laiBCb2R5CmthYmxlICU+JQogICAga2FibGVfc3R5bGluZygKICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLAogICAgZnVsbF93aWR0aCA9IEZBTFNFLAogICAgcG9zaXRpb24gPSAiY2VudGVyIgogICkKYGBgCgojIyMjIFpvc2t1cGVuaWUgYSBzdW1hcml6w6FjaWEKCmBgYHtyfQojIFpvc2t1cMOtIGFuZCBzdW1hcml6dWplCnVkYWplICU+JQogIGdyb3VwX2J5KFphZGFuw70pICU+JSAgICAgICMgem9za3VwaSB6YXpuYW15IHBvZGxhIHByZW1lbm5laiBaYWRhbsO9IGEgdnlwb2NpdGEgemEga2F6ZHUgc2t1cGludSBqZWogcHJpZW1lciBCb2R5CiAgc3VtbWFyaXNlKCAgICAgICAgICAgICAgICAjIGEgdGFrdGlleiBzcG9jaXRhIHBvY2V0bm9zdGkgb2JvY2ggc2t1cGluCiAgICBQcmllbS5Cb2R5ID0gbWVhbihCb2R5KSwKICAgIGNvdW50ID0gbigpCiAgKSAlPiUKIGthYmxlKAogICAgY2FwdGlvbiA9ICJQcmllbWVybsOpIEJvZHkgcG9kxL5hIHByZW1lbm5laiBaYWRhbsO9IiwKICAgIGNvbC5uYW1lcyA9IGMoIlphZGFuw70iLCAiUHJpZW1lciBCb2R5IiwgIlBvxI1ldCIpLAogICAgYWxpZ24gPSAiYyIKICApICU+JQogIGthYmxlX3N0eWxpbmcoCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwKICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwKICAgIHBvc2l0aW9uID0gImNlbnRlciIKICApCmBgYAoKIyMjIyBWeXR2w6FyYW5pZSBub3ZlaiBwcmVtZW5uZWoKCmBgYHtyfQojIFZ5dHbDoXJhbmllIG5vdmVqIHByZW1lbm5lagp1ZGFqZSAlPiUKICBtdXRhdGUoCiAgICBncmFkZSA9IGNhc2Vfd2hlbiggICAgICMgdnl0dmFyYSBub3Z1IHByZW1lbm51IGdyYWRlIHBvZGxhIG5hc2xlZG92bmVqIHJlbGFjbmVqIHNjaGVteQogICAgICBCb2R5ID49IDgwIH4gIkEiLAogICAgICBCb2R5ID49IDcwIH4gIkIiLAogICAgICBCb2R5ID49IDYwIH4gIkMiLAogICAgICBUUlVFIH4gIkQiCiAgICApLAogICAgVmVrUG9QbG5vbGV0b3N0aSA9IHJvdW5kKFZlay0xOCwwKQogICkgJT4lIAogIGthYmxlICU+JQogICBrYWJsZV9zdHlsaW5nKAogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiCiAgKSAKYGBgCgoK