Globálne nastavenie Chunkov

V nižšie uvedenom Chunku je urobené základné globálne nastavenie Chunkov v celom Notebooku.

knitr::opts_chunk$set(
  echo = TRUE,
  message = FALSE,
  warning = FALSE
)

Úvod k základným operáciám v R

Tento notebook demonštruje základné operácie v jazyku R so:

Tam, kde je to užitočné, sú zahrnuté malé cvičenia.


Skaláre (jednočíselné hodnoty)

Numerické skaláre

# Priradenie konštanty do premennej
a <- 24
b <- 15

# Arithmetic
sum_ab      <- a + b        # sucet
diff_ab     <- a - b        # rozdiel
prod_ab     <- a * b        # násobenie
quot_ab     <- a / b        # delenie
power_ab    <- a ^ b        # umocňovanie
sqrt_a      <- sqrt(a)      # odmocňovanie
mod_ab      <- a %% 5       # zbytok po delení piatimi (tzv modulo)


# Rounding
round_b   <- round(b)       # zaokruhlovanie smerom k najblizsiemu celemu cislu
ceil_b    <- ceiling(b)     # najblizsie vyssie cele cislo
floor_b   <- floor(b)       # najblizsie nizsie cele cislo

a; b
## [1] 24
## [1] 15
sum_ab; diff_ab; prod_ab; quot_ab; power_ab; mod_ab;
## [1] 39
## [1] 9
## [1] 360
## [1] 1.6
## [1] 5.048573e+20
## [1] 4
round_b; ceil_b; floor_b
## [1] 15
## [1] 15
## [1] 15

Poznámky

  • ^ operátor umocňovania.
  • %% je modulo, teda zbytok po delení,
  • round(x, digits = 0) zaokrúhľovanie na určitý počet desatinných miest (digits=). ak digits = 0, potom ide o celočíselné zaokrúhľovanie

Malé cvičenie

Vypočítajte:

\[\frac{(30^2-97)}{3}+257+9-4*2\]

(30^2 - 97) / 3+257+9-4*2
## [1] 525.6667

Text

Vytváranie textovými premennými a práca s nimi

first <- "Terézia"                       # definovanie obsahu textovej premennej first
last  <- "Bartáková"                          # definovanie obsahu text. premennej last
full  <- paste(first, last)               # spojenie dvoch text. premennych do jednej (s medzerou)
full_nospace <- paste0(first, last)       # spojenie bez medzery
csv_line <- paste("saty", "sukne", "tricka", sep = ",")  # spojenie textov s oddelovacom ,
first; last; full; full_nospace; csv_line   # bodkočiarka tu nahradzuje odskok na novy riadok 
## [1] "Terézia"
## [1] "Bartáková"
## [1] "Terézia Bartáková"
## [1] "TeréziaBartáková"
## [1] "saty,sukne,tricka"
# Veľké/malé písmená
full_upper <- toupper(full)            # všetko veľkými písmenami
full_lower <- tolower(full)            # všetko malými písmenami

# Dĺžka textu
length_full <- nchar(full)             # počet znakov v texte

# Extrahovanie časti textu
first_name <- substr(full, 1, nchar(first))   # vyberie prvé meno

Dĺžka textového reťazca, podreťazec

x <- "Summer Sale!"
nchar(x)                 # počet znakov  v retazci "Summer Sale!"
## [1] 12
substr(x, 2, 4)          # podreťazec od 2. do 4. znaku
## [1] "umm"
substr(x, 8, 11)        # podreťazec od 8. do 11. znaku
## [1] "Sale"

Tip: Knižnica stringr mnohé zaujímavé možnosti práce s textami, ale implicitné knižnice R pokrývajú väčšinu bežných potrieb páce s textami.


Logické (boolovské) hodnoty a premenné

Základy

x <- FALSE
y <- TRUE
!y                 # NOT
## [1] FALSE
x & y              # AND
## [1] FALSE
x | y              # OR
## [1] TRUE
xor(x, y)          # exclusive OR - platí len jedno z x,alebo y
## [1] TRUE

Logický výsledok porovnávania

278 < 400
## [1] TRUE
400 >= 400
## [1] TRUE
"saty" == "sukne"
## [1] FALSE
"saty" != "sukne"   # vykricnik je tu v zmysle negacie. Napr.:   !=, !>, !<, !TRUE
## [1] TRUE
!TRUE
## [1] FALSE

Zložitejšie logické operácie

t <- 250
t > 25 & t < 400     # a sucasne - logicky prienik (sucin)
## [1] TRUE
t < 84 | t > 10     # alebo - logicke zjednotenie (sucet)
## [1] TRUE
                    # pri zlozitejsich vztahoch pouzivajte zatvorky ()

t%%25==0            # je t deliteľné 25 bezo zvyšku? 
## [1] TRUE

