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("Peter", "Adam", "Erik")
  Vek = c(11, 12, 10)
  Body = c(87, 94, 80)

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] 11 12 10
print(mean(udaje$Vek))  # priemerny vek
[1] 11
print(udaje[Meno=="Erik",])  # adresovanie celého riadku
print(udaje[2,])  # ina moznost adresovania celeho riadku
print(udaje[,2:1])  # vypisanie druheho a tretieho stlpca tabulky
print(udaje[2,2])  # vypisanie jednej bunky tabulky
[1] 12
summary(udaje)  # zakladna deskriptivna statistika celej tabulky
     Meno                Vek            Body     
 Length:3           Min.   :10.0   Min.   :80.0  
 Class :character   1st Qu.:10.5   1st Qu.:83.5  
 Mode  :character   Median :11.0   Median :87.0  
                    Mean   :11.0   Mean   :87.0  
                    3rd Qu.:11.5   3rd Qu.:90.5  
                    Max.   :12.0   Max.   :94.0  

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 = "Richard", Vek = 22.755, Body = 44,MaAuto = FALSE)

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

Tabuľky v prostredí kableextra

library(knitr)
library(kableExtra)
kable(
  udaje,
  # format, (upr.)
digits = 3,
  # row.names = NA,
  # col.names = NA,
  align=c("l","c","l","r"),
  caption = "Toto je tabuľka"
  # label = NULL,
  # format.args = list(),
  # escape = TRUE,
  # ... (upr.)
) %>%
      kable_styling(bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center")
Toto je tabuľka
Meno Vek Body MaAuto
Peter 11.000 87 TRUE
Adam 12.000 94 FALSE
Erik 10.000 80 TRUE
Richard 22.755 44 FALSE

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 > 52) %>%  # 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"
  )
Meno Vek Body MaAuto
Adam 12 94 FALSE
Peter 11 87 TRUE
Erik 10 80 TRUE

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"
  )
Priemerné Body podľa premennej MaAuto
Má Auto Priemer Body Počet
FALSE 69.0 2
TRUE 83.5 2

Vytváranie novej premennej

  # Vytváranie novej premennej
udaje %>%
  mutate(
    grade = case_when(  # vytvara novu premennu grade podla nasledovnej relacnej schemy
      Body >= 92 ~ "A",
      Body >= 82 ~ "B",
      Body >= 72 ~ "C",
      TRUE ~ "D"
    ),
    VekPoPlnoletosti = round(Vek-20,1)
  ) %>% 
  kable %>%
   kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  ) 
