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("Jana", "Jozef", "Mária")
Vek  <- c(10, 11, 9)
Body <- c(85, 92, 78)

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)
##    Meno Vek Body
## 1  Jana  10   85
## 2 Jozef  11   92
## 3 Mária   9   78

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

udaje$Vek                       # adresovanie premennej v data.frame
## [1] 10 11  9
mean(udaje$Vek)                 # priemerný vek
## [1] 10
udaje[Meno == "Jozef", ]       # adresovanie celého riadku podľa podmienky
##    Meno Vek Body
## 2 Jozef  11   92
udaje[3, ]                      # adresovanie celého 3. riadku
##    Meno Vek Body
## 3 Mária   9   78
udaje[, 2:3]                    # druhý a tretí stĺpec tabuľky
##   Vek Body
## 1  10   85
## 2  11   92
## 3   9   78
udaje[1, 1]                     # jedna bunka tabuľky
## [1] "Jana"
summary(udaje)                  # základná deskriptívna štatistika
##      Meno                Vek            Body     
##  Length:3           Min.   : 9.0   Min.   :78.0  
##  Class :character   1st Qu.: 9.5   1st Qu.:81.5  
##  Mode  :character   Median :10.0   Median :85.0  
##                     Mean   :10.0   Mean   :85.0  
##                     3rd Qu.:10.5   3rd Qu.:88.5  
##                     Max.   :11.0   Max.   :92.0

Ak chceme pridať k tabuľke dodatočný stĺpec, použijeme cbind() alebo priamy zápis cez $:

MaAuto <- c(TRUE, FALSE, TRUE)
udaje <- cbind(udaje, MaAuto)
# alternatíva: udaje$MaAuto <- c(TRUE, FALSE, TRUE)
udaje
##    Meno Vek Body MaAuto
## 1  Jana  10   85   TRUE
## 2 Jozef  11   92  FALSE
## 3 Mária   9   78   TRUE

Ak chceme pridať riadok, potom:

# Nový záznam (musí sedieť poradie/typy stĺpcov)
novy.riadok <- data.frame(Meno = "Diana", Vek = 22.485, Body = 42, MaAuto = FALSE)

# Pripojenie riadku
udaje <- rbind(udaje, novy.riadok)
udaje
##    Meno    Vek Body MaAuto
## 1  Jana 10.000   85   TRUE
## 2 Jozef 11.000   92  FALSE
## 3 Mária  9.000   78   TRUE
## 4 Diana 22.485   42  FALSE

Tabuľky v prostredí kableExtra

library(knitr)
library(kableExtra)

kable(
  udaje,
  digits = 2,
  align = c("l", "c", "r", "c"),
  caption = "Toto je tabuľka"
) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  )
Toto je tabuľka
Meno Vek Body MaAuto
Jana 10.00 85 TRUE
Jozef 11.00 92 FALSE
Mária 9.00 78 TRUE
Diana 22.48 42 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 a vzájomne sa dopĺňajú.

# Load tidyverse
library(tidyverse)

dplyr – manipulácia s údajmi

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

  1. filter() – výber riadkov
  2. select() – výber stĺpcov
  3. mutate() – tvorba nových stĺpcov
  4. arrange() – triedenie riadkov
  5. summarise() – sumarizácia

V nasledovnej ukážke využijeme tzv. pipes %>%, ktoré umožňujú posielať výsledky z jednej funkcie priamo do závere ďalšej funkcie.

Výber a triedenie

udaje %>%
  filter(Body > 50) %>%                 # vyberá záznamy s Body > 50
  arrange(desc(Body)) %>%               # triedi zostupne podľa Body
  kable(caption = "Žiaci s Body > 50, zoradení zostupne",
        align = c("l","c","r","c")) %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  )
Žiaci s Body > 50, zoradení zostupne
Meno Vek Body MaAuto
Jozef 11 92 FALSE
Jana 10 85 TRUE
Mária 9 78 TRUE

Zoskupenie a sumarizácia

udaje %>%
  group_by(MaAuto) %>%                 # zoskupí podľa MaAuto
  summarise(
    Priem_Body = mean(Body, na.rm = TRUE),
    Pocet = 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 67.0 2
TRUE 81.5 2

Vytváranie novej premennej

udaje %>%
  mutate(
    grade = case_when(               # vytvára novú premennú grade
      Body >= 90 ~ "A",
      Body >= 80 ~ "B",
      Body >= 70 ~ "C",
      TRUE ~ "D"
    ),
    VekPoPlnoletosti = round(Vek - 18, 0)
  ) %>%
  kable(caption = "Doplnené premenné: grade a VekPoPlnoletosti") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  )
Doplnené premenné: grade a VekPoPlnoletosti
Meno Vek Body MaAuto grade VekPoPlnoletosti
Jana 10.000 85 TRUE B -8
Jozef 11.000 92 FALSE A -7
Mária 9.000 78 TRUE C -9
Diana 22.485 42 FALSE D 4

Vizualizácia – ggplot2

library(ggplot2)

# Stĺpcový graf bodov podľa mena
udaje %>%
  ggplot(aes(x = Meno, y = Body, fill = MaAuto)) +
  geom_col() +
  labs(
    title = "Body podľa žiakov",
    x = "Meno",
    y = "Body",
    fill = "Má auto"
  ) +
  theme_minimal()

Spojovanie tabuliek (joins)

# Ďalšia tabuľka s dodatočnými informáciami
vozidlo <- tibble(
  Meno = c("Jana", "Mária", "Diana", "Jozef"),
  Typ = c("hatchback", "sedan", "SUV", "coupe")
)

udaje %>%
  left_join(vozidlo, by = "Meno") %>%
  kable(caption = "Left join: informácia o type vozidla podľa mena") %>%
  kable_styling(
    bootstrap_options = c("striped", "hover", "condensed", "responsive"),
    full_width = FALSE,
    position = "center"
  )
Left join: informácia o type vozidla podľa mena
Meno Vek Body MaAuto Typ
Jana 10.000 85 TRUE hatchback
Jozef 11.000 92 FALSE coupe
Mária 9.000 78 TRUE sedan
Diana 22.485 42 FALSE SUV