knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE
)Práca s databázou
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 HICP krajín Európskej únie za marec až december v roku 2025. V tabuľke máme premenné krajina a marec 2025, april 2025 maj 2025.
# Working with data frames
Krajina = c("Česko", "Slovensko", "Poľsko", "Rakúsko")
Marec_2025 = c(154.9, 148.1, 153.1, 138.27)
April_2025 = c(154.7, 148.15, 153.6, 138.64)
Maj_2025 = c(155.5, 148.92, 153.4, 138.4)Tieto tri premenné nie sú zatiaľ nijako prepojené, predstavujú izolované stĺpce tabuľky. Do tabuľky ich spojíme nasledovne
udaje <- data.frame(Krajina, Marec_2025, April_2025, Maj_2025)
print(udaje) Krajina Marec_2025 April_2025 Maj_2025
1 Česko 154.90 154.70 155.50
2 Slovensko 148.10 148.15 148.92
3 Poľsko 153.10 153.60 153.40
4 Rakúsko 138.27 138.64 138.40
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$Marec_2025) # takto adresujeme jednotlivé premenné v data.frame[1] 154.90 148.10 153.10 138.27
print(mean(udaje$Marec_2025)) # priemerny vek[1] 148.5925
print(udaje[Krajina =="Česko",]) # adresovanie celého riadku Krajina Marec_2025 April_2025 Maj_2025
1 Česko 154.9 154.7 155.5
print(udaje[3,]) # ina moznost adresovania celeho riadku Krajina Marec_2025 April_2025 Maj_2025
3 Poľsko 153.1 153.6 153.4
print(udaje[,2:3]) # vypisanie druheho a tretieho stlpca tabulky Marec_2025 April_2025
1 154.90 154.70
2 148.10 148.15
3 153.10 153.60
4 138.27 138.64
print(udaje[1,1]) # vypisanie jednej bunky tabulky[1] "Česko"
summary(udaje) # zakladna deskriptivna statistika celej tabulky Krajina Marec_2025 April_2025 Maj_2025
Length :4 Min. :138.3 Min. :138.6 Min. :138.4
N.unique :4 1st Qu.:145.6 1st Qu.:145.8 1st Qu.:146.3
N.blank :0 Median :150.6 Median :150.9 Median :151.2
Min.nchar:5 Mean :148.6 Mean :148.8 Mean :149.1
Max.nchar:9 3rd Qu.:153.6 3rd Qu.:153.9 3rd Qu.:153.9
Max. :154.9 Max. :154.7 Max. :155.5
Ak chceme pridať k tabuľke dodatočný stĺpec, potom to robíme nasledovne
Jun_2025 <- c(155.8, 149.32, 153.5, 138.77)
udaje <- cbind(udaje,Jun_2025)
print(udaje) Krajina Marec_2025 April_2025 Maj_2025 Jun_2025
1 Česko 154.90 154.70 155.50 155.80
2 Slovensko 148.10 148.15 148.92 149.32
3 Poľsko 153.10 153.60 153.40 153.50
4 Rakúsko 138.27 138.64 138.40 138.77
Ak chceme pridať riadok, potom
# New record (must match column order/types)
novy.riadok <- data.frame(Krajina = "Maďarsko", Marec_2025 = 173.12, April_2025 = 173.2, Maj_2025 = 173.72, Jun_2025 = 174.03)
# Append
udaje <- rbind(udaje, novy.riadok)
print(udaje) Krajina Marec_2025 April_2025 Maj_2025 Jun_2025
1 Česko 154.90 154.70 155.50 155.80
2 Slovensko 148.10 148.15 148.92 149.32
3 Poľsko 153.10 153.60 153.40 153.50
4 Rakúsko 138.27 138.64 138.40 138.77
5 Maďarsko 173.12 173.20 173.72 174.03
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")| Krajina | Marec_2025 | April_2025 | Maj_2025 | Jun_2025 |
|---|---|---|---|---|
| Česko | 154.90 | 154.70 | 155.50 | 155.80 |
| Slovensko | 148.10 | 148.15 | 148.92 | 149.32 |
| Poľsko | 153.10 | 153.60 | 153.40 | 153.50 |
| Rakúsko | 138.27 | 138.64 | 138.40 | 138.77 |
| Maďarsko | 173.12 | 173.20 | 173.72 | 174.03 |
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.:
filter(): vyberá riadky
select(): vyberá stĺpce
mutate(): vytvára nové stĺpce tabuľky
arrange(): triedi riadky
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(Marec_2025 > 160) %>% # vybera zaznamy s poctom v Marec_2025 viac, ako 160
arrange(desc(Marec_2025)) %>% # vysledny subor triedi zostupne podla premennej Marec_2025
kable %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
)| Krajina | Marec_2025 | April_2025 | Maj_2025 | Jun_2025 |
|---|---|---|---|---|
| Maďarsko | 173.12 | 173.2 | 173.72 | 174.03 |
Zoskupenie a sumarizácia
# Zoskupí and sumarizuje
udaje %>%
group_by(Krajina) %>% # zoskupi zaznamy podla premennej Krajina a vypocita za kazdu skupinu jej priemer HICP
summarise( # a taktiez spocita pocetnosti oboch skupin
Priemer_HICP = mean(c(Marec_2025, April_2025, Maj_2025, Jun_2025)),
count = n()
) %>%
kable(
caption = "Priemerný HICP podľa krajiny",
col.names = c("Krajina", "Priemer HICP", "Počet"),
align = "c"
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
)| Krajina | Priemer HICP | Počet |
|---|---|---|
| Maďarsko | 173.5175 | 1 |
| Poľsko | 153.4000 | 1 |
| Rakúsko | 138.5200 | 1 |
| Slovensko | 148.6225 | 1 |
| Česko | 155.2250 | 1 |
Vytváranie novej premennej
# Vytváranie novej premennej
udaje %>%
mutate(
Zmena_HICP = round(Jun_2025 - Marec_2025, 2),
Trend = case_when(
Zmena_HICP > 0 ~ "Nárast",
Zmena_HICP < 0 ~ "Pokles",
TRUE ~ "Bez zmeny"
)
) %>%
kable(
caption = "Zmena HICP podľa krajiny",
col.names = c(
"Krajina",
"Marec 2025",
"Apríl 2025",
"Máj 2025",
"Jún 2025",
"Zmena HICP",
"Trend"
),
digits = 2
) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
)| Krajina | Marec 2025 | Apríl 2025 | Máj 2025 | Jún 2025 | Zmena HICP | Trend |
|---|---|---|---|---|---|---|
| Česko | 154.90 | 154.70 | 155.50 | 155.80 | 0.90 | Nárast |
| Slovensko | 148.10 | 148.15 | 148.92 | 149.32 | 1.22 | Nárast |
| Poľsko | 153.10 | 153.60 | 153.40 | 153.50 | 0.40 | Nárast |
| Rakúsko | 138.27 | 138.64 | 138.40 | 138.77 | 0.50 | Nárast |
| Maďarsko | 173.12 | 173.20 | 173.72 | 174.03 | 0.91 | Nárast |
Import údajov z .csv alebo .xls
Ja som si zvolila údaje z databázy Eurostatu Eurostat – databáza HICP, ktorá obsahuje údaje o harmonizovanom indexe spotrebiteľských cien (HICP) v jednotlivých krajinách. Z databázy som si stiahla súbor vo formáte xlsx s názvom prc_hicp_midx__custom_23398413_spreadsheet a dáta som následne očistila. Údaje sa týkajú mesačného vývoja HICP v roku 2025, konkrétne od marca do decembra, a umožňujú porovnávať vývoj cenovej hladiny medzi vybranými krajinami Európskej únie. V prvom riadku sú uvedené názvy stĺpcov, ktoré budú v ďalšom spracovaní vystupovať ako premenné.


