Základné operácie v R – vlastné cvičenia

Author

Livia

Published

January 1, 2026

Globálne nastavenie chunkov

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

Úvod

Tento dokument ukazuje základné operácie v R so skalármi, textom, logickými hodnotami, vektormi, maticami a vlastnými číslami. Každá časť končí vlastným cvičením.


Skaláre

Code
a <- 12
b <- 4.5

a + b          # súčet
[1] 16.5
Code
a - b          # rozdiel
[1] 7.5
Code
a * b          # súčin
[1] 54
Code
a / b          # podiel
[1] 2.666667
Code
a ^ 2          # druhá mocnina
[1] 144
Code
a %% 5         # zvyšok po delení piatimi
[1] 2
Code
a %/% b        # celočíselné delenie
[1] 2
Code
round(b)       # zaokrúhlenie
[1] 4
Code
ceiling(b)     # nahor
[1] 5
Code
floor(b)       # nadol
[1] 4
Code
round(pi, digits = 3)   # zaokrúhlenie na 3 desatinné miesta
[1] 3.142

Malé cvičenie

Vypočítajte \(\dfrac{12^2 - 9}{5}\)

Code
(12^2 - 9) / 5
[1] 27

Text

Code
meno    <- "Livia"
odbor   <- "Management"
veta    <- paste(meno, "študuje", odbor)       # spojenie s medzerou
slitne  <- paste0(meno, odbor)                 # spojenie bez medzery
zoznam  <- paste("R", "Python", "SQL", sep = ";")
veta; slitne; zoznam
[1] "Livia študuje Management"
[1] "LiviaManagement"
[1] "R;Python;SQL"
Code
nchar(veta)              # počet znakov
[1] 24
Code
substr(veta, 1, 5)       # podreťazec od 1. do 5. znaku
[1] "Livia"
Code
toupper(odbor)           # veľké písmená
[1] "MANAGEMENT"

Malé cvičenie

Z premenných univerzita <- "Comenius" a mesto <- "Bratislava" vytvorte reťazec „Comenius, Bratislava“ a zistite jeho dĺžku a prvé tri znaky.

Code
univerzita <- "Comenius"
mesto      <- "Bratislava"

adresa <- paste(univerzita, mesto, sep = ", ")
adresa
[1] "Comenius, Bratislava"
Code
nchar(adresa)
[1] 20
Code
substr(adresa, 1, 3)
[1] "Com"

Logické hodnoty

Code
p <- TRUE
q <- FALSE
!p
[1] FALSE
Code
p & q
[1] FALSE
Code
p | q
[1] TRUE
Code
xor(p, q)
[1] TRUE
Code
5 > 3
[1] TRUE
Code
10 <= 10
[1] TRUE
Code
"R" == "r"          # R rozlišuje veľké a malé písmená
[1] FALSE
Code
"R" != "Python"
[1] TRUE
Code
x <- 15
x > 10 & x < 20
[1] TRUE
Code
x < 0 | x > 100
[1] FALSE

Malé cvičenie

Zistite, či je číslo n <- 42 párne a zároveň väčšie ako 40.

Code
n <- 42
(n %% 2 == 0) & (n > 40)
[1] TRUE

Numerické vektory

Tvorba vektorov

Code
v1 <- c(3, 6, 9, 12)
v2 <- 10:15
v3 <- seq(from = 0, to = 2, by = 0.5)
v4 <- rep(7, times = 4)
set.seed(2026)                 # kvôli reprodukovateľnosti
v5 <- round(runif(5), 3)       # rovnomerné rozdelenie
v6 <- round(rnorm(5), 3)       # normálne rozdelenie
v1; v2; v3; v4; v5; v6
[1]  3  6  9 12
[1] 10 11 12 13 14 15
[1] 0.0 0.5 1.0 1.5 2.0
[1] 7 7 7 7
[1] 0.699 0.557 0.140 0.286 0.555
[1] -1.958  1.085  0.204  0.501  1.030

Aritmetika s vektormi

Code
v <- c(2, 4, 6, 8)
v + 1
[1] 3 5 7 9
Code
v * 3
[1]  6 12 18 24
Code
v^2
[1]  4 16 36 64
Code
sqrt(v)
[1] 1.414214 2.000000 2.449490 2.828427
Code
sum(c(1, 2, 3) * c(4, 5, 6))                 # skalárny súčin
[1] 32
Code
crossprod(c(1, 2, 3), c(4, 5, 6))            # skalárny súčin ako matica 1x1
     [,1]
[1,]   32
Code
c(1, 2, 3) * c(4, 5, 6)                      # súčin po prvkoch
[1]  4 10 18

Indexovanie

Code
x <- c(8, 15, 2, 21, 6, 0, 30)
x[1]
[1] 8
Code
x[3:5]
[1]  2 21  6
Code
x[-1]
[1] 15  2 21  6  0 30
Code
x[x > 10]
[1] 15 21 30
Code
which(x > 10)
[1] 2 4 7

