Uvod

Toto je cvicenie zamerane na numericke, logicke, textove vektory a matice v base R.


1. Vektory

1.1 Vytvorenie vektorov

# numericky vektor
ceny <- c(3.5, 4.2, 2.9, 5.0)
# textovy vektor
mena <- c("Anna", "Boris", "Cyril", "Dana")
# logicky vektor
akcia <- c(TRUE, FALSE, TRUE, TRUE)

ceny; mena; akcia
#> [1] 3.5 4.2 2.9 5.0
#> [1] "Anna"  "Boris" "Cyril" "Dana"
#> [1]  TRUE FALSE  TRUE  TRUE

1.2 Zakladne informacie a operacie

length(ceny)      # dlzka
#> [1] 4
sum(ceny)         # sucet
#> [1] 15.6
mean(ceny)        # priemer
#> [1] 3.9
min(ceny); max(ceny)
#> [1] 2.9
#> [1] 5
round(mean(ceny), 2)
#> [1] 3.9
# operacie po prvkoch
ceny + 1
#> [1] 4.5 5.2 3.9 6.0
ceny * 2
#> [1]  7.0  8.4  5.8 10.0
ceny^2
#> [1] 12.25 17.64  8.41 25.00

1.3 Indexovanie (vyber prvkov)

# vyber podla pozicie
ceny[1]
#> [1] 3.5
ceny[c(1, 3)]
#> [1] 3.5 2.9
# vsetko okrem 2. prvku
ceny[-2]
#> [1] 3.5 2.9 5.0
# vyber podla podmienky (logicka maska)
ceny[ceny > 3]
#> [1] 3.5 4.2 5.0
# nahradenie prvkov
ceny2 <- ceny
ceny2[ceny2 < 3] <- NA
ceny2
#> [1] 3.5 4.2  NA 5.0

1.4 Uzitocne drobnosti

which(ceny > 3)   # indexy TRUE
#> [1] 1 2 4
any(ceny > 10)    # aspon jeden?
#> [1] FALSE
all(ceny > 1)     # vsetky?
#> [1] TRUE
unique(mena)      # jedinecne prvky
#> [1] "Anna"  "Boris" "Cyril" "Dana"

2. Textove vektory (kratko)

slova <- c("R", "je", "fajn")
paste(slova, collapse = " ")
#> [1] "R je fajn"
paste("Cena:", ceny)     # spojenie textu a cisel
#> [1] "Cena: 3.5" "Cena: 4.2" "Cena: 2.9" "Cena: 5"
sprintf("%s ma cenu %.2f EUR", mena, ceny)
#> [1] "Anna ma cenu 3.50 EUR"  "Boris ma cenu 4.20 EUR" "Cyril ma cenu 2.90 EUR"
#> [4] "Dana ma cenu 5.00 EUR"

3. Logicke vektory a NA

x <- c(1, NA, 3, 0)
# pozor na NA pri porovnaniach
is.na(x)
#> [1] FALSE  TRUE FALSE FALSE
# bezpecny priemer
mean(x, na.rm = TRUE)
#> [1] 1.333333
# filtrovanie bez NA a > 1
x[!is.na(x) & x > 1]
#> [1] 3

4. Matice – zaklady

4.1 Tvorba a rozmery

M <- matrix(1:12, nrow = 3, ncol = 4)  # plni sa po stlpcoch
M
#>      [,1] [,2] [,3] [,4]
#> [1,]    1    4    7   10
#> [2,]    2    5    8   11
#> [3,]    3    6    9   12
nrow(M); ncol(M); dim(M)
#> [1] 3
#> [1] 4
#> [1] 3 4

4.2 Mena riadkov a stlpcov, indexovanie

dimnames(M) <- list(
  riadok = paste0("r", 1:nrow(M)),
  stlpec = paste0("c", 1:ncol(M))
)
M
#>       stlpec
#> riadok c1 c2 c3 c4
#>     r1  1  4  7 10
#>     r2  2  5  8 11
#>     r3  3  6  9 12
M[1, 2]        # prvok (r1, c2)
#> [1] 4
M[, 3]         # treti stlpec
#> r1 r2 r3 
#>  7  8  9
M[2, ]         # druhy riadok
#> c1 c2 c3 c4 
#>  2  5  8 11
M[, 2, drop = FALSE]  # ostane matica (n x 1)
#>       stlpec
#> riadok c2
#>     r1  4
#>     r2  5
#>     r3  6

4.3 Jednoduche maticove operacie

A <- matrix(1:4, 2, 2)
B <- matrix(c(2, 0, 1, 3), 2, 2)

