V rámci konferencie OSS Conf na Žilinskej univerzite sa konal workshop „Jazyk R pre úplných začiatočníkov“. Workshop s praktickými príkladmi viedla a podklady pripravila Martina Litschmannová z VSB-TUO Ostrava. Z workshopov sa nerobil záznam, no vzhľadom k zaujímavej téme a výborne pripraveným materiálom som sa pokúsil vytvoriť videá z pohľadu účastníka.
VIDEO
Jazyk R je primárne určený pre štatistiku, analýzu a vizualizáciu dát. Prvá časť je venovaná inštalácii a prehľadu syntaxe jazyka R
Inštalácia jazyka R
Na stránke https://www.r-project.org/ v menu Download -> CRAN a vyberte odkaz pre 0-Cloud.
Pri inštalácii pre Windows kliknite na „install R for the first time“, ďalej už uvidíte odkaz
pre stiahnutie inštalačného súboru, ktorý stiahnite, spustite a vykonajte inštaláciu.
Pri inštalácii pre OS X stiahnite inštaláciu pre najnovšiu verziu – odkaz nabehnete pod
„Latest release“
Pre užívateľov Windows odporúčame nainštalovať RTools pre inštaláciu niektorých pokročilých knižníc. Na stránke https://www.r-project.org/ v menu Download -> CRAN a vyberte odkaz pre 0-Cloud, pokračujte Download R for Windows. Kliknite na Rtools a stiahnite si inštalačný súbor pre vašu verziu softvéru R a spustite ho.
Vývojové prostredie RStudio je na https://rstudio.com/products/rstudio/download/
Zdrojový kód
# ...................................................
# ............ Martina Litschmannová ................
# ... Katedra aplikované matematiky, FEI, VŠB-TUO ...
# ...................................................
# ....................................
# Operátory a základní početní operace
# ....................................
# Základní aritmetika
2 + 4
6 - 9
4 * 2.5
5 / 2
3^7
# Pokročilejší matematické funkce
factorial(5) # Faktoriál: 5!
choose(5, 2) # Kombinační číslo: 5 nad 2
# používáme výhradně kulaté závorky ().
(((10 + 2) * (340 - 33)) - 2) / 3
# Relační (logické) operátory - výstupem je TRUE / FALSE
5 >= 3 # Neostrá nerovnost analogicky <=
5 < 3 # Ostrá nerovnost analogicky >
5 == 3 # Porovnání rovnosti
5 != 3 # Nerovnost
3 %in% c(1, 3, 4) # Prvková inkluze
# nachází se hodnota v daném vektoru
# Logické spojky
5 >= 3 & 6 < 2 # Logické "AND"
5 >= 3 | 6 < 2 # Logické "OR"
# ....................
# Základní datové typy
# ....................
# Definování objektu, přiřazení hodnoty do paměti
# V R je standardem používat šipku "<-",
# operátor "=" je s ní ekvivalentní.
a <- 2 + 3
a = 2 + 3
a # Explicitní výpis obsahu proměnné do konzole
# Přehled základních atomických datových typů:
a <- 2 # typu 'numeric' (reálné číslo)
b <- "písmenko" # typu 'character' (textový řetězec)
c <- 5 > 1 # typu 'logical' (TRUE / FALSE)
# Ověření datového typu objektu
class(a)
class(b)
class(c)
# Převod (přetypování) mezi datovými typy:
# as.*() – např. při nápravě textově importovaných čísel.
as.character(a) # Číslo se mění na textový řetězec
as.numeric(c) # TRUE se mění na 1 (FALSE na 0)
as.logical(a) # Nenulová čísla se mění na TRUE (0 na FALSE)
# .........................
# Základní datové struktury
# .........................
# Vektor - Všechny prvky MUSÍ být stejného typu.
# Vytváří se funkcí c() (combine/concatenate).
c(5, 9, 6, 1)
# Generování posloupností
1:10 # Celá čísla od 1 do 10
10:1 # Sestupná řada od 10 do 1
seq(1, 10, 2) # Sekvence: od, do, krok (zde lichá čísla)
rep(5, 20) # Replikace: opakuj hodnotu 5 celkem 20krát
# Vektor textových řetězců
c("A", "B", "C") # Složky musí být striktně v uvozovkách
# Implicitní konverze:
# Pokud do c() vložíte různé typy,
# R je převede na nejflexibilnější typ (text).
c("A", 1, "C", 4) # Čísla 1 a 4 se vnitřně změní na "1" and "4"
# Příklad: Vektor všech sudých čísel z intervalu (10, 30)
x <- seq(12, 28, 2)
x
# Indexování a výběr prvků
x[1] # První prvek vektoru x
x[-1] # Všechny prvky vektoru x KROMĚ prvního
x[c(1, 5)] # První a pátý prvek vektoru x
x[3:8] # Třetí až osmý prvek vektoru x
# Podmíněný výběr (Filtrování na základě logických podmínek)
x[x > 20] # Vrátí pouze prvky, které splňují x > 20
x[x > 14 & x < 20] # Filtrace s logickým "A ZÁROVEŇ"
x[x < 14 | x > 20] # Filtrace s logickým "NEBO"
# Modifikace prvků vektoru pomocí indexace a přiřazení
x
x[2] <- 0 # Přepíše druhý prvek vektoru hodnotou 0
x
x
x[x < 20] <- 0 # Hromadný přepis: všechny prvky menší než 20 na 0
x
# .....................................
# Faktor reprezentuje kategoriální data
# .....................................
# Rozdíl mezi textem a faktorem:
vel <- c("S", "S", "M", "L", "XL", "M", "L")
vel # Obyčejný textový vektor
velikosti <- factor(c("S", "S", "M", "L", "XL", "M", "L"))
velikosti # Vektor typu factor – pod výpisem vidíme přehled "Levels"
# Zjištění povolených variant (kategorií) proměnné
levels(velikosti)
# Ruční definice pořadí kategorií
velikosti <- factor(velikosti, levels = c("S", "M", "L", "XL"))
table(velikosti) # Tabulka četností jednotlivých kategorií
# Přejmenování kategorií pomocí argumentu labels
velikosti2 <- factor(
velikosti,
levels = c("S", "M", "L", "XL"),
labels = c("small", "medium", "large", "extra large")
)
table(velikosti2)
# Využití labels ke slučování kategorií
velikosti3 <- factor(
velikosti,
levels = c("S", "M", "L", "XL"),
labels = c("S", "M", "L a větší", "L a větší")
)
table(velikosti3)
levels(velikosti3)
# ......
# Matice
# ......
# Dvourozměrné pole. Všechny buňky musí obsahovat shodný datový typ.
# Plnění matice po sloupcích (byrow = FALSE, výchozí nastavení R)
A <- matrix(c(3, 4, 6, 7, 3, 2), nrow = 2, ncol = 3, byrow = FALSE)
# Plnění matice po řádcích (byrow = TRUE)
B <- matrix(c(3, 4, 6, 7, 3, 2), nrow = 2, byrow = TRUE)
C <- matrix(c(3, 4, 6, 7, 3, 2), nrow = 3, byrow = FALSE)
# Ukázka implicitní konverze v matici
# přítomnost textu převede celou matici na typ character
D <- matrix(c(3, "A", 6, "B", 3, "C"), nrow = 3, ncol = 2)
D
# Indexování matic [řádek, sloupec]
A
A[1, 3] # Prvek v 1. řádku a 3. sloupci
A[1, ] # Výběr celého prvního řádku (vypíše se jako vektor)
A[, 2:3] # Výběr všech řádků, ale pouze z 2. a 3. sloupce
# Matice a matematické operace
A
B
A + B # Sčítání matic (prvek po prvku)
A - B # Odčítání matic (prvek po prvku)
A * B # Skalární násobení (prvek po prvku)
# Maticové násobení reprezentuje operátor `%*%`
# počet sloupců první matice se musí rovnat počtu řádků druhé.
# Násobíme např. matici A (2x3) s maticí C (3x2):
A
C
A %*% C # Výsledkem je maticový součin o rozměru (2x2)
# Praktické využití:
# Tvorba kontingenčních / sdružených tabulek četností
# Zadání: Počty triček na skladě Dámská: 10xS, 15xM, 2xL, 4xXL;
# Pánská: 8xS, 9xM, 2xL, 10xXL)
tabulka <- matrix(
c(10, 15, 2, 4,
8, 9, 2, 10),
ncol = 2,
byrow = FALSE
)
# Pojmenování dimenzí matice pro přehlednost výstupu
rownames(tabulka) <- c("S", "M", "L", "XL")
colnames(tabulka) <- c("damske", "panske")
tabulka
# .........................
# Datový rámec (data.frame)
# .........................
# Jde o tabulku, kde jednotlivé sloupce mohou mít RŮZNÉ datové typy
data <- data.frame(
jmena = c("Alice", "Bob"),
vek = c(25, 30),
student = c(TRUE, FALSE)
)
data
View(data) # Spustí vestavěný grafický prohlížeč tabulky v RStudiu
# Odkazování a extrakce konkrétních sloupců z data.frame
data[["jmena"]] # Vrátí sloupec jako vektor
data$jmena # Rychlý a v R nejběžnější přístup k proměnné
# ...........................
# Definování vlastních funkcí
# ...........................
# Funkce definujeme pomocí klíčového slova function().
# V kulatých závorkách určíme vstupní argumenty, ve složených {} tělo algoritmu.
funkce <- function(x, y) {
(x^2) + (y^2) # R automaticky vrací výsledek posledního řádku (netřeba psát return)
}
# Volání uživatelské funkce
funkce(10, 15)
# Definice funkce s výchozím (defaultním) nastavením argumentu
pozdrav <- function(osloveni = "Martino") {
paste0("Ahoj ", osloveni, "!")
}
pozdrav() # Argument vynechán – použije se výchozí "Martino"
pozdrav("všichni") # Argument zadán – výchozí hodnota se přemaže
# paste0(): Slučuje textové řetězce dohromady bez mezer
# ..........................................
# POZOR – častá chyba při převodu na numeric
#...........................................
# Pokud se pokusíme převést text, který nelze interpretovat jako číslo,
# R dosadí vnitřní indikační hodnotu NA (Not Available - chybějící údaj)
as.numeric("123") # Funguje: text obsahuje pouze číselné znaky
as.numeric("123abc") # Selže: generuje NA a Warning
# Ukázka chování na vektoru dat:
test <- c("10", "20", "abc", "30")
test
as.numeric(test) # Výstup: [1] 10 20 NA 30 + Varování "NAs introduced by coercion"
# DOPORUČENÍ Z PRAXE: Práce s nečistými daty
# Před nuceným přetypováním nejprve
# prozkoumáme strukturu a unikátní hodnoty.
unique(test)
# Ruční ošetření známé anomálie
# nahrazení textu "abc" za systémové NA
test[test == "abc"] <- NA
as.numeric(test)
# Alternativa: Potlačení varovných hlášení
# vhodné pro čisté automatické skripty)
suppressWarnings(as.numeric(test))
# Varování se neskryje, pouze se nezobrazí uživateli
Zobrazit Galériu