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.
Majme údaje o žiakoch, ktoré predstavujú tri premenné - Meno, Vek a Body:
# Working with data frames
Meno = c("Beatrix", "Monika", "Veronika")
Vek = c(23, 22, 23)
Body = c(90, 92, 95)
Tieto tri premenné nie sú zatiaľ nijako prepojené, predstavujú izolované stĺpce tabuľky. Do tabuľky ich spojíme nasledovne
Vysvetlenie: DataFrame má tri stĺpce: Meno, Vek a Body. Niektoré operácie s údajmi organizovanými v .data.frame. sú uvedené nasledovne
[1] 23 22 23
[1] 22.66667
[1] 22
Meno Vek Body
Length:3 Min. :22.00 Min. :90.00
Class :character 1st Qu.:22.50 1st Qu.:91.00
Mode :character Median :23.00 Median :92.00
Mean :22.67 Mean :92.33
3rd Qu.:23.00 3rd Qu.:93.50
Max. :23.00 Max. :95.00
Ak chceme pridať k tabuľke dodatočný stĺpec, potom to robíme nasledovne
Ak chceme pridať riadok, potom
novy.riadok <- data.frame(Meno = "Martina", Vek = 25, Body = 85,MaAuto = FALSE)
udaje <- rbind(udaje, novy.riadok)
print(udaje)
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")
Meno | Vek | Body | MaAuto |
---|---|---|---|
Beatrix | 23 | 90 | TRUE |
Monika | 22 | 92 | FALSE |
Veronika | 23 | 95 | TRUE |
Martina | 25 | 85 | FALSE |
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ú.
.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.
udaje %>%
filter(Body > 80) %>%
arrange(desc(Body)) %>%
kable %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
)
Meno | Vek | Body | MaAuto |
---|---|---|---|
Veronika | 23 | 95 | TRUE |
Monika | 22 | 92 | FALSE |
Beatrix | 23 | 90 | TRUE |
Martina | 25 | 85 | FALSE |
udaje %>%
group_by(MaAuto) %>%
summarise(
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"
)
Má Auto | Priemer Body | Počet |
---|---|---|
FALSE | 88.5 | 2 |
TRUE | 92.5 | 2 |
udaje %>%
mutate(
grade = case_when(
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"
)
Meno | Vek | Body | MaAuto | grade | VekPoPlnoletosti |
---|---|---|---|---|---|
Beatrix | 23 | 90 | TRUE | A | 5 |
Monika | 22 | 92 | FALSE | A | 4 |
Veronika | 23 | 95 | TRUE | A | 5 |
Martina | 25 | 85 | FALSE | B | 7 |
library(datasets)
# datasets available in the 'datasets' package - nasledovne kody za mna urobil Chat GPT
ds <- as.data.frame(utils::data(package = "datasets")$results)[, c("Item","Title")]
knitr::kable(head(ds, 20), col.names = c("Dataset", "Title")) # prvych 20 databaz
# kniznica datasets obsahuje databazu nazvanu CO2. Mozeme sa na nu odvolavat nasledovne, ako napr.
head(CO2)
Môžeme použiť aj databázu určenú pre ekobometriu - package Wooldridge
# install.packages("wooldridge")
library(wooldridge)
ds <- as.data.frame(utils::data(package = "wooldridge")$results)[, c("Item","Title")]
knitr::kable(head(ds, 20), col.names = c("Dataset", "Title")) %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
)
Ja som si zvolil údaje z [Abosede Tiamiyu: Environmental, Social, and Governance Reporting Evidencing Firm Performance in Emerging Economy]{https://data.mendeley.com/datasets/7k8pjhsrwb/1}. Na stránke sa nachádza súbor .Dataset ESG and Firm Performance.xlsx., ktorý som si stiahol a exportoval do formátu csv. Ako oddeľovač položiek som si zvolil bodkočiarku (semicolon ;), vyžívam desatinnú bodku a nie čiarku a tiež textové premenné uvádzam apostrofmi “. V prvom riadku sa nachádzajú názvy stĺpcov, ktoré neskôr budú vystupovať ako premenné. Tie obsahujú medzery, čo je v zázve premennej neprípustné a nahradil som ich podtrhovátkom”.”.
Potom už stačí importovať údaje do .data.frame., a to nasledovne
Výber a následné triedenie
library(dplyr)
udaje.2013 <- udaje %>%
filter(YEARS == 2013) %>%
select(RETURN.ON.ASSETS, ESG.INDEX, DEBT.TO.ASSET, FIRM.SIZE)
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.
# Bar plot with grouping
library(ggplot2)
library(ggplot2)
ggplot(udaje, aes(x = factor(YEARS), y = ESG.INDEX)) + # specifikacia osi
geom_boxplot(fill = "lightblue", color = "darkblue") + # typ grafu - boxplot
labs( # oznacenie osi, nazov grafu
title = "ESG Index by Years",
x = "Year",
y = "ESG Index"
) +
theme_minimal()
library(dplyr)
library(knitr)
# Summarise basic statistics
esg.stats <- udaje %>%
filter(YEARS %in% 2013:2016) %>%
group_by(YEARS) %>%
summarise(
n = n(),
mean = mean(ESG.INDEX, na.rm = TRUE),
sd = sd(ESG.INDEX, na.rm = TRUE),
min = min(ESG.INDEX, na.rm = TRUE),
q25 = quantile(ESG.INDEX, 0.25, na.rm = TRUE),
median= median(ESG.INDEX, na.rm = TRUE),
q75 = quantile(ESG.INDEX, 0.75, na.rm = TRUE),
max = max(ESG.INDEX, na.rm = TRUE),
.groups = "drop"
)
# Create knitr table
kable(esg.stats, digits = 2, caption = "Basic statistics of ESG Index (2013–2016)")
alebo krajšie tabuľky s pomocou .kableExtra.:
library(dplyr)
library(knitr)
library(kableExtra)
# Summarise basic statistics
esg.stats <- udaje %>%
filter(YEARS %in% 2013:2016) %>%
group_by(YEARS) %>%
summarise(
n = n(),
mean = mean(ESG.INDEX, na.rm = TRUE),
sd = sd(ESG.INDEX, na.rm = TRUE),
min = min(ESG.INDEX, na.rm = TRUE),
q25 = quantile(ESG.INDEX, 0.25, na.rm = TRUE),
median = median(ESG.INDEX, na.rm = TRUE),
q75 = quantile(ESG.INDEX, 0.75, na.rm = TRUE),
max = max(ESG.INDEX, na.rm = TRUE),
.groups = "drop"
)
# Create styled kableExtra table
esg.stats %>%
kable(digits = 2, caption = "Basic statistics of ESG Index (2013–2016)") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("striped", "hover", "condensed")) %>%
column_spec(1, bold = TRUE) %>% # make years bold
row_spec(0, bold = TRUE, background = "#f2f2f2") %>% # style header row
add_header_above(c(" " = 2, "ESG Index Statistics" = 7))
model <- lm(ESG.INDEX ~ RETURN.ON.ASSETS + FIRM.SIZE + DEBT.TO.ASSET, data = udaje.2013)
summary(model)
# install.packages(c("broom", "kableExtra", "dplyr", "stringr"))
library(broom)
library(dplyr)
library(kableExtra)
library(stringr)
# Your model (already fitted)
# model <- lm(ESG.INDEX ~ RETURN.ON.ASSETS + FIRM.SIZE + DEBT.TO.ASSET, data = udaje.2013)
coef.tbl <- tidy(model, conf.int = TRUE) %>%
mutate(
term = recode(term,
"(Intercept)" = "Intercept",
"RETURN.ON.ASSETS" = "Return on Assets",
"FIRM.SIZE" = "Firm Size",
"DEBT.TO.ASSET" = "Debt to Asset"
),
stars = case_when(
p.value < 0.001 ~ "***",
p.value < 0.01 ~ "**",
p.value < 0.05 ~ "*",
p.value < 0.1 ~ "·",
TRUE ~ ""
)
) %>%
transmute(
Term = term,
Estimate = estimate,
`Std. Error` = std.error,
`t value` = statistic,
`p value` = p.value,
`95% CI` = str_c("[", round(conf.low, 3), ", ", round(conf.high, 3), "]"),
Sig = stars
)
coef.tbl %>%
kable(
digits = 3,
caption = "OLS Regression Coefficients (ESG.INDEX ~ RETURN.ON.ASSETS + FIRM.SIZE + DEBT.TO.ASSET)"
) %>%
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 = "Signif. codes: *** p<0.001, ** p<0.01, * p<0.05, · p<0.1.",
threeparttable = TRUE
)
fit.tbl <- glance(model) %>%
transmute(
`R-squared` = r.squared,
`Adj. R-squared` = adj.r.squared,
`F-statistic` = statistic,
`F p-value` = p.value,
`AIC` = AIC,
`BIC` = BIC,
`Num. obs.` = nobs
)
fit.tbl %>%
kable(digits = 3, caption = "Model Fit Statistics") %>%
kable_styling(full_width = FALSE, bootstrap_options = c("condensed"))