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("Marián", "Ján", "Iveta")
  Vek = c(15, 21, 7)
  Body = c(95, 52, 63)

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
print(mean(udaje$Vek))           # priemerny vek
print(udaje[Meno=="Marián",])   # 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
summary(udaje)                   # zakladna deskriptivna statistika celej tabulky

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

MaAuto <- c(TRUE,FALSE,TRUE)
udaje <- cbind(udaje,MaAuto)
print(udaje)

Ak chceme pridať riadok, potom

# New record (must match column order/types)
novy.riadok <- data.frame(Meno = "Ivana", Vek = 22.485, Body = 42,MaAuto = 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 = "Toto je tabuľka"
#  label = NULL,
#  format.args = list(),
#  escape = TRUE,
 # ...
) %>%
      kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center")
Toto je tabuľka
Meno Vek Body MaAuto
Marián 15.00 95 TRUE
Ján 21.00 52 FALSE
Iveta 7.00 63 TRUE
Ivana 22.48 42 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 > 50) %>%     # vybera zaznamy s poctom bodov viac, ako 50
  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"
  )

Zoskupenie a sumarizácia

# Zoskupí and sumarizuje
udaje %>%
  group_by(MaAuto) %>%      # zoskupi zaznamy podla premennej MaAuto 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 MaAuto",
    col.names = c("Má Auto", "Priemer Body", "Počet"),
    align = "c"
  ) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  )

Vytváranie novej premennej

# Vytváranie novej premennej
udaje %>%
  mutate(
    grade = case_when(     # vytvara novu premennu grade podla nasledovnej relacnej schemy
      Body >= 90 ~ "A",
      Body >= 80 ~ "B",
      Body >= 70 ~ "C",
      TRUE ~ "D"
    ),
    VekPoPlnoletosti = round(Vek-18,0)
  ) %>% 
  kable %>%
   kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  ) 