Môj návrh - zistenie plnoletosti

# Veky viacerých ľudí
veky <- c(15, 17, 18, 20, 12, 25)

# Skontrolujeme plnoletosť (TRUE/FALSE)
plnoletosť <- veky >= 18

# Vytvoríme textový popis na základe plnoletosti
popis <- ifelse(plnoletosť, 
                "Zákazník je plnoletý", 
                "Zákazník nie je plnoletý")

# Vytvoríme tabuľku
info <- data.frame(
  Vek = veky,
  Plnoletý = plnoletosť,
  Popis = popis
)

# Zobrazíme tabuľku
print(info)
##   Vek Plnoletý                    Popis
## 1  15    FALSE Zákazník nie je plnoletý
## 2  17    FALSE Zákazník nie je plnoletý
## 3  18     TRUE     Zákazník je plnoletý
## 4  20     TRUE     Zákazník je plnoletý
## 5  12    FALSE Zákazník nie je plnoletý
## 6  25     TRUE     Zákazník je plnoletý

Zlučovanie viacerých log. premenných do vektora

vals <- c(TRUE, FALSE, TRUE, TRUE)   # definicia vektora s logickymi hodnotami

Numerické vektory

Generovanie vektorov

v1 <- c(2, 9, 5, 7)
v2 <- 5:15                 # postupnost 
v3 <- seq(from = 0, to = 10, by = 0.5)  # postupnost s krokom 0.5
v4 <- rep(3, times = 6)    # 3,3,3,3,3  # 6 clenna postupnost trojak
v5 <- runif(5)             # generovanie rovnomerne rozdelenych premennych v intervale [0,1]
v6 <- rnorm(5)             # generovanie normalne rozdelenych premennych
v1; v2; v3; v4; v5
## [1] 2 9 5 7
##  [1]  5  6  7  8  9 10 11 12 13 14 15
##  [1]  0.0  0.5  1.0  1.5  2.0  2.5  3.0  3.5  4.0  4.5  5.0  5.5  6.0  6.5  7.0
## [16]  7.5  8.0  8.5  9.0  9.5 10.0
## [1] 3 3 3 3 3 3
## [1] 0.1424264 0.5494742 0.3212475 0.6502548 0.2488658

Aritmetické operácie s vektormi

v <- c(5, 10, 15, 20)
v + 5            # kazdy prvok vektora zvacsime o 5
## [1] 10 15 20 25
v * 4            # kazdy prvok vektora prenasobime 4
## [1] 20 40 60 80
(v + 10) / 2
## [1]  7.5 10.0 12.5 15.0
exp(v)           # exponencialna funkcia z kazdeho prvku vektora
## [1] 1.484132e+02 2.202647e+04 3.269017e+06 4.851652e+08
sum(c(2,3,4),c(5,6,7))          # skalarny sucin - vysledok je skalar
## [1] 27
crossprod(c(1,2,3),c(3,2,1))    # skalarny sucin - vysledok je matica 1x1
##      [,1]
## [1,]   10
c(1,2,3)*c(1,2,3)               # Hadamardov sucin (sucin zodpovedajucich prvkov vektora)
## [1] 1 4 9

Matematické operácie s 2 vektormi rovnakého rozmeru

length(c(1,3,5,7,9))
## [1] 5
length(v5)            #vektor v5 je definovany vyssie
## [1] 5
c(1,2,3,4,5) + v5     # pozor, oba vektory musia mat rovnaky rozmer
## [1] 1.142426 2.549474 3.321248 4.650255 5.248866

Indexovanie a výber niektorych prvkov vektora

x <- c(24, 48, 72, 12, 65, 34)
x[1]           # indexovanie - novy jedno-prvkovy vektor - prvy prvok vektora x
## [1] 24
x[2:4]         # novy vektor s druhym az stvrtym prvkom vektora x
## [1] 48 72 12
x[-1]          # novy vektor - vsetky prvky vektora x okrem prvého
## [1] 48 72 12 65 34
x[x > 10]      # novy vektor definovany prvkami x vacsimi ako 10
## [1] 24 48 72 12 65 34
which(x > 35)  # ktore prvky zodpovedaju podmienke vacsieho ako 35?
## [1] 2 3 5

Práca s chýbajúcimi hodnotami

y <- c(10, NA, 30, NA, 50)
is.na(y)
## [1] FALSE  TRUE FALSE  TRUE FALSE
mean(y)                 # NA
## [1] NA
mean(y, na.rm = TRUE)   # remove NAs
## [1] 30

Základné štatistiky a usporiadanie prvkov vektora podľa veľkosti