Meno Vek Body MaAuto grade VekPoPlnoletosti
Peter 11.000 87 TRUE B -9.0
Adam 12.000 94 FALSE A -8.0
Erik 10.000 80 TRUE C -10.0
Richard 22.755 44 FALSE D 2.8
LS0tCnRpdGxlOiAiUHLDoWNhIHMgZGF0YWLDoXpvdSIKYXV0aG9yOiAiRmlsaXAgSnVya8OhxI1layAgPGJyPgoocyB2eXXFvml0w61tIHZlcmVqbmUgZG9zdHVwbsO9Y2gga8OzZG92KSIKZGF0ZTogIk5vdmVtYmVyIDIwMjUiCm91dHB1dDogCiAgaHRtbF9ub3RlYm9vazoKICAgIHRvYzogdHJ1ZQogICAgdG9jX2Zsb2F0OiB0cnVlCiAgICB0aGVtZTogdW5pdGVkCiAgICBoaWdobGlnaHQ6IHRhbmdvCmVkaXRvcl9vcHRpb25zOiAKICBtYXJrZG93bjogCiAgICB3cmFwOiA3MgotLS0KCmBgYHtyfQprbml0cjo6b3B0c19jaHVuayRzZXQoCiAgICBlY2hvID0gVFJVRSwKICAgIG1lc3NhZ2UgPSBGQUxTRSwKICAgIHdhcm5pbmcgPSBGQUxTRQopCmBgYAoKU3ByYWNvdmFuw6kgYSBpbsWhcGlyb3ZhbsOpIE5vdGVib29rb20KW0phc29uIExvY2tsaW46IEludHJvZHVjdGlvbiB0byBSIGZvciBFZHVjYXRpb24gRGF0YSBBbmFseXNpcyBhbmQgVmlzdWFsaXphdGlvbl0oaHR0cDovL3JwdWJzLmNvbS9qYXNvbkwvTGFuZEwpe3RhcmdldD0iX2JsYW5rIiByZWw9Im5vb3BlbmVyIn0KCgojIFByw6FjYSBzIMO6ZGFqbWkKCiMjIFRyYWRpxI1uw6EgcHLDoWNhIHMgZGF0YWLDoXpvdQoKUHJlIHByw6FjdSBzIMO6ZGFqbWkgKGRhdGFiw6F6b3UpIHBvdcW+w612YW1lIG5hasSNYXN0ZWrFoWllIGTDoXRvdsO9IHR5cCAuZGF0YS5mcmFtZS4uIEplIHRvIHRhYnXEvmthLCBrdG9yw6EgcG96b3N0w6F2YSB6byBzdMS6cGNvdiByb3psacSNbsO9Y2ggdHlwb3YuIEplZGVuIHJpYWRvayBwcml0b20gcHJlZHN0YXZ1amUgamVkZW4gesOhem5hbSBkYXRhYsOhenkuCgojIyMgUHLDrWtsYWQKCk1ham1lIMO6ZGFqZSBvIMW+aWFrb2NoLCBrdG9yw6kgcHJlZHN0YXZ1asO6IHRyaSBwcmVtZW5uw6kgLSBNZW5vLCBWZWsgYSBCb2R5OgoKYGBge3J9CiAgIyBXb3JraW5nIHdpdGggZGF0YSBmcmFtZXMKCiAgTWVubyA9IGMoIlBldGVyIiwgIkFkYW0iLCAiRXJpayIpCiAgVmVrID0gYygxMSwgMTIsIDEwKQogIEJvZHkgPSBjKDg3LCA5NCwgODApCmBgYAoKVGlldG8gdHJpIHByZW1lbm7DqSBuaWUgc8O6IHphdGlhxL4gbmlqYWtvIHByZXBvamVuw6ksIHByZWRzdGF2dWrDuiBpem9sb3ZhbsOpIHN0xLpwY2UgdGFidcS+a3kuIERvIHRhYnXEvmt5IGljaCBzcG9qw61tZSBuYXNsZWRvdm5lCgpgYGB7cn0KdWRhamUgPC0gZGF0YS5mcmFtZShNZW5vLFZlayxCb2R5KQpwcmludCh1ZGFqZSkKYGBgCgoKVnlzdmV0bGVuaWU6IERhdGFGcmFtZSBtw6EgdHJpIHN0xLpwY2U6IE1lbm8sIFZlayBhIEJvZHkuIE5pZWt0b3LDqSBvcGVyw6FjaWUgcyDDumRham1pIG9yZ2FuaXpvdmFuw71taSB2IC5kYXRhLmZyYW1lLiBzw7ogdXZlZGVuw6kgbmFzbGVkb3ZuZQoKYGBge3J9CnByaW50KHVkYWplJFZlaykgICMgdGFrdG8gYWRyZXN1amVtZSBqZWRub3RsaXbDqSBwcmVtZW5uw6kgdiBkYXRhLmZyYW1lCnByaW50KG1lYW4odWRhamUkVmVrKSkgICMgcHJpZW1lcm55IHZlawpwcmludCh1ZGFqZVtNZW5vPT0iRXJpayIsXSkgICMgYWRyZXNvdmFuaWUgY2Vsw6lobyByaWFka3UKcHJpbnQodWRhamVbMixdKSAgIyBpbmEgbW96bm9zdCBhZHJlc292YW5pYSBjZWxlaG8gcmlhZGt1CnByaW50KHVkYWplWywyOjFdKSAgIyB2eXBpc2FuaWUgZHJ1aGVobyBhIHRyZXRpZWhvIHN0bHBjYSB0YWJ1bGt5CnByaW50KHVkYWplWzIsMl0pICAjIHZ5cGlzYW5pZSBqZWRuZWogYnVua3kgdGFidWxreQpzdW1tYXJ5KHVkYWplKSAgIyB6YWtsYWRuYSBkZXNrcmlwdGl2bmEgc3RhdGlzdGlrYSBjZWxlaiB0YWJ1bGt5CmBgYAoKQWsgY2hjZW1lIHByaWRhxaUgayB0YWJ1xL5rZSBkb2RhdG/EjW7DvSBzdMS6cGVjLCBwb3RvbSB0byByb2LDrW1lIG5hc2xlZG92bmUKCmBgYHtyfQpNYUF1dG8gPC0gYyhUUlVFLEZBTFNFLFRSVUUpCnVkYWplIDwtIGNiaW5kKHVkYWplLE1hQXV0bykKcHJpbnQodWRhamUpCmBgYAoKQWsgY2hjZW1lIHByaWRhxaUgcmlhZG9rLCBwb3RvbQoKYGBge3J9CiAgIyBOZXcgcmVjb3JkIChtdXN0IG1hdGNoIGNvbHVtbiBvcmRlci90eXBlcykKbm92eS5yaWFkb2sgPC0gZGF0YS5mcmFtZShNZW5vID0gIlJpY2hhcmQiLCBWZWsgPSAyMi43NTUsIEJvZHkgPSA0NCxNYUF1dG8gPSBGQUxTRSkKCiAgIyBBcHBlbmQgKHVwci4pCnVkYWplIDwtIHJiaW5kKHVkYWplLCBub3Z5LnJpYWRvaykKcHJpbnQodWRhamUpCmBgYAoKIyMjIFRhYnXEvmt5IHYgcHJvc3RyZWTDrSBrYWJsZWV4dHJhCgoKYGBge3J9CmxpYnJhcnkoa25pdHIpCmxpYnJhcnkoa2FibGVFeHRyYSkKa2FibGUoCiAgdWRhamUsCiAgIyBmb3JtYXQsICh1cHIuKQpkaWdpdHMgPSAzLAogICMgcm93Lm5hbWVzID0gTkEsCiAgIyBjb2wubmFtZXMgPSBOQSwKICBhbGlnbj1jKCJsIiwiYyIsImwiLCJyIiksCiAgY2FwdGlvbiA9ICJUb3RvIGplIHRhYnXEvmthIgogICMgbGFiZWwgPSBOVUxMLAogICMgZm9ybWF0LmFyZ3MgPSBsaXN0KCksCiAgIyBlc2NhcGUgPSBUUlVFLAogICMgLi4uICh1cHIuKQopICU+JQogICAgICBrYWJsZV9zdHlsaW5nKGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLAogICAgZnVsbF93aWR0aCA9IEZBTFNFLAogICAgcG9zaXRpb24gPSAiY2VudGVyIikKYGBgCgoKCiMjIFRpZHl2ZXJzZSAtIG1vZGVybsOhIHByw6FjYSBzIMO6ZGFqbWkKClRpZHl2ZXJzZSBqZSBzw7pib3Iga25pxb5uw61jLCBrdG9yw6kgbWFqw7ogemplZG5vZHXFoWnFpSBwcsOhY3UgcyDDumRham1pLiBNYWrDuiBqZWRub3Ruw70ga29tdW5pa2HEjW7DvSDFoXRhbmRhcmQsIHZ6w6Fqb21uZSBzYSBkb3BsxYh1asO6LgoKYGBge3IgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KICAjIExvYWQgdGlkeXZlcnNlCmxpYnJhcnkodGlkeXZlcnNlKQpgYGAKCiMjIyAgZHBseXIgLSBwcmUgbWFuaXB1bMOhY2l1IHMgw7pkYWptaQoKLmRwbHlyLiBwb3NreXR1amUgesOha2xhZG7DqSBtb8W+bm9zdGkgbWFuaXB1bMOhY2llIHMgw7pkYWptaSwgYWtvIG5hcHIuOiAKCjEuIGZpbHRlcigpOiB2eWJlcsOhIHJpYWRreSAKCjEuIHNlbGVjdCgpOiB2eWJlcsOhIHN0xLpwY2UgCgoxLiBtdXRhdGUoKTogdnl0dsOhcmEgbm92w6kgc3TEunBjZSB0YWJ1xL5reSAKCjEuIGFycmFuZ2UoKTogdHJpZWRpIHJpYWRreSAKCjEuIHN1bW1hcmlzZSgpOiBzdW1hcml6dWplCgpWIG5hc2xlZG92bmVqIHVrw6HFvmtlIHZ5dcW+aWplbWUgdHp2LiAucGlwZXMuICU+JSBhbGVibyAlPCUgdW1vxb7FiHVqZSBwb3NpZWxhxaUgdsO9c2xlZGt5IHogamVkbmVqIGZ1bmtjaWUgcHJpYW1vIGRvIHZvbGFuaWUgbmFzbGVkb3ZuZWogZnVua2NpZS4gVG8gdW1vxb7FiHVqZSDEvmFoxaFpdSDEjWl0YXRlxL5ub3PFpSBrw7Nkb3YsIGtvbnZlbmNpYSBzYSB1amFsYSBhIG3DoSDFoWlyb2vDqSBwb3XFvml0aWUuCgojIyMjIFbDvWJlciBhIHRyaWVkZW5pZQoKYGBge3J9CiAgIyB2w71iZXIgYSBuw6FzbGVkbsOpIHRyaWVkZW5pZQp1ZGFqZSAlPiUKICBmaWx0ZXIoQm9keSA+IDUyKSAlPiUgICMgdnliZXJhIHphem5hbXkgcyBwb2N0b20gYm9kb3YgdmlhYywgYWtvIDUwCiAgYXJyYW5nZShkZXNjKEJvZHkpKSAlPiUgICMgdnlzbGVkbnkgc3Vib3IgdHJpZWRpIHpvc3R1cG5lIHBvZGxhIHByZW1lbm5laiBCb2R5CmthYmxlICU+JQogICAga2FibGVfc3R5bGluZygKICAgIGJvb3RzdHJhcF9vcHRpb25zID0gYygic3RyaXBlZCIsICJob3ZlciIsICJjb25kZW5zZWQiLCAicmVzcG9uc2l2ZSIpLAogICAgZnVsbF93aWR0aCA9IEZBTFNFLAogICAgcG9zaXRpb24gPSAiY2VudGVyIgogICkKYGBgCgojIyMjIFpvc2t1cGVuaWUgYSBzdW1hcml6w6FjaWEKCmBgYHtyfQogICMgWm9za3Vww60gYW5kIHN1bWFyaXp1amUKdWRhamUgJT4lCiAgZ3JvdXBfYnkoTWFBdXRvKSAlPiUgICMgem9za3VwaSB6YXpuYW15IHBvZGxhIHByZW1lbm5laiBNYUF1dG8gYSB2eXBvY2l0YSB6YSBrYXpkdSBza3VwaW51IGplaiBwcmllbWVyIEJvZHkKICBzdW1tYXJpc2UoICAjIGEgdGFrdGlleiBzcG9jaXRhIHBvY2V0bm9zdGkgb2JvY2ggc2t1cGluCiAgICBQcmllbS5Cb2R5ID0gbWVhbihCb2R5KSwKICAgIGNvdW50ID0gbigpCiAgKSAlPiUKIGthYmxlKAogICAgY2FwdGlvbiA9ICJQcmllbWVybsOpIEJvZHkgcG9kxL5hIHByZW1lbm5laiBNYUF1dG8iLAogICAgY29sLm5hbWVzID0gYygiTcOhIEF1dG8iLCAiUHJpZW1lciBCb2R5IiwgIlBvxI1ldCIpLAogICAgYWxpZ24gPSAiYyIKICApICU+JQogIGthYmxlX3N0eWxpbmcoCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwKICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwKICAgIHBvc2l0aW9uID0gImNlbnRlciIKICApCmBgYAoKIyMjIyBWeXR2w6FyYW5pZSBub3ZlaiBwcmVtZW5uZWoKCmBgYHtyfQogICMgVnl0dsOhcmFuaWUgbm92ZWogcHJlbWVubmVqCnVkYWplICU+JQogIG11dGF0ZSgKICAgIGdyYWRlID0gY2FzZV93aGVuKCAgIyB2eXR2YXJhIG5vdnUgcHJlbWVubnUgZ3JhZGUgcG9kbGEgbmFzbGVkb3ZuZWogcmVsYWNuZWogc2NoZW15CiAgICAgIEJvZHkgPj0gOTIgfiAiQSIsCiAgICAgIEJvZHkgPj0gODIgfiAiQiIsCiAgICAgIEJvZHkgPj0gNzIgfiAiQyIsCiAgICAgIFRSVUUgfiAiRCIKICAgICksCiAgICBWZWtQb1Bsbm9sZXRvc3RpID0gcm91bmQoVmVrLTIwLDEpCiAgKSAlPiUgCiAga2FibGUgJT4lCiAgIGthYmxlX3N0eWxpbmcoCiAgICBib290c3RyYXBfb3B0aW9ucyA9IGMoInN0cmlwZWQiLCAiaG92ZXIiLCAiY29uZGVuc2VkIiwgInJlc3BvbnNpdmUiKSwKICAgIGZ1bGxfd2lkdGggPSBGQUxTRSwKICAgIHBvc2l0aW9uID0gImNlbnRlciIKICApIApgYGA=