Úvod

Krátky dokument, v ktorom pracujem s data.frame, ukážem adresovanie stĺpcov/riadkov, pridávanie stĺpcov/riadkov (cbind/rbind), sumarizáciu a filtrovanie pomocou dplyr a krátko grafy s ggplot2. Tabuľky formátujem cez knitr::kable() a kableExtra::kable_styling()

Základ: vytvorenie data.frame a adresovanie

Vytvorím jednoduché údaje o študentoch (moje vlastné hodnoty) a ukážem prácu so stĺpcami a riadkami.

Meno <- c("Jozef","Anna","Mária")
Vek  <- c(21.2, 19.7, 22.5)
Body <- c(78, 91, 84)

udaje <- data.frame(Meno, Vek, Body)
udaje %>% 
  kable(digits = 2, align = c("l","r","r"), caption = "Základná tabuľka") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed","responsive"),
                full_width = FALSE, position = "center")
Základná tabuľka
Meno Vek Body
Jozef 21.2 78
Anna 19.7 91
Mária 22.5 84

Adresovanie stĺpcov/riadkov a pár rýchlych výpočtov:

# prístup k stĺpcu
udaje$Vek
## [1] 21.2 19.7 22.5
mean(udaje$Vek)
## [1] 21.13333
# filtrovanie riadkov podľa mena
udaje[udaje$Meno == "Jozef", ]
##    Meno  Vek Body
## 1 Jozef 21.2   78
# výber riadkov a stĺpcov podľa indexov
udaje[1, ]        # prvý riadok
##    Meno  Vek Body
## 1 Jozef 21.2   78
udaje[, 2:3]      # druhý a tretí stĺpec
##    Vek Body
## 1 21.2   78
## 2 19.7   91
## 3 22.5   84

Pridanie stĺpca a riadku (cbind / rbind)

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

novy.riadok <- data.frame(Meno = "Diana", Vek = 20.4, Body = 88, MaAuto = FALSE)
udaje <- rbind(udaje, novy.riadok)

udaje %>% 
  kable(digits = 2, align = c("l","r","r","c"),
        caption = "Po pridaní stĺpca a riadku (cbind/rbind)") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed","responsive"),
                full_width = FALSE, position = "center")
Po pridaní stĺpca a riadku (cbind/rbind)
Meno Vek Body MaAuto
Jozef 21.2 78 TRUE
Anna 19.7 91 FALSE
Mária 22.5 84 TRUE
Diana 20.4 88 FALSE

Malé cvičenie – filter, select, arrange, mutate, summarise

Použijem rovnakú tabuľku a ukážem základné dplyr príkazy.

sumar <- udaje %>%
  select(Meno, Vek, Body, MaAuto) %>%
  mutate(Body_zaokruh = round(Body, 0)) %>%
  arrange(desc(Body_zaokruh))

sumar %>% 
  kable(caption = "Zoradenie podľa Body (desc) + nový stĺpec Body_zaokruh") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed","responsive"),
                full_width = FALSE, position = "center")
Zoradenie podľa Body (desc) + nový stĺpec Body_zaokruh
Meno Vek Body MaAuto Body_zaokruh
Anna 19.7 91 FALSE 91
Diana 20.4 88 FALSE 88
Mária 22.5 84 TRUE 84
Jozef 21.2 78 TRUE 78
udaje %>% 
  group_by(MaAuto) %>%
  summarise(priemerny_vek = mean(Vek), priemerne_body = mean(Body), .groups = "drop") %>%
  kable(digits = 2, caption = "Zoskupenie (group_by) a sumarizácia (summarise)") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed","responsive"),
                full_width = FALSE, position = "center")
Zoskupenie (group_by) a sumarizácia (summarise)
MaAuto priemerny_vek priemerne_body
FALSE 20.05 89.5
TRUE 21.85 81.0

Práca s dátami v čase (moje vlastné údaje)

Vytvorím malú databázu predajov s dátumami (časovo usporiadané údaje).

predaje <- data.frame(
  Dátum   = as.Date(c("2025-09-28","2025-09-29","2025-09-30","2025-10-01","2025-10-02")),
  Produkt = c("Proteín","Tyčinka","Shaker","Proteín","Proteín"),
  Ks      = c(2, 10, 3, 1, 2),
  Cena    = c(22.9, 1.9, 6.0, 23.5, 22.0)
)

predaje %>% 
  kable(caption = "Vstupné predaje (časovo usporiadané)") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed","responsive"),
                full_width = FALSE, position = "center")
Vstupné predaje (časovo usporiadané)
Dátum Produkt Ks Cena
2025-09-28 Proteín 2 22.9
2025-09-29 Tyčinka 10 1.9
2025-09-30 Shaker 3 6.0
2025-10-01 Proteín 1 23.5
2025-10-02 Proteín 2 22.0
sumar_predaje <- predaje %>%
  mutate(Tržba = Ks * Cena) %>%
  arrange(Dátum)