Chýbajúce hodnoty

Code
y <- c(4, NA, 8, NA, 12)
is.na(y)
[1] FALSE  TRUE FALSE  TRUE FALSE
Code
mean(y)
[1] NA
Code
mean(y, na.rm = TRUE)
[1] 8

Základné štatistiky

Code
z <- c(14, 7, 9, 3, 11)
mean(z)
[1] 8.8
Code
sd(z)
[1] 4.147288
Code
max(z)
[1] 14
Code
summary(z)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
    3.0     7.0     9.0     8.8    11.0    14.0 
Code
sort(z)
[1]  3  7  9 11 14
Code
sort(z, decreasing = TRUE)
[1] 14 11  9  7  3

Malé cvičenie

Vytvorte vektor w s číslami 1 až 30 a vypočítajte súčet čísel deliteľných tromi. Potom určte ich počet.

Code
w <- 1:30
del3 <- w[w %% 3 == 0]
del3
 [1]  3  6  9 12 15 18 21 24 27 30
Code
sum(del3)      # 165
[1] 165
Code
length(del3)   # 10
[1] 10

Matice

Code
m        <- matrix(1:12, nrow = 3, ncol = 4)                 # po stĺpcoch
m_byrow  <- matrix(1:12, nrow = 3, byrow = TRUE)             # po riadkoch
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
Code
dim(m)
[1] 3 4
Code
m[1, 2]
[1] 4
Code
m[, 3]
[1] 7 8 9
Code
m[2, ]
[1]  2  5  8 11
Code
m[1:2, 2:3]
     [,1] [,2]
[1,]    4    7
[2,]    5    8

Maticové operácie

Code
A <- matrix(c(2, 0, 1, 3), nrow = 2)
B <- matrix(c(1, 4, 2, 5), nrow = 2)

A + B
     [,1] [,2]
[1,]    3    3
[2,]    4    8
Code
A * B          # po prvkoch
     [,1] [,2]
[1,]    2    2
[2,]    0   15
Code
A %*% B        # maticový súčin
     [,1] [,2]
[1,]    6    9
[2,]   12   15
Code
t(A)           # transpozícia
     [,1] [,2]
[1,]    2    0
[2,]    1    3
Code
det(A)         # determinant
[1] 6
Code
solve(A)       # inverzia
     [,1]       [,2]
[1,]  0.5 -0.1666667
[2,]  0.0  0.3333333

Spájanie vektorov a štatistiky po riadkoch/stĺpcoch

Code
C <- cbind(1:3, 7:9)
D <- rbind(1:3, 7:9)
C; D
     [,1] [,2]
[1,]    1    7
[2,]    2    8
[3,]    3    9
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    7    8    9
Code
M <- matrix(1:9, nrow = 3)
apply(M, 1, sum)      # súčty po riadkoch
[1] 12 15 18
Code
apply(M, 2, mean)     # priemery po stĺpcoch
[1] 2 5 8

Malé cvičenie

Vytvorte maticu 4x4 s hodnotami 1..16 po riadkoch, vypočítajte riadkové súčty a súčin \(M^T M\).

Code
M2 <- matrix(1:16, nrow = 4, byrow = TRUE)
M2
     [,1] [,2] [,3] [,4]
[1,]    1    2    3    4
[2,]    5    6    7    8
[3,]    9   10   11   12
[4,]   13   14   15   16
Code
rowSums(M2)
[1] 10 26 42 58
Code
t(M2) %*% M2
     [,1] [,2] [,3] [,4]
[1,]  276  304  332  360
[2,]  304  336  368  400
[3,]  332  368  404  440
[4,]  360  400  440  480

Vlastné čísla a vlastné vektory

Pre štvorcovú maticu \(\mathbf A\) platí

\[ \mathbf A \mathbf v = \lambda \mathbf v , \]

kde \(\lambda\) je vlastné číslo a \(\mathbf v \neq \mathbf 0\) je príslušný vlastný vektor.

Ručný výpočet pre maticu 2 × 2

\[ \mathbf A = \begin{pmatrix} 3 & 1 \\ 1 & 3 \end{pmatrix} \]

Charakteristická rovnica:

\[ \det(\mathbf A - \lambda \mathbf I) = (3-\lambda)^2 - 1 = \lambda^2 - 6\lambda + 8 = (\lambda - 4)(\lambda - 2) = 0 , \]

teda \(\lambda_1 = 4\), \(\lambda_2 = 2\).

Pre \(\lambda_1 = 4\) dostaneme sústavu \(-h_{11} + h_{21} = 0\), teda \(h_{11} = h_{21}\). Po normalizácii

\[ \mathbf h_1 = \begin{pmatrix} \sqrt{1/2} \\ \sqrt{1/2} \end{pmatrix}. \]

Pre \(\lambda_2 = 2\) dostaneme \(h_{12} + h_{22} = 0\), teda \(h_{22} = -h_{12}\) a

\[ \mathbf h_2 = \begin{pmatrix} \sqrt{1/2} \\ -\sqrt{1/2} \end{pmatrix}. \]

