1 Základy práce v R

1.1 Aritmetika

1 + 1
## [1] 2
2*3
## [1] 6
15/4
## [1] 3.75
17 %% 4 # modulo
## [1] 1

1.2 Vektory

x <- c(1, 4, 5, 5) # priradenie do vektora
x
## [1] 1 4 5 5
rep(3, times = 5) # staci rep(3, 5)
## [1] 3 3 3 3 3
rep(c(1, 15, 20), times = 5)
##  [1]  1 15 20  1 15 20  1 15 20  1 15 20  1 15 20
rep(c(1, 15, 20), each = 5)
##  [1]  1  1  1  1  1 15 15 15 15 15 20 20 20 20 20
seq(from = 0, to = 100, by = 10)
##  [1]   0  10  20  30  40  50  60  70  80  90 100
seq(from = 1, to = 100, length.out = 15)
##  [1]   1.000000   8.071429  15.142857  22.214286  29.285714  36.357143
##  [7]  43.428571  50.500000  57.571429  64.642857  71.714286  78.785714
## [13]  85.857143  92.928571 100.000000
10:20
##  [1] 10 11 12 13 14 15 16 17 18 19 20

Práca s vektormi - lepšie priamo ako v cykloch

x1 <- seq(from = 5, to = 15, by = 2)
x1
## [1]  5  7  9 11 13 15
x2 <- x1 + 1
x2
## [1]  6  8 10 12 14 16
x1 + x2
## [1] 11 15 19 23 27 31
x1/x2 # delenie bude po zlozkach
## [1] 0.8333333 0.8750000 0.9000000 0.9166667 0.9285714 0.9375000
length(x1)
## [1] 6
max(x1)
## [1] 15
min(x1)
## [1] 5
unique(c(1, 2, 2, 5, 6, 2))
## [1] 1 2 5 6

1.3 Logické hodnoty TRUE/FALSE

3 > 4
## [1] FALSE
y1 <- c(1, 3, 5, 2)
y2 <- c(2, 2, 5, 2)
y1 == y2 # porovnanie bude po zlozkach
## [1] FALSE FALSE  TRUE  TRUE
y1 != y2
## [1]  TRUE  TRUE FALSE FALSE
y1 < y2
## [1]  TRUE FALSE FALSE FALSE
all(y1 < y2)
## [1] FALSE
any(y1 < y2)
## [1] TRUE
(1 < 3) & (1 < 0)  # AND
## [1] FALSE
(1 < 3) | (1 < 0)  # OR
## [1] TRUE

1.4 Práca s reťazcami - vrátime sa k nim, keď sa objavia v príkladoch

grep(pattern = "o", x = c("pondelok", "utorok", "streda"))
## [1] 1 2
grepl(pattern = "o", x = c("pondelok", "utorok", "streda"))
## [1]  TRUE  TRUE FALSE
strsplit("MAREC", "")
## [[1]]
## [1] "M" "A" "R" "E" "C"
strsplit("MAREC", "")[[1]]
## [1] "M" "A" "R" "E" "C"
as.character(12345)
## [1] "12345"
paste("A", "B", "C")
## [1] "A B C"
paste0("A", "B", "C")
## [1] "ABC"

1.5 Definovanie funkcií

vypocet <- function(x, y, n){
  pom1 <- (x + y)^n
  pom2 <- x*y
  return(pom1/pom2)
}
vypocet(1, 3, 1)
## [1] 1.333333

2 Simulácie

2.1 Funkcia sample

set.seed(123) # kvoli reprodukovatelnosti
sample(1:10, size = 8, replace = FALSE)
## [1]  3 10  2  8  6  9  1  7
sample(1:10, size = 8, replace = TRUE)
## [1]  6  9 10  5  3  9  9  9
sample(1:3, size = 20, replace = TRUE, prob = c(0.6, 0.3, 0.1))
##  [1] 2 2 1 1 1 1 3 3 2 2 1 1 2 1 1 1 1 1 1 1

2.2 Funkcia replicate, opakovanie simulácií

pocetRoznych <- function(n){
  vyber <-  # doplnte - chceme vygenerovat n hodnot spomedzi 1, 2, ..., n, s opakovanim a rovnakymi pravdepodobnostami
    return() # doplne - pocet roznych cisel vo vybere
}