LS0tCnRpdGxlOiAiw5psb2hhIDMiCmF1dGhvcjogIlJhZG92YW4gU3RhbsSNw61rIgpkYXRlOiAiT2t0w7NiZXIgMjAyNSIKb3V0cHV0OgogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogICAgdGhlbWU6IHVuaXRlZAogICAgaGlnaGxpZ2h0OiB0YW5nbwogIGh0bWxfZG9jdW1lbnQ6CiAgICB0b2M6IHRydWUKICAgIGRmX3ByaW50OiBwYWdlZAplZGl0b3Jfb3B0aW9uczoKICBtYXJrZG93bjoKICAgIHdyYXA6IDcyCi0tLQoKYGBge3J9CmtuaXRyOjpvcHRzX2NodW5rJHNldCgKICAgIGVjaG8gPSBUUlVFLAogICAgbWVzc2FnZSA9IEZBTFNFLAogICAgd2FybmluZyA9IEZBTFNFCikKYGBgCgpTcHJhY292YW7DqSBhIGluxaFwaXJvdmFuw6kgTm90ZWJvb2tvbQpbSmFzb24gTG9ja2xpbjogSW50cm9kdWN0aW9uIHRvIFIgZm9yIEVkdWNhdGlvbiBEYXRhIEFuYWx5c2lzIGFuZCBWaXN1YWxpemF0aW9uXShodHRwOi8vcnB1YnMuY29tL2phc29uTC9MYW5kTCl7dGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIifQoKCiMgUHLDoWNhIHMgw7pkYWptaQoKIyMgVHJhZGnEjW7DoSBwcsOhY2EgcyBkYXRhYsOhem91CgpQcmUgcHLDoWN1IHMgw7pkYWptaSAoZGF0YWLDoXpvdSkgcG91xb7DrXZhbWUgbmFqxI1hc3RlasWhaWUgZMOhdG92w70gdHlwIC5kYXRhLmZyYW1lLi4gSmUgdG8gdGFidcS+a2EsIGt0b3LDoSBwb3pvc3TDoXZhIHpvIHN0xLpwY292IHJvemxpxI1uw71jaCB0eXBvdi4gSmVkZW4gcmlhZG9rIHByaXRvbSBwcmVkc3RhdnVqZSBqZWRlbiB6w6F6bmFtIGRhdGFiw6F6eS4KCiMjIyBQcsOta2xhZAoKTWFqbWUgw7pkYWplIG8gxb5pYWtvY2gsIGt0b3LDqSBwcmVkc3RhdnVqw7ogdHJpIHByZW1lbm7DqSAtIE1lbm8sIFZlayBhIEJvZHk6CgpgYGB7cn0KIyBXb3JraW5nIHdpdGggZGF0YSBmcmFtZXMKCiAgTWVubyA9IGMoIk1hcmnDoW4iLCAiSsOhbiIsICJJdmV0YSIpCiAgVmVrID0gYygxNSwgMjEsIDcpCiAgQm9keSA9IGMoOTUsIDUyLCA2MykKYGBgCgpUaWV0byB0cmkgcHJlbWVubsOpIG5pZSBzw7ogemF0aWHEviBuaWpha28gcHJlcG9qZW7DqSwgcHJlZHN0YXZ1asO6IGl6b2xvdmFuw6kgc3TEunBjZSB0YWJ1xL5reS4gRG8gdGFidcS+a3kgaWNoIHNwb2rDrW1lIG5hc2xlZG92bmUKCmBgYHtyfQp1ZGFqZSA8LSBkYXRhLmZyYW1lKE1lbm8sVmVrLEJvZHkpCnByaW50KHVkYWplKQpgYGAKCgpWeXN2ZXRsZW5pZTogRGF0YUZyYW1lIG3DoSB0cmkgc3TEunBjZTogTWVubywgVmVrIGEgQm9keS4gTmlla3RvcsOpIG9wZXLDoWNpZSBzIMO6ZGFqbWkgb3JnYW5pem92YW7DvW1pIHYgLmRhdGEuZnJhbWUuIHPDuiB1dmVkZW7DqSBuYXNsZWRvdm5lCgpgYGB7cn0KcHJpbnQodWRhamUkVmVrKSAgICAgICAgICAgICAgICAgIyB0YWt0byBhZHJlc3VqZW1lIGplZG5vdGxpdsOpIHByZW1lbm7DqSB2IGRhdGEuZnJhbWUKcHJpbnQobWVhbih1ZGFqZSRWZWspKSAgICAgICAgICAgIyBwcmllbWVybnkgdmVrCnByaW50KHVkYWplW01lbm89PSJNYXJpw6FuIixdKSAgICMgYWRyZXNvdmFuaWUgY2Vsw6lobyByaWFka3UKcHJpbnQodWRhamVbMyxdKSAgICAgICAgICAgICAgICAgIyBpbmEgbW96bm9zdCBhZHJlc292YW5pYSBjZWxlaG8gcmlhZGt1CnByaW50KHVkYWplWywyOjNdKSAgICAgICAgICAgICAgICMgdnlwaXNhbmllIGRydWhlaG8gYSB0cmV0aWVobyBzdGxwY2EgdGFidWxreQpwcmludCh1ZGFqZVsxLDFdKSAgICAgICAgICAgICAgICAjIHZ5cGlzYW5pZSBqZWRuZWogYnVua3kgdGFidWxreQpzdW1tYXJ5KHVkYWplKSAgICAgICAgICAgICAgICAgICAjIHpha2xhZG5hIGRlc2tyaXB0aXZuYSBzdGF0aXN0aWthIGNlbGVqIHRhYnVsa3kKYGBgCgpBayBjaGNlbWUgcHJpZGHFpSBrIHRhYnXEvmtlIGRvZGF0b8SNbsO9IHN0xLpwZWMsIHBvdG9tIHRvIHJvYsOtbWUgbmFzbGVkb3ZuZQoKYGBge3J9Ck1hQXV0byA8LSBjKFRSVUUsRkFMU0UsVFJVRSkKdWRhamUgPC0gY2JpbmQodWRhamUsTWFBdXRvKQpwcmludCh1ZGFqZSkKYGBgCgpBayBjaGNlbWUgcHJpZGHFpSByaWFkb2ssIHBvdG9tCgpgYGB7cn0KIyBOZXcgcmVjb3JkIChtdXN0IG1hdGNoIGNvbHVtbiBvcmRlci90eXBlcykKbm92eS5yaWFkb2sgPC0gZGF0YS5mcmFtZShNZW5vID0gIkl2YW5hIiwgVmVrID0gMjIuNDg1LCBCb2R5ID0gNDIsTWFBdXRvID0gRkFMU0UpCgojIEFwcGVuZAp1ZGFqZSA8LSByYmluZCh1ZGFqZSwgbm92eS5yaWFkb2spCnByaW50KHVkYWplKQpgYGAKCiMjIyBUYWJ1xL5reSB2IHByb3N0cmVkw60ga2FibGVleHRyYQoKCmBgYHtyfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGthYmxlRXh0cmEpCmthYmxlKAogIHVkYWplLAojICBmb3JtYXQsCmRpZ2l0cyA9IDIsCiMgIHJvdy5uYW1lcyA9IE5BLAojICBjb2wubmFtZXMgPSBOQSwKICBhbGlnbj1jKCJsIiwiYyIsImwiLCJyIiksCiAgY2FwdGlvbiA9ICJUb3RvIGplIHRhYnXEvmthIgojICBsYWJlbCA9IE5VTEwsCiMgIGZvcm1hdC5hcmdzID0gbGlzdCgpLAojICBlc2NhcGUgPSBUUlVFLAogIyAuLi4KKSAlPiUKICAgICAga2FibGVfc3R5bGluZyhib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwKICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwKICAgIHBvc2l0aW9uID0gImNlbnRlciIpCgoKCgoKYGBgCgoKCiMjIFRpZHl2ZXJzZSAtIG1vZGVybsOhIHByw6FjYSBzIMO6ZGFqbWkKClRpZHl2ZXJzZSBqZSBzw7pib3Iga25pxb5uw61jLCBrdG9yw6kgbWFqw7ogemplZG5vZHXFoWnFpSBwcsOhY3UgcyDDumRham1pLiBNYWrDuiBqZWRub3Ruw70ga29tdW5pa2HEjW7DvSDFoXRhbmRhcmQsIHZ6w6Fqb21uZSBzYSBkb3BsxYh1asO6LgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KIyBMb2FkIHRpZHl2ZXJzZQpsaWJyYXJ5KHRpZHl2ZXJzZSkKYGBgCgojIyMgIGRwbHlyIC0gcHJlIG1hbmlwdWzDoWNpdSBzIMO6ZGFqbWkKCi5kcGx5ci4gcG9za3l0dWplIHrDoWtsYWRuw6kgbW/Fvm5vc3RpIG1hbmlwdWzDoWNpZSBzIMO6ZGFqbWksIGFrbyBuYXByLjogCgoxLiBmaWx0ZXIoKTogdnliZXLDoSByaWFka3kgCgoxLiBzZWxlY3QoKTogdnliZXLDoSBzdMS6cGNlIAoKMS4gbXV0YXRlKCk6IHZ5dHbDoXJhIG5vdsOpIHN0xLpwY2UgdGFidcS+a3kgCgoxLiBhcnJhbmdlKCk6IHRyaWVkaSByaWFka3kgCgoxLiBzdW1tYXJpc2UoKTogc3VtYXJpenVqZQoKViBuYXNsZWRvdm5laiB1a8Ohxb5rZSB2eXXFvmlqZW1lIHR6di4gLnBpcGVzLiAlPiUgYWxlYm8gJTwlIHVtb8W+xYh1amUgcG9zaWVsYcWlIHbDvXNsZWRreSB6IGplZG5laiBmdW5rY2llIHByaWFtbyBkbyB2b2xhbmllIG5hc2xlZG92bmVqIGZ1bmtjaWUuIFRvIHVtb8W+xYh1amUgxL5haMWhaXUgxI1pdGF0ZcS+bm9zxaUga8OzZG92LCBrb252ZW5jaWEgc2EgdWphbGEgYSBtw6EgxaFpcm9rw6kgcG91xb5pdGllLgoKIyMjIyBWw71iZXIgYSB0cmllZGVuaWUKCmBgYHtyfQojIHbDvWJlciBhIG7DoXNsZWRuw6kgdHJpZWRlbmllCnVkYWplICU+JQogIGZpbHRlcihCb2R5ID4gNTApICU+JSAgICAgIyB2eWJlcmEgemF6bmFteSBzIHBvY3RvbSBib2RvdiB2aWFjLCBha28gNTAKICBhcnJhbmdlKGRlc2MoQm9keSkpICU+JSAgICAgIyB2eXNsZWRueSBzdWJvciB0cmllZGkgem9zdHVwbmUgcG9kbGEgcHJlbWVubmVqIEJvZHkKa2FibGUgJT4lCiAgICBrYWJsZV9zdHlsaW5nKAogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiCiAgKQpgYGAKCiMjIyMgWm9za3VwZW5pZSBhIHN1bWFyaXrDoWNpYQoKYGBge3J9CiMgWm9za3Vww60gYW5kIHN1bWFyaXp1amUKdWRhamUgJT4lCiAgZ3JvdXBfYnkoTWFBdXRvKSAlPiUgICAgICAjIHpvc2t1cGkgemF6bmFteSBwb2RsYSBwcmVtZW5uZWogTWFBdXRvIGEgdnlwb2NpdGEgemEga2F6ZHUgc2t1cGludSBqZWogcHJpZW1lciBCb2R5CiAgc3VtbWFyaXNlKCAgICAgICAgICAgICAgICAjIGEgdGFrdGlleiBzcG9jaXRhIHBvY2V0bm9zdGkgb2JvY2ggc2t1cGluCiAgICBQcmllbS5Cb2R5ID0gbWVhbihCb2R5KSwKICAgIGNvdW50ID0gbigpCiAgKSAlPiUKIGthYmxlKAogICAgY2FwdGlvbiA9ICJQcmllbWVybsOpIEJvZHkgcG9kxL5hIHByZW1lbm5laiBNYUF1dG8iLAogICAgY29sLm5hbWVzID0gYygiTcOhIEF1dG8iLCAiUHJpZW1lciBCb2R5IiwgIlBvxI1ldCIpLAogICAgYWxpZ24gPSAiYyIKICApICU+JQogIGthYmxlX3N0eWxpbmcoCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwKICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwKICAgIHBvc2l0aW9uID0gImNlbnRlciIKICApCmBgYAoKIyMjIyBWeXR2w6FyYW5pZSBub3ZlaiBwcmVtZW5uZWoKCmBgYHtyfQojIFZ5dHbDoXJhbmllIG5vdmVqIHByZW1lbm5lagp1ZGFqZSAlPiUKICBtdXRhdGUoCiAgICBncmFkZSA9IGNhc2Vfd2hlbiggICAgICMgdnl0dmFyYSBub3Z1IHByZW1lbm51IGdyYWRlIHBvZGxhIG5hc2xlZG92bmVqIHJlbGFjbmVqIHNjaGVteQogICAgICBCb2R5ID49IDkwIH4gIkEiLAogICAgICBCb2R5ID49IDgwIH4gIkIiLAogICAgICBCb2R5ID49IDcwIH4gIkMiLAogICAgICBUUlVFIH4gIkQiCiAgICApLAogICAgVmVrUG9QbG5vbGV0b3N0aSA9IHJvdW5kKFZlay0xOCwwKQogICkgJT4lIAogIGthYmxlICU+JQogICBrYWJsZV9zdHlsaW5nKAogICAgYm9vdHN0cmFwX29wdGlvbnMgPSBjKCJzdHJpcGVkIiwgImhvdmVyIiwgImNvbmRlbnNlZCIsICJyZXNwb25zaXZlIiksCiAgICBmdWxsX3dpZHRoID0gRkFMU0UsCiAgICBwb3NpdGlvbiA9ICJjZW50ZXIiCiAgKSAKYGBgCgoK