###########################################################
#                                                         #                
#                        Úvod do R                        #
#        Bi3101 Úvod do matematického modelování          #
#                                                         #
#  V následujícím skriptu byly využity úryvky z učebnic:  #
#     Výuka jazyka R (Kateřina Konečná, Jan Koláček)      #
#            Analýza dat v R (Eva Budinská)               #
#                                                         #
###########################################################

# Proměnné v R jsou case sensistive (záleží na psaní velkých a malých písmen).
# Příkazem  <- (popř. =, ten se ovšem nedoporučuje) vložíme hodnotu do proměnné.
# K jejímu zobrazení musí být v konzole z příkazové řádky zavolán jeho název. Další možností je zadání celého příkazu do kulatých závorek.

a <- 2
a
(a <- 2)

# Pro neúplné příkazy se na následujícím řádku objeví prompt + , který dává možnost dodat chybějící část příkazu, a pokračuje dál ve čtení. 

a <- (2 + 3
) * 5

# Symbol # na příkazové řádce způsobí ignoraci zbytku řádky (komentář).

a <- 2  # komentar
a

#Při zadávání názvu jednotlivých proměnných či objektů bychom měli dodržovat určitá pravidla.
#Názvy se mohou skládat z písmen (a-z, A-Z), číslic (0-9), tečky a podtržítka.
#Název musí začínat písmenem, nesmí začínat číslicí, tečka rovněž není doporučována. Matematické operátory (+, -, *, /), mezera a jiné další speciální znaky také nejsou povoleny. Chceme-li použít víceslovný název, rozdělení názvu na dvě části se provádí pomocí tečky (např. průměrnou výšku chlapců můžeme nazvat chlapci.prumer), popř. pomocí podtržítka (chlapci_prumer). Rovněž bychom se měli vyvarovat používání názvů vestavěných proměnných. R je case sensitive, tzn. rozlišuje malá a velká písmena.

a <- 2
a
A

# Běžící program může být zastaven klávesou ESC ve Windows, CTRL + C v Linuxu.
# Konzoli můžeme vymazat klávesovou zkratkou CTRL + L nebo v menu Edit  Clear Console.
# Pro ukončení programu se používá příkaz q().

q()

# Program R načítá data z jakéhokoliv adresáře.
# Nejjednodušší pro manipulaci s nimi je ukládat si data do tzv. pracovního adresáře (workspace).
# Chceme-li zjistit, ve kterém adresáři se právě nacházíme, použijeme příkaz getwd().

getwd()

# Pro změnu pracovního adresáře použijeme příkaz setwd(), jehož argumentem je cesta k adresáři :

setwd("C:")
getwd()

# Příkazy dir() nebo list.files() zobrazíme názvy souborů v aktuálním nebo zadaném adresáři.

dir()
list.files()

# Jazyk R používá následující datové třídy:
  
# Numerické hodnoty - vypisujeme klasickým způsobem, k oddělení desetinných míst používáme desetinnou tečku, tzn.

a<-1
class(a)

# Komplexní čísla - numerická hodnota je doplněna o komplexní jednotku i, např.

1 + 2i
3 + 1i    # Pozor! Komplexní jednotka musí být vždy doplněna o numerickou hodnotu
3 + i
4i

# Logické hodnoty (boolean) - hodnoty TRUE, (lze též psát T) a FALSE, (F).
# Logické hodnoty se používají pro některé argumenty funkcí, jsou výsledkem testování výrazů, např.

2.3 > 3

# Řetězce - používají se pro textové hodnoty, popisky názvy apod. Řetězec musí být zadán do jednoduchých apostrofů (') nebo dvojitých uvozovek ("):

r <- "retezec"
r <- 'retezec'

# V jazyce R existuje celá řada datových struktur. Nejdůležitější jsou:

# Vektory
# Pro vytvoření numerického vektoru x použijeme příkaz c().

x <- c(-1.2, 31.8, 10.7, 5.6, 9.22)
class(x)

a<-c(1,2)
b<-c(3,4)
c<-c(a,b)

# Analogicky můžeme použít příkazu assign("nazev", c()):

assign("x", c(-1.2, 31.8, 10.7, 5.6, 9.22)).

# Přiřazení může být rovněž provedeno v opačném směru:

c(-1.2, 31.8, 10.7, 5.6, 9.22) -> x

# Analogickým způsobem můžeme zadávat komplexní vektory, vektory logických hodnot nebo řetězců:

y <- c(1+2i, 3, 5i)
z <- (x<12 & x>-1)
ovoce <- c("banan", "broskev", "jablko", "pomeranc")

# Pokud dojde ke smíšení více datových tříd, použije se pro definovaný vektor „nejvyšší“ třída ve smyslu logical < numeric < complex < string.

c(2, 4, F)  # jedna z hodnot je znak, vektor tedy bude textový

# Příkaz vector(mode, length) vytvoří vektor daného typu mode a dané délky length s nulovými hodnotami.

vector(mode="logical", length=3)
vector(m="character", length=5)

# Lze využít i jednodušší zápis:

logical(3)
character(5)