Matica je symetrická, preto \(\mathbf h_1^T \mathbf h_2 = \tfrac12 - \tfrac12 = 0\) (vektory sú navzájom kolmé).

Výpočet pomocou eigen()

Code
A_eig <- matrix(c(3, 1,
                  1, 3), nrow = 2, byrow = TRUE)

eig_A    <- eigen(A_eig, symmetric = TRUE)
lambda_A <- eig_A$values      # vlastné čísla
V_A      <- eig_A$vectors     # vlastné vektory v stĺpcoch
lambda_A
[1] 4 2
Code
V_A
          [,1]       [,2]
[1,] 0.7071068 -0.7071068
[2,] 0.7071068  0.7071068

Vektory \(\mathbf v\) aj \(-\mathbf v\) sú rovnako správne, preto sa výsledok z R môže líšiť od ručného znamienkom.

Overenie vzťahu Av = λv

Code
lambda_1 <- lambda_A[1]
v_1      <- V_A[, 1]

lava  <- as.vector(A_eig %*% v_1)
prava <- lambda_1 * v_1
lava
[1] 2.828427 2.828427
Code
prava
[1] 2.828427 2.828427
Code
all.equal(lava, prava)
[1] TRUE

Geometrické znázornenie

Code
local({
  povodne <- par(mfrow = c(1, 2), mar = c(4, 4, 3, 1))
  on.exit(par(povodne))

  priklady <- list(c(1, 1), c(1, -1))
  nazvy <- c("Vlastný vektor: lambda = 4", "Vlastný vektor: lambda = 2")

  for (j in seq_along(priklady)) {
    x  <- priklady[[j]]
    Ax <- as.vector(A_eig %*% x)
    plot(NA, xlim = c(-2, 5), ylim = c(-2, 5), asp = 1,
         xlab = "Prvá súradnica", ylab = "Druhá súradnica",
         main = nazvy[j], cex.main = 0.85)
    abline(h = 0, v = 0, col = "grey80")
    arrows(0, 0, Ax[1], Ax[2], col = "darkorange2", lwd = 4, length = 0.12)
    arrows(0, 0, x[1], x[2], col = "steelblue4", lwd = 2, lty = 2, length = 0.10)
    legend("topleft", legend = c("x", "Ax"),
           col = c("steelblue4", "darkorange2"),
           lty = c(2, 1), lwd = c(2, 4), bty = "n", cex = 0.8)
  }
})

Vektor x (modrý) a jeho obraz Ax (oranžový).

Stopa a determinant

Súčet vlastných čísel sa rovná stope matice a súčin determinantu.

Code
c(sucet_vlastnych = sum(lambda_A), stopa = sum(diag(A_eig)))
sucet_vlastnych           stopa 
              6               6 
Code
c(sucin_vlastnych = prod(lambda_A), determinant = det(A_eig))
sucin_vlastnych     determinant 
              8               8 

Malé cvičenie

Pre variančno-kovariančnú maticu denných výnosov troch aktív (ilustračné hodnoty) vypočítajte vlastné čísla a vlastné vektory a určte, aký podiel celkového rozptylu vysvetľuje prvá hlavná zložka.

Asset KO GLD QQQ
KO 0.000090 0.000012 0.000070
GLD 0.000012 0.000040 0.000015
QQQ 0.000070 0.000015 0.000250
Code
Sigma <- matrix(c(
  0.000090, 0.000012, 0.000070,
  0.000012, 0.000040, 0.000015,
  0.000070, 0.000015, 0.000250
), nrow = 3, byrow = TRUE,
dimnames = list(c("KO", "GLD", "QQQ"), c("KO", "GLD", "QQQ")))

eig_S <- eigen(Sigma, symmetric = TRUE)
eig_S$values
[1] 2.777055e-04 6.503220e-05 3.726232e-05
Code
eig_S$vectors
            [,1]       [,2]         [,3]
[1,] -0.35268848  0.9066881  0.231360283
[2,] -0.07665452  0.2184226 -0.972838973
[3,] -0.93259580 -0.3608439 -0.007533387
Code
# kontrola: všetky vlastné čísla > 0 => matica je pozitívne definitná
all(eig_S$values > 0)
[1] TRUE
Code
# kontrola stopy: súčet vlastných čísel = súčet rozptylov
c(sum(eig_S$values), sum(diag(Sigma)))
[1] 0.00038 0.00038
Code
# podiel rozptylu vysvetlený jednotlivými hlavnými zložkami
podiel <- eig_S$values / sum(eig_S$values)
round(podiel, 3)
[1] 0.731 0.171 0.098
Code
round(cumsum(podiel), 3)
[1] 0.731 0.902 1.000

Interpretácia: ak má prvé vlastné číslo veľký podiel, väčšina pohybu aktív je spoločná (trhový faktor), a prvý vlastný vektor ukazuje, ako sa jednotlivé aktíva na ňom podieľajú.