set.seed(123) # kvoli reprodukovatelnosti
simulacia <- replicate(10^5, pocetRoznych(10))
table(simulacia) # pocetnosti pre jednotlive moznosti
prop.table(table(simulacia)) # relativne pocetnosti = odhady pravdepodobnosti
mean(simulacia) # priemer = odhad strednej hodnoty

Pre kontrolu:

## simulacia
##       2       3       4       5       6       7       8       9      10 
## 0.00001 0.00067 0.01671 0.12991 0.34460 0.35559 0.13584 0.01624 0.00043
## [1] 6.51233

3 Cvičenia I. (s návodmi)

Hodíme päťkrát pravidelnou kockou a zaznamenáme súčet čísel, ktoré padli. Aké možnosti súčtu a ako často nastali?

# definujte funkciu
sucet <- function(){
  ...
}

# spravte simulacie
set.seed(123)
simulacie <- replicate( ... )

# zobrazte vysledky

To isté, ale hádžeme päťdesiatkrát.

Pri veľkom počte výsledkov sa namiesto stĺpcového grafu oplatí spraviť histogram:

Hodíme desaťkrát pravidelnou kockou a zaznamenáme či padla aspoň raz šestka. Ako často nastala situácia, že šestka padla a ako často nie?

Návod:

set.seed(123)
kocky <- sample(1:6, size = 10, replace = TRUE)
kocky
##  [1] 3 6 3 2 2 6 3 5 4 6
kocky == 6
##  [1] FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE  TRUE

Hodíme desaťkrát nepravidelnou kockou, pri ktorej má jednotka pravdepodobnosť padnutia 0,5 a ostatné hodnoty po 0,1. Zaznamenáme či padla aspoň raz šestka. Ako často nastala situácia, že šestka padla a ako často nie? Inak povedané: Aký je náš odhad pravdepodobnosti, že padla aspoň jedna šestka?

Návod: parameter prob funkcie sample

kocky <- sample(1:6, size = 10, replace = TRUE, prob = ) # doplnte

4 Cvičenia II.

5 Ďalšie funkcie v R

5.1 If, else, ifelse

Syntax:

# hadzeme siestimi kockami, ak padne aspon jedna sestka, vyhrame 1 euro, inak nic
set.seed(12)
x <- sample(1:6, size = 6, replace = TRUE)
x
## [1] 2 2 3 6 5 5
vyhra <- 0
if(any(x == 6)) vyhra <- 1
vyhra
## [1] 1
x
## [1] 2 2 3 6 5 5
vyhra <- 0
if(any(x == 6)){
  vyhra <- 1
  print("HURA!!!")
}
## [1] "HURA!!!"
vyhra
## [1] 1
x <- sample(1:6, size = 6, replace = TRUE)
x
## [1] 4 2 3 2 5 2
vyhra <- 0
if(any(x == 6)){
  vyhra <- 1
  print("HURA!!!")
} else{
  vyhra <- 0
  print("SMOLA :(")
}
## [1] "SMOLA :("

ifelse:

  • naraz, čo sa má stať pri splnení aj nesplnení podmienky
  • vie pracovať aj s vektorovým vstupom
x <-  c(4, 2, 3, 2, 5, 2)
vysledok <- ifelse(any(x == 6), "HURA", "SMOLA")
vysledok
## [1] "SMOLA"
parita <- ifelse(x %% 2 == 0, "parne", "neparne")
parita
## [1] "parne"   "parne"   "neparne" "parne"   "neparne" "parne"

5.2 For, while

Ak sa dá, treba pracovať s vektormi, niekedy však treba niečo prejsť v cykle

Syntax:

x
## [1] 4 2 3 2 5 2
y <- numeric(length(x)) # vektor s rovnakym rozmerom ako x, numericke zlozky
for(i in 1:length(x)) y[i] <- x[i] + 2

z <- numeric(length(x)) # vektor s rovnakym rozmerom ako x, numericke zlozky
for(i in 1:length(x)) {
  pom <- x[i] %% 2  # pomocna premenna
  z[i] <- pom
}
z
## [1] 0 0 1 0 1 0