# Nejjednodušším způsobem ke generování posloupností čísel je použít operátoru :.
# Příkaz a:b vygeneruje aritmetickou posloupnost prvků od a do b s krokem 1, resp. -1.
# Funkce seq(n) slouží ke generování posloupnosti hodnot od čísla 1 do čísla (vektoru hodnot) uvedeného v argumentu funkce.

4:10
2.4:7
seq(6)
seq(c(3,5))

# Jednou z nekonzistencí R je definice délky vektoru.
# V některých případech se vektor chová, jakoby jeho velikost byla určena už na začátku - nedá se z něj tedy odstranit prvek a nedá se ani přidat prvek doprostřed vektoru.
# Přidání prvku doprostřed vektoru a odstranění prvku se proto děje s pomocí vytvoření nového vektoru, který se přiřadí původní proměnné:
  
x <- c (115,2,35,8,16)
x[3]<-36

# Přidání hodnoty 100 na třetí pozici se provede vytvořením nového vektoru.
# ve funkci concatenate c() spojíme první dva prvky vektoru x, číslo 100 a nakonec poslední tři prvky vektoru:

x <- c (x[1:2], 100, x[3:5])

# Odstranění páté pozice se provede také vytvořením nového vektoru z původního vektoru, bez pozice 5 a jeho přirazením objektu x:
  
x <- x[-5]

# Přidání prvku na konci vektoru je možné i bez vytvoření nového vektoru:
  
x[6] <- -5 # vytvoří novou hodnotu -5 a přidá ji na 6. místo vektoru
x[9] <- 10 # vytvoří novou hodnotu 10 a přidá ji na 9. místo vektoru - místo 7. a 8. dostane hodnotu NA

# Matice

# Základním způsobem k vytvoření matice nebo pole je použít příkazy matrix(), popř. array():
  
u <- 1:20
matrix(u, 4, 5)                # vytvoří matici o 4 řádcích a 5 sloupcích, prvky jsou skládány po sloupcích
matrix(u, 4, 5, byrow=TRUE)    # vytvoří matici 4 x 5, argument byrow=TRUE stanovuje, že prvky jsou skládány po řádcích

# V případě, že je vektor u kratší než je počet prvků matice, při vytváření matice je uplatněno pravidlo recycling rule. Pravidlo spočívá v opakování složek vektoru u tak dlouho, dokud jeho délka nedosáhne počtu prvků matice.

# Seznamy (lists)

# Seznam je lineární datová struktura, ve které jsou seřazeny objekty různých typů a velikostí.

film <- list(jméno = "bond, james bond", věk = 40, zenaty = F, herci = c ("Sean Connery", "George Lazenby", "Roger Moore", "Timothy Dalton", "Pierce Brosnan", "Daniel Craig"))

# Elementy listu jsou přístupné pomocí jejich indexu ve dvou hranatých závorkách [[i]] nebo názvu $název:

names(film)
film$jmeno
film$vek
film[[3]]

# Příkazem unlist() je možno seřadit všechny objekty listu do jednoho vektoru:
  
unlist(film)

# Datové tabulky (data frames)

# V datové nemusí být jednotlivé sloupce nemusí být stejné třídy.
# Data v rámci každého sloupce jsou však stejné třídy (číslo, znak, logická hodnota).

vek <- c(57,81,45)
lecba <- c("CHT","zadna","CHT")
umrti <- c(F,T,F)
IDpacienta <- c("ID01","ID26","ID98")
X <- data.frame(vek,lecba,umrti,row.names=IDpacienta)
X

# Řádky datové tabulky jsou uložené jako seznamy, sloupce jako vektory.

is(X[1])

# Častá chyba v úpravě dat pochází z nevědomosti toho, že data.frame automaticky mění vektor znaků na faktor:
  
X$lecba
class(X$lecba)

# Přesvědčíme se, jaká byla třída původního vektoru:
  
class(lecba)

# Funkce levels() vypíše úrovně faktoru. Funkce nlevels zase počet úrovní faktoru:
  
levels(X$lecba)
nlevels(X$lecba)

# Při neznalosti toho, jak data.frame pracuje s třídou jednotlivých sloupců, může nastat zásadní chyba při zpracování objemných datových souborů.
# Data.frame totiž vektor znaků automaticky mění na faktor. To samo o sobě problémem není, ale může se stát. Uveďme si příklad:
  
# Řekněme, že chceme vypočítat průměrný věk pacienta. Pokud věk nebude zadán jako číslo ale jako vektor znaků a my budeme chtít vypočítat průměrný věk pacienta, dojde k následujícímu:
  
vek <- c("57","81","45")
X <- data.frame(vek,lecba,umrti,row.names=IDpacienta)

mean(X$vek)

# Přečteme si chybovou hlášku a zjistíme, že argument není číslem, budeme si myslet, že to z nějakého důvodu načetlo jako znak a budeme se snažít situaci napravit pomocí funkce as.numeric():
  
mean(as.numeric(X$vek))

# Řešením je převod přes textový řetězec:

mean(as.numeric(as.character(X$vek)))