sumar_predaje %>% 
  kable(digits = 2, caption = "Predaje s tržbou, zoradené podľa dátumu") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed","responsive"),
                full_width = FALSE, position = "center")
Predaje s tržbou, zoradené podľa dátumu
Dátum Produkt Ks Cena Tržba
2025-09-28 Proteín 2 22.9 45.8
2025-09-29 Tyčinka 10 1.9 19.0
2025-09-30 Shaker 3 6.0 18.0
2025-10-01 Proteín 1 23.5 23.5
2025-10-02 Proteín 2 22.0 44.0

Počty a tržby podľa produktu

podla_produktu <- sumar_predaje %>%
  group_by(Produkt) %>%
  summarise(objednavok = n(), spolu_ks = sum(Ks), spolu_trzba = sum(Tržba), .groups = "drop") %>%
  arrange(desc(spolu_trzba))

podla_produktu %>% 
  kable(digits = 2, caption = "Sumár podľa produktu") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed","responsive"),
                full_width = FALSE, position = "center")
Sumár podľa produktu
Produkt objednavok spolu_ks spolu_trzba
Proteín 3 5 113.3
Tyčinka 1 10 19.0
Shaker 1 3 18.0
# počty záznamov cez count()
sumar_predaje %>%
  count(Produkt) %>%
  kable(caption = "Počet záznamov cez count(Produkt)") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed","responsive"),
                full_width = FALSE, position = "center")
Počet záznamov cez count(Produkt)
Produkt n
Proteín 3
Shaker 1
Tyčinka 1

Grafy (ggplot2)

# Tržba v čase (čiarový graf)
ggplot(sumar_predaje, aes(x = Dátum, y = Tržba)) +
  geom_line() +
  geom_point() +
  labs(title = "Denná tržba v čase", x = "Dátum", y = "Tržba")

# Tržba podľa produktu (stĺpcový graf)
ggplot(podla_produktu, aes(x = Produkt, y = spolu_trzba)) +
  geom_col() +
  labs(title = "Tržba podľa produktu", x = "Produkt", y = "Spolu tržba")

Malé cvičenie – import z CSV

Nižšie demonštrujem použitie read.csv2() (ako v pôvodnom Rmd), ale bez externej závislosti: vytvorím krátky CSV text v pamäti a načítam ho.

csv_text <- "Dátum;Produkt;Ks;Cena
2025-10-01;Proteín;1;23,5
2025-10-02;Tyčinka;12;1,9
2025-10-03;Shaker;2;6,0"

con <- textConnection(csv_text, encoding = "UTF-8")
predaje_csv <- read.csv2(con, header = TRUE, sep = ";", dec = ",")
close(con)

predaje_csv %>% 
  kable(caption = "Načítané z CSV (read.csv2) cez textConnection") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed","responsive"),
                full_width = FALSE, position = "center")
Načítané z CSV (read.csv2) cez textConnection
Dátum Produkt Ks Cena
2025-10-01 Proteín 1 23.5
2025-10-02 Tyčinka 12 1.9
2025-10-03 Shaker 2 6.0

Môj návrh použitia novinky

Nižšie sú dve drobné „novinky“ oproti pôvodnému dokumentu:

  1. case_when() – kategorizácia tržby na nízka/stredná/vysoká.
  2. slice_max() – rýchly výber TOP dní podľa tržby.
novinky <- sumar_predaje %>%
  mutate(
    kateg_trzby = dplyr::case_when(
      Tržba < 10 ~ "nízka",
      Tržba < 25 ~ "stredná",
      TRUE       ~ "vysoká"
    )
  )

novinky %>% 
  kable(caption = "Kategorizovaná tržba cez case_when()") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed","responsive"),
                full_width = FALSE, position = "center")
Kategorizovaná tržba cez case_when()
Dátum Produkt Ks Cena Tržba kateg_trzby
2025-09-28 Proteín 2 22.9 45.8 vysoká
2025-09-29 Tyčinka 10 1.9 19.0 stredná
2025-09-30 Shaker 3 6.0 18.0 stredná
2025-10-01 Proteín 1 23.5 23.5 stredná
2025-10-02 Proteín 2 22.0 44.0 vysoká
top_dni <- novinky %>%
  dplyr::slice_max(order_by = Tržba, n = 2, with_ties = FALSE)

top_dni %>% 
  kable(caption = "TOP 2 dni podľa tržby (slice_max)") %>%
  kable_styling(bootstrap_options = c("striped","hover","condensed","responsive"),
                full_width = FALSE, position = "center")
TOP 2 dni podľa tržby (slice_max)
Dátum Produkt Ks Cena Tržba kateg_trzby
2025-09-28 Proteín 2 22.9 45.8 vysoká
2025-10-02 Proteín 2 22.0 44.0 vysoká