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
)
Tento notebook demonštruje základné operácie v jazyku R so:
Tam, kde je to užitočné, sú zahrnuté malé cvičenia.
# 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ľovanieVypočítajte:
\[\frac{(30^2-97)}{3}+257+9-4*2\]
(30^2 - 97) / 3+257+9-4*2
## [1] 525.6667
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
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.
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
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
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
# 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ý
vals <- c(TRUE, FALSE, TRUE, TRUE) # definicia vektora s logickymi hodnotami
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
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
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
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
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 <- 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
Vytvorte vektor
ws číslami 1..35 a vypočítajte sumu všetkých párnych čísel.
w <- 1:35
sum(w[w %% 2 == 0])
## [1] 306
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
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
{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
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
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
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
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
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"
)