z <- c(82, 12, 10, 48, 55)
mean(z)                 # priemerna hodnota
## [1] 41.4
sd(z)                  # standardna odchylka
## [1] 30.5254
max(z)                  # maximalna hodnota
## [1] 82
summary(z)              # rychly prehlad zakladnych statistik o vektore
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    10.0    12.0    48.0    41.4    55.0    82.0
sort(z)                 # rastuce usporiadanie 
## [1] 10 12 48 55 82
sort(z, decreasing = TRUE)  # klesajuce
## [1] 82 55 48 12 10

Malé cvičenie

Vytvorte vektor w s číslami 1..35 a vypočítajte sumu všetkých párnych čísel.

w <- 1:35
sum(w[w %% 2 == 0])
## [1] 306

Matice

Vytvorenie matíc

m <- matrix(1:12, nrow = 3, ncol = 4)         
m_byrow <- matrix(1:12, nrow = 3, byrow = TRUE)
m; m_byrow
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12
##      [,1] [,2] [,3] [,4]
## [1,]    1    2    3    4
## [2,]    5    6    7    8
## [3,]    9   10   11   12

Rozmery matice

dim(m)                   # (rows, cols)
## [1] 3 4
m
##      [,1] [,2] [,3] [,4]
## [1,]    1    4    7   10
## [2,]    2    5    8   11
## [3,]    3    6    9   12

Adresovanie prvkov matice

{r m[2, 2] # riadok 2, stĺpec 2 m[ , 2] # vsetky prvky v druhom stlpci - vysledok matica 3x1 m[2, ] # vsetky prvky v druhom riadku - vysledok matica 1*3 m[1:2, 2:3] # podmatica tvorena riadkami 1, 2 a stlpcami 2, 3

Maticové operácie

A <- matrix(c(1,2,3,4), nrow = 2)
B <- matrix(c(5,6,7,8), nrow = 2)

A + B        # scitanie matic
##      [,1] [,2]
## [1,]    6   10
## [2,]    8   12
A * B        # Hadamard product - nasobenie po zodpovedajucich prvkoch
##      [,1] [,2]
## [1,]    5   21
## [2,]   12   32
A %*% B      # nasobenie matic
##      [,1] [,2]
## [1,]   23   31
## [2,]   34   46
t(A)         # transpozicia matice A - vymena riadkov a stlpcov
##      [,1] [,2]
## [1,]    1    2
## [2,]    3    4
det(A)       # determinant matice
## [1] -2
solve(A)     # inverzia matice (ak je matica regularna - teda inverzia sa da spocitat)
##      [,1] [,2]
## [1,]   -2  1.5
## [2,]    1 -0.5

Zlučovanie vektorov do matíc

C <- cbind(1:3, 4:6)   #  - po stlpcoch 
D <- rbind(1:3, 4:6)   #  - po riadkoch 
C; D
##      [,1] [,2]
## [1,]    1    4
## [2,]    2    5
## [3,]    3    6
##      [,1] [,2] [,3]
## [1,]    1    2    3
## [2,]    4    5    6

Vypočítanie zvolenej štatistiky po riadkoch (stĺpcoch) matice

M <- matrix(1:9, nrow = 3)
M
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
apply(M, 1, sum)   # suma po riadkoch
## [1] 12 15 18
apply(M, 2, mean)  # priemery po stĺpcoch
## [1] 2 5 8

Malé cvičenie

Vytvorte maticu 5x5 s hodnotami po riadkoch 1..15, vypočítajte stĺpcové sumy a súčin matíc \(M^t M\).

M2 <- matrix(1:15,  nrow = 5, byrow = TRUE)
colSums(M2)
## [1] 35 40 45
t(M2) %*% M2
##      [,1] [,2] [,3]
## [1,]  335  370  405
## [2,]  370  410  450
## [3,]  405  450  495

Malé cvičenie

Týždenný predaj ovocia

#  Vektor dní
dni <- c("Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok")

# Predajné vektory
jablka <- c(12, 15, 11, 20, 18)
hrusky <- c(5, 7, 6, 8, 7)
banany <- c(20, 25, 22, 30, 28)

# Vytvorenie matice
predaj_mat <- cbind(jablka, hrusky, banany)
rownames(predaj_mat) <- dni
colnames(predaj_mat) <- c("Jablka", "Hrusky", "Banany")

predaj_mat
##          Jablka Hrusky Banany
## Pondelok     12      5     20
## Utorok       15      7     25
## Streda       11      6     22
## Štvrtok      20      8     30
## Piatok       18      7     28
# Farebný stĺpcový graf
bar_colors <- ifelse(jablka > 15, "red", "skyblue")

barplot(
  t(predaj_mat),  # transponujeme, aby stĺpce = dni
  beside = TRUE,   # stĺpce vedľa seba
  col = c("lightgreen", "orange", "yellow"),  # farby pre ovocie
  names.arg = dni,
  legend.text = colnames(predaj_mat),
  args.legend = list(x = "topright"),
  main = "Predaj ovocia počas týždňa",
  ylab = "Počet kusov"
)