A + B       # scitanie po prvkoch
#>      [,1] [,2]
#> [1,]    3    4
#> [2,]    2    7
A * B       # nasobenie po prvkoch (Hadamard)
#>      [,1] [,2]
#> [1,]    2    3
#> [2,]    0   12
A %*% B     # maticovy sucin
#>      [,1] [,2]
#> [1,]    2   10
#> [2,]    4   14
# transpozicia a diagonalne prvky
t(A)
#>      [,1] [,2]
#> [1,]    1    2
#> [2,]    3    4
diag(A)
#> [1] 1 4

4.4 Zhrnutie po riadkoch/stlpcoch

X <- matrix(c(10, 12, 14,
              9,  11, 16,
              7,  13, 15,
              8,  10, 12), nrow = 4, byrow = TRUE)
colnames(X) <- c("Mat", "Fy", "Bio")
rownames(X) <- paste0("st", 1:4)
X
#>     Mat Fy Bio
#> st1  10 12  14
#> st2   9 11  16
#> st3   7 13  15
#> st4   8 10  12
rowMeans(X)   # priemer studenta
#>      st1      st2      st3      st4 
#> 12.00000 12.00000 11.66667 10.00000
colSums(X)    # sucet predmetu
#> Mat  Fy Bio 
#>  34  46  57

5. Male cvicenie (jednoduche, ale uzitocne)

Cvicenie A – Teploty

Zadanie: Vytvorte vektor t pre 7 dni. Spocitajte priemer, kolko dni je nad priemerom a vektor hodnot > 20.

# Vase riesenie sem:
# t <- c(...)
# priem <- mean(t)
# kolko_nad <- sum(t > priem)
# nad20 <- t[t > 20]
#> $priem
#> [1] 20.42857
#> 
#> $kolko_nad
#> [1] 3
#> 
#> $nad20
#> [1] 21 23 25

Cvicenie B – Ceny a zlavy

Zadanie: ceny2 <- c(12, 8, 15, 6). Zlacnite hodnoty >= 10 o 20%, ostatne nechajte.

# Vase riesenie sem:
# ceny2 <- c(12, 8, 15, 6)
# po_zlave <- ceny2
# po_zlave[ceny2 >= 10] <- ceny2[ceny2 >= 10] * 0.8
#> [1]  9.6  8.0 12.0  6.0

Cvicenie C – Znamky (matica)

Zadanie: V X najdite (a) studenta s najvyssim priemerom, (b) predmet s najvyssim suctom.

# Vase riesenie sem:
# priem_stud <- rowMeans(X)
# max_stud <- names(which.max(priem_stud))
# sucet_pred <- colSums(X)
# max_pred <- names(which.max(sucet_pred))
#> $naj_student
#> [1] "st1"
#> 
#> $naj_predmet
#> [1] "Bio"

Cvicenie D – Riadky bez nuly

Zadanie: V matici Y oznacte, ktore riadky neobsahuju ziadnu nulu.

# Vase riesenie sem:
# Y <- matrix(c(1,0,3,
#               2,5,6,
#               0,0,1,
#               7,8,9), nrow = 4, byrow = TRUE)
# bez_nuly <- apply(Y, 1, function(r) all(r != 0))
#> $riadok_bez_nuly
#> [1] FALSE  TRUE FALSE  TRUE

6. Moj navrh pouzitia novinky (jednoduche, ale efektne)

Novinka 1 – Sachovnica cez row()/col() (bez cyklov)

n <- 8
I <- row(matrix(0, n, n))
J <- col(matrix(0, n, n))
chess <- (I + J) %% 2
chess
#>      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
#> [1,]    0    1    0    1    0    1    0    1
#> [2,]    1    0    1    0    1    0    1    0
#> [3,]    0    1    0    1    0    1    0    1
#> [4,]    1    0    1    0    1    0    1    0
#> [5,]    0    1    0    1    0    1    0    1
#> [6,]    1    0    1    0    1    0    1    0
#> [7,]    0    1    0    1    0    1    0    1
#> [8,]    1    0    1    0    1    0    1    0

Novinka 2 – Nasobilkova tabulka cez outer()

mult_table <- function(n = 10) outer(1:n, 1:n, `*`)
mult_table(10)
#>       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
#>  [1,]    1    2    3    4    5    6    7    8    9    10
#>  [2,]    2    4    6    8   10   12   14   16   18    20
#>  [3,]    3    6    9   12   15   18   21   24   27    30
#>  [4,]    4    8   12   16   20   24   28   32   36    40
#>  [5,]    5   10   15   20   25   30   35   40   45    50
#>  [6,]    6   12   18   24   30   36   42   48   54    60
#>  [7,]    7   14   21   28   35   42   49   56   63    70
#>  [8,]    8   16   24   32   40   48   56   64   72    80
#>  [9,]    9   18   27   36   45   54   63   72   81    90
#> [10,]   10   20   30   40   50   60   70   80   90   100