Cvičenie: Vytvorte tieto vektory y a z bez cyklu.

Užitočné použitie for-cyklu: Príklad zo slajdov o podmienených pravdepodobnostiach zo súťaže Putnam exam o hádzaní na basketbalový kôš.

koniec <- 0

while(!koniec) # v jednom riadku netreba zatvorky
  
while(!koniec){
  # telo cyklu
}

5.3 Apply

Vygenerujme si nejaké hodnoty:

x <- 1:10
y <- 11:21
xy <- cbind(x, y) # spoji x, y ako stlpce (c = column)
## Warning in cbind(x, y): number of rows of result is not a multiple of vector
## length (arg 1)
xy
##        x  y
##  [1,]  1 11
##  [2,]  2 12
##  [3,]  3 13
##  [4,]  4 14
##  [5,]  5 15
##  [6,]  6 16
##  [7,]  7 17
##  [8,]  8 18
##  [9,]  9 19
## [10,] 10 20
## [11,]  1 21
class(xy)
## [1] "matrix" "array"
# PRIKLAD 1
apply(xy, # pracujeme s maticou xy
      MARGIN = 1, # po riadkoch
      FUN = function(vstup) vstup[2] %% vstup[1]) # na kazdy riadok sa pouzije tato funkcia
##  [1] 0 0 1 2 0 4 3 2 1 0 0
# PRIKLAD 2
apply(xy, 1, max)
##  [1] 11 12 13 14 15 16 17 18 19 20 21
# PRIKLAD 3
f <- function(vstup) vstup[1] > vstup[2]
vysledok <- apply(xy, 1, f)
vysledok
##  [1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
# PRIKLAD 4
set.seed(123)
apply(xy, 
      2,  # po stlpcoch
      function(a) sample(a, size = 2, replace = FALSE)) # vyberieme nahodne dve zlozky s opakovanim
##      x  y
## [1,] 3 20
## [2,] 1 12

Uvažujme príklad analogický cvičeniu o hádaní odpovedí na teste o prezidentoch, v ktorom je však len 6 otázok. Nájdeme presné pravdepodobnostné rozdelenie počtu bodov, ktoré študent získa.

# install.packages(gtools) # ak treba nainstalovat balik 
library(gtools)
n <- 6
permutacie <- permutations(n, n) # help k funkcii pomocou ?permutations
head(permutacie)
##      [,1] [,2] [,3] [,4] [,5] [,6]
## [1,]    1    2    3    4    5    6
## [2,]    1    2    3    4    6    5
## [3,]    1    2    3    5    4    6
## [4,]    1    2    3    5    6    4
## [5,]    1    2    3    6    4    5
## [6,]    1    2    3    6    5    4

Pomocou apply spočítajte počet bodov, ktoré študent získa pre každú možnú odpoveď. Vypočítajte pravdepodobnosti jednotlivých počtov bodov, ktoré získa pri náhodnom výbere odpovede.

5.4 Sapply

Základná myšlienka: Tú istú funkciu voláme pre rôzne vstupy (preto apply), pričom (ak sa to dá) sa výstup zjednoduší na vektor alebo pole (simplify, preto s).

Hádžeme mincami, vo vseobecnosti nepravidelnými

minca <- function(p) sample(c("H", "Z"), size = 1, p = c(p, 1-p))
minca(0.5) # hodime pravidelnou mincou
## [1] "H"
minca(0.1) # hodime nepravidelnou mincou, pp. hlavy je 0.1
## [1] "Z"
set.seed(123)
sapply(c(0.5, 0.1, 0.9), # prva minca je pravidelna, druha ma pp. hlavy 0.1, tretia 0.9
       minca)            # volame funkciu pocetH
## [1] "Z" "Z" "H"

Uvažujme príklad z cvičenia o podmienenej pravdepodobnosti zo súťaže Putnam, v ktorej sa hádže mincami. Napíšte funkciu, ktorá pre zadaný počet mincí simuluje hádzanie a vráti TRUE/FALSE podľa toho, či je počet hláv párny alebo nepárny. Simuláciou odhadnite pravdepodobnosť výsledku TRUE pre 10 mincí.

6 Cvičenia III.