Potom už stačí importovať údaje do .data.frame., a to nasledovne
udaje <- read.csv2(
"HICP_monthly_data_2025.csv",
header = TRUE,
check.names = FALSE
)
head(udaje) Country 2025-03 2025-04 2025-05 2025-06 2025-07 2025-08 2025-09 2025-10
1 Belgium 135.71 134.79 134.67 135.32 134.17 136.19 135.76 136.26
2 Bulgaria 142.53 140.76 140.84 141.44 143.49 143.68 142.81 143.42
3 Czechia 154.90 154.70 155.50 155.80 156.50 156.50 155.30 156.10
4 Denmark 120.40 120.50 120.50 120.90 122.90 122.00 121.80 122.50
5 Germany 131.00 131.60 131.80 131.90 132.40 132.50 132.80 133.20
6 Estonia 159.76 161.61 161.85 163.64 164.55 166.05 164.19 164.34
2025-11 2025-12
1 136.61 137.04
2 143.64 143.83
3 155.50 155.00
4 121.90 121.40
5 132.60 132.80
6 163.55 162.91
Grafy
ggplot2 - knižnica pre grafy
Výber a následné triedenie
udaje.2025 <- read.csv2(
"HICP_monthly_data_2025.csv",
header = TRUE,
check.names = FALSE
)
head(udaje.2025) Country 2025-03 2025-04 2025-05 2025-06 2025-07 2025-08 2025-09 2025-10
1 Belgium 135.71 134.79 134.67 135.32 134.17 136.19 135.76 136.26
2 Bulgaria 142.53 140.76 140.84 141.44 143.49 143.68 142.81 143.42
3 Czechia 154.90 154.70 155.50 155.80 156.50 156.50 155.30 156.10
4 Denmark 120.40 120.50 120.50 120.90 122.90 122.00 121.80 122.50
5 Germany 131.00 131.60 131.80 131.90 132.40 132.50 132.80 133.20
6 Estonia 159.76 161.61 161.85 163.64 164.55 166.05 164.19 164.34
2025-11 2025-12
1 136.61 137.04
2 143.64 143.83
3 155.50 155.00
4 121.90 121.40
5 132.60 132.80
6 163.55 162.91
colnames(udaje.2025) [1] "Country" "2025-03" "2025-04" "2025-05" "2025-06" "2025-07" "2025-08"
[8] "2025-09" "2025-10" "2025-11" "2025-12"
Knižnica .ggplot2. je v súčasnosti najčastejšie používaná grafická knižnica, pričom predpripravené kódy k jednotlivým obrázkom si viete nájsť v R Graph Gallery. Tu si uvedieme jednoduchšie z nich.
Scatter plot
# Basic scatter plot
# Basic scatter plot
library(ggplot2)
ggplot(udaje, aes(x = `2025-03`, y = `2025-12`)) +
geom_point() +
theme_minimal() +
labs(title = "HICP index", x = "Marec 2025", y = "December 2025")Boxplot
# Boxplot HICP podľa mesiacov
library(ggplot2)
ggplot(
tidyr::pivot_longer(
udaje,
cols = `2025-03`:`2025-12`,
names_to = "Mesiac",
values_to = "HICP"
),
aes(x = Mesiac, y = HICP)
) +
geom_boxplot(fill = "lightblue", color = "darkblue") +
labs(
title = "HICP podľa mesiacov v roku 2025",
x = "Mesiac",
y = "HICP"
) +
theme_minimal()Základné štatistiky.
knitr - tabuľka
library(dplyr)
library(knitr)
# Základné štatistiky HICP podľa mesiacov
hicp.stats <- udaje %>%
summarise(
n = n(),
mean = mean(c(`2025-03`, `2025-04`, `2025-05`,
`2025-06`, `2025-07`, `2025-08`,
`2025-09`, `2025-10`, `2025-11`,
`2025-12`), na.rm = TRUE),
sd = sd(c(`2025-03`, `2025-04`, `2025-05`,
`2025-06`, `2025-07`, `2025-08`,
`2025-09`, `2025-10`, `2025-11`,
`2025-12`), na.rm = TRUE),
min = min(c(`2025-03`, `2025-04`, `2025-05`,
`2025-06`, `2025-07`, `2025-08`,
`2025-09`, `2025-10`, `2025-11`,
`2025-12`), na.rm = TRUE),
median = median(c(`2025-03`, `2025-04`, `2025-05`,
`2025-06`, `2025-07`, `2025-08`,
`2025-09`, `2025-10`, `2025-11`,
`2025-12`), na.rm = TRUE),
max = max(c(`2025-03`, `2025-04`, `2025-05`,
`2025-06`, `2025-07`, `2025-08`,
`2025-09`, `2025-10`, `2025-11`,
`2025-12`), na.rm = TRUE)
)
# Create knitr table
kable(hicp.stats, digits = 2, caption = "Základné štatistiky HICP za marec až december 2025")| n | mean | sd | min | median | max |
|---|---|---|---|---|---|
| 27 | 137.75 | 15.04 | 116.86 | 132.96 | 174.87 |
alebo krajšie tabuľky s pomocou .kableExtra.:
library(dplyr) library(knitr) library(kableExtra)
Základné štatistiky HICP podľa mesiacov
hicp.stats <- udaje %>% summarise( n = n(), mean = mean(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), na.rm = TRUE), sd = sd(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), na.rm = TRUE), min = min(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), na.rm = TRUE), q25 = quantile(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), 0.25, na.rm = TRUE), median = median(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), na.rm = TRUE), q75 = quantile(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), 0.75, na.rm = TRUE), max = max(c(2025-03, 2025-04, 2025-05, 2025-06, 2025-07, 2025-08, 2025-09, 2025-10, 2025-11, 2025-12), na.rm = TRUE) )
Formátovaná tabuľka
hicp.stats %>% kable( digits = 2, caption = “Základné štatistiky HICP za marec až december 2025” ) %>% kable_styling( full_width = FALSE, bootstrap_options = c(“striped”, “hover”, “condensed”) ) %>% column_spec(1, bold = TRUE) %>% row_spec(0, bold = TRUE, background = “#f2f2f2”) %>% add_header_above(c(” ” = 1, “HICP – základné štatistiky” = 7))
#### t-test: Porovnanie priemeru HICP v marci a decembri 2025
::: {.cell}
```{.r .cell-code}
t.test(
udaje$`2025-03`,
udaje$`2025-12`,
paired = TRUE
)
Paired t-test
data: udaje$`2025-03` and udaje$`2025-12`
t = -5.9132, df = 26, p-value = 3.08e-06
alternative hypothesis: true mean difference is not equal to 0
95 percent confidence interval:
-2.810527 -1.360585
sample estimates:
mean difference
-2.085556
:::
ANOVA: Comparing Reading Scores Across Programs
anova.result <- aov(
hodnoty ~ Mesiac,
data = tidyr::pivot_longer(
udaje,
cols = -Country,
names_to = "Mesiac",
values_to = "hodnoty"
)
)
summary(anova.result) Df Sum Sq Mean Sq F value Pr(>F)
Mesiac 9 159 17.67 0.076 1
Residuals 260 60709 233.50
Lineárna regresia: Vysvetlenie HICP v decembri 2025
model <- lm(`2025-12` ~ `2025-03` + `2025-06`, data = udaje)
summary(model)
Call:
lm(formula = `2025-12` ~ `2025-03` + `2025-06`, data = udaje)
Residuals:
Min 1Q Median 3Q Max
-2.5337 -0.8241 -0.2245 0.2915 7.2157
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) -3.4492 3.2567 -1.059 0.3001
`2025-03` 0.7614 0.2170 3.509 0.0018 **
`2025-06` 0.2763 0.2192 1.260 0.2196
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 1.776 on 24 degrees of freedom
Multiple R-squared: 0.9882, Adjusted R-squared: 0.9872
F-statistic: 1004 on 2 and 24 DF, p-value: < 2.2e-16
# install.packages(c("broom", "kableExtra", "dplyr", "stringr"))
library(broom)
library(dplyr)
library(kableExtra)
library(stringr)
coef.tbl <- tidy(model, conf.int = TRUE) %>%
mutate(
term = dplyr::recode(term,
"(Intercept)" = "Konštanta",
"2025-03" = "Marec 2025",
"2025-06" = "Jún 2025"
),
stars = case_when(
p.value < 0.001 ~ "***",
p.value < 0.01 ~ "**",
p.value < 0.05 ~ "*",
p.value < 0.1 ~ "·",
TRUE ~ ""
)
) %>%
transmute(
Premenná = term,
Odhad = estimate,
`Štandardná chyba` = std.error,
`t-hodnota` = statistic,
`p-hodnota` = p.value,
`95% interval spoľahlivosti` =
str_c("[", round(conf.low, 3), ", ", round(conf.high, 3), "]"),
Významnosť = stars
)
coef.tbl %>%
kable(
digits = 3,
caption = "Regresné koeficienty modelu HICP (december 2025 ~ marec 2025 + jún 2025)"
) %>%
kable_styling(
full_width = FALSE,
bootstrap_options = c("striped", "hover", "condensed")
) %>%
column_spec(1, bold = TRUE) %>%
row_spec(0, bold = TRUE, background = "#f2f2f2") %>%
footnote(
general = "Významnosť: *** p < 0,001; ** p < 0,01; * p < 0,05; · p < 0,1.",
threeparttable = TRUE
)| Premenná | Odhad | Štandardná chyba | t-hodnota | p-hodnota | 95% interval spoľahlivosti | Významnosť |
|---|---|---|---|---|---|---|
| Konštanta | -3.449 | 3.257 | -1.059 | 0.300 | [-10.171, 3.272] | |
| `2025-03` | 0.761 | 0.217 | 3.509 | 0.002 | [0.314, 1.209] | ** |
| `2025-06` | 0.276 | 0.219 | 1.260 | 0.220 | [-0.176, 0.729] | |
| Note: | ||||||
| Významnosť: *** p < 0,001; ** p < 0,01; * p < 0,05; · p < 0,1. |
fit.tbl <- glance(model) %>%
transmute(
`R-kvadrát` = r.squared,
`Upravený R-kvadrát` = adj.r.squared,
`F-štatistika` = statistic,
`p-hodnota F-testu` = p.value,
AIC = AIC,
BIC = BIC,
`Počet pozorovaní` = nobs
)
fit.tbl %>%
kable(
digits = 3,
caption = "Štatistiky regresného modelu HICP"
) %>%
kable_styling(
full_width = FALSE,
bootstrap_options = c("condensed")
)| R-kvadrát | Upravený R-kvadrát | F-štatistika | p-hodnota F-testu | AIC | BIC | Počet pozorovaní |
|---|---|---|---|---|---|---|
| 0.988 | 0.987 | 1003.821 | 0 | 112.465 | 117.648 | 27 |
Info zdroje pre ďalšie štúdium
R Project
- R Project Homepage - Base R downloads, news, and learning resources
Posit
- R Studio Desktop - Feature rich environment for working with data in R
- R for Data Science - Comprehensive online book
- RStudio Cheatsheets - Quick reference guides
Community Resources
- R-bloggers - Blog aggregator for R news and tutorials
- Stack Overflow - R tag - Q&A community
- rdrr.io Snippets - Test R code snippets online
- Coursera - R Programming - Online course
- DataCamp - Introduction to R - Interactive learning platform