Majme údaje o žiakoch, ktoré predstavujú tri premenné - Meno, Vek a Body:
# Working with data frames
Meno = c("Alexandra", "Veronika", "Beatrix")
Vek = c(18, 10, 12)
Body = c(48, 81, 98)
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] 18 10 12
[1] 13.33333
[1] "Alexandra"
Meno Vek Body
Length:3 Min. :10.00 Min. :48.00
Class :character 1st Qu.:11.00 1st Qu.:64.50
Mode :character Median :12.00 Median :81.00
Mean :13.33 Mean :75.67
3rd Qu.:15.00 3rd Qu.:89.50
Max. :18.00 Max. :98.00
Ak chceme pridať k tabuľke dodatočný stĺpec, potom to robíme nasledovne
Ak chceme pridať riadok, potom
# New record (must match column order/types)
novy.riadok <- data.frame(Meno = "Amélia", Vek = 24, Body = 50, MaAuto = TRUE)
# Append
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 = "Výsledky študentov v teste"
# 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 |
---|---|---|---|
Alexandra | 18 | 48 | TRUE |
Veronika | 10 | 81 | FALSE |
Beatrix | 12 | 98 | FALSE |
Amélia | 24 | 50 | TRUE |
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.
# výber a následné triedenie
udaje %>%
filter(Body > 70) %>%
arrange(desc(Body)) %>%
kable %>%
kable_styling(
bootstrap_options = c("striped", "hover", "condensed", "responsive"),
full_width = FALSE,
position = "center"
)
Meno | Vek | Body | MaAuto |
---|---|---|---|
Beatrix | 12 | 98 | FALSE |
Veronika | 10 | 81 | FALSE |
# Zoskupí and sumarizuje
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 | 89.5 | 2 |
TRUE | 49.0 | 2 |
# Vytváranie novej premennej
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 |
---|---|---|---|---|---|
Alexandra | 18 | 48 | TRUE | D | 0 |
Veronika | 10 | 81 | FALSE | B | -8 |
Beatrix | 12 | 98 | FALSE | A | -6 |
Amélia | 24 | 50 | TRUE | D | 6 |
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"))