Základní orientace v jazyce R

Interpretace geodat

Jan Caha

2024-02-26

Instalace

Jazyk R

  • interpretovaný programovací jazyk přístupný v základu skrze příkazový řádek

  • implementace jazyka S pod open source licencí

  • určený primárně ke zpracování dat a jejich vizualizaci, s výrazným zaměřením na statistiku (původně) a celkovou problematiku zpracování dat (současnost)

  • základní funkcionalita není příliš široká (respektive snadno přístupná), většina funkcinality přichází z tzv. balíčků

  • centrální sklad balíčků - CRAN (Comprehensive R Archive Network)

R \(\times\) ostatní jazyky

  • konkurence: Matlab, Wolfram Language, Julia, Python, Excel

  • výraznější zaměření na data a operaci s nimi, většina funkcí dobře pracuje s vektory dat a datovými rámci

  • interpretovaný jazyk, možnost široce interagovat s daty a procesy

  • RStudio maximálně zpřístupňuje tzv. interaktivní práci s jazykem (náhledy na pamět, nápovědu, grafy a atd.)

  • od uživatele se většinou nepředpokládá “programování” (ve smyslu komplexnějších konstrukcí)

  • velice příjemná učící křivka

Struktury dat v R,
Základní syntaxe R

Přiřazovací operátor

  • v R používáme pro přiřazení hodnoty do proměnné operátor <-

  • lze použít i = ale z hlediska čtení kódu se to nedoporučuje

  • v RStudiu zkratka Levý Alt + -

Základní typy dat

x <- 5.2
x <- 1.42e-2
typeof(x)
[1] "double"
x <- 5L
typeof(x)
[1] "integer"

Základní typy dat

x <- "řetězec"
typeof(x)
[1] "character"
x <- TRUE
typeof(x)
[1] "logical"

Vektor

  • definice pomocí funkce c()
v <- c(5.2, 4.9, 3.1, -0.4)
v
[1]  5.2  4.9  3.1 -0.4

Pozor

pokud nejsou všechny prvky stejného typu, pak se typ změní na nejreprezentativnější

v <- c(5.2, 4.9, 3.1, -0.4, TRUE, "a")
v
[1] "5.2"  "4.9"  "3.1"  "-0.4" "TRUE" "a"   

Vektor

  • jednotlivé prvky lze získat pomocí operátoru []
v[3]
[1] "3.1"
v[5]
[1] "TRUE"

Seznam

  • definice funkcí list(), umožňuje ukládat smíšené typy prvků
l <- list(5, 4.5, "a", FALSE)
l
[[1]]
[1] 5

[[2]]
[1] 4.5

[[3]]
[1] "a"

[[4]]
[1] FALSE

Seznam

  • jednotlivé prvky lze získat podobně jako u vektorů

  • v jednoduché podobě vrací vždy seznam

l[1]
[[1]]
[1] 5

Pozor

pokud chceme přímo hodnotu, pak musíme použít operátor [[]] pro rozložení seznamu

l[[1]]
[1] 5

Pojmenované vektory a seznamy

x <- c("a" = 1, "b" = 5, "c" = 6)
x[1]
a 
1 
x["a"]
a 
1 

Extrakce jmen

x <- c(1, 5, 6)
names(x) <- c("a", "b", "c")
print(x)
a b c 
1 5 6 
n <- names(x)
print(n)
[1] "a" "b" "c"

Pojmenované seznamy

l <- list("a" = 1, "b" = "text", "c" = TRUE)
l["a"]
$a
[1] 1
l[["a"]]
[1] 1
l$a
[1] 1

Matematické a logické operátory

  • +, -, *, /
  • ^ nebo ** mocnina
  • %% modulo
  • %/% celočíselné dělení
  • ==, <, >, <=, >=, !=
  • ! zápor , | nebo, & a
  • speciální operátor %in% pro vyhledávání ve vektorech a seznamech
  • operátory $ a @ pro přístup k součástem komplexních datových struktur

Funkce

  • jak matematické, např. cos(), sin(), log() atd., ale i funkce pro zpracování dat sort()

  • speciální případy c() a list()

  • většinou vektorizované, takže lze provést nejen na jednom prvku (proměnné) ale přímo na vektoru

  • na funkce se lze odkazovat i balik::funkce(), nepoužívá se často ale lze na tento zápis narazit, např. v situaci kdy je kolize názvů funkcí z různých balíků

a <- c(4, 5, 3.5)
b <- sin(a)
b
[1] -0.7568025 -0.9589243 -0.3507832

Komentáře

  • v kódu R se zapisují pomocí #
# vstupní náhodný vektor o 5 číslech
x <- runif(5, 0, 1)

# funkce pro výpočet logaritmu o základu 10
y <- log(x, base = 10)

# tisk výsledku
y
[1] -1.22975417 -0.56160976 -0.03207598 -0.04768346 -0.43059569

Komplexní datové struktury

  • 2D struktury pro uložení dat - matice (matrix), datové rámce (data.frame)

  • v maticích musí být všechny prvky stejného typu, v datovém rámci se mohou jednotlivé sloupce lišit

  • pro zpracování dat se obvykle používá data.frame, či jeho modernější verze tibble

  • s daty v této podobě se budeme setkávat v při zpracování dat nejčastěji

  • načtení ukázkové datové sady dostupné přímo v základní instalaci R

Komplexní datové struktury

data("mtcars")
head(mtcars)
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1
View(mtcars)

data.frame

df <- data.frame(col_1 = c(1,3,8,7),
                 col_2 = c("a", "b", "b", "a"))

str(df)
'data.frame':   4 obs. of  2 variables:
 $ col_1: num  1 3 8 7
 $ col_2: chr  "a" "b" "b" "a"
head(df)
  col_1 col_2
1     1     a
2     3     b
3     8     b
4     7     a

data.frame prvky

  • konkrétní prvek na řádku a ve sloupci
df[1, 1]
[1] 1
  • celý sloupec
df$col_1
[1] 1 3 8 7

data.frame prvky

  • konkrétní prvek ze sloupce
df$col_1[1]
[1] 1

data.frame názvy proměnných

  • v data.frame (tibble) mají povinně sloupce názvy (případně je přiřazuje R)

  • teoreticky je možné libovolné pojmenování sloupce, ale pokud obsahuje mezeru nebo nestandardní znaky (české) tak je nelze zapisovat jednodušše

mtcars$mpg
mtcars$`míle na galon`
  • ideální je se těmto názvům vyhnout a předcházet problémům

  • funkce colnames() a rownames() jsou variantami funce names()

tibble

  • modernější implementace data.frame se nazývá tibble hodně využivívanou v balících tidyverse
  • navenek se zásadně neliší od data.frame je kompatabilní
  • funkce navíc, zjednodušení některých operací
  • tvorba po řádcích - viz help
library(tibble)

Faktor

  • R je statistický software a snaží se tedy připravovat data pro statické zpracování

  • factor je speciální typ dat, kdy se řetězce zakódují pomocí celočíselných hodnot a samotné textové hodnoty se uloží jako tzv. úrovně (levels)

  • převod na factor pomocí funkce as.factor(), z faktoru na řetězec as.character() nebo na celé číslo as.integer()

  • faktor může být bez pořádí (nominální data), tak s určeným pořadím prvků (ordinální data)

Faktor ukázka

df$col_2 <- as.factor(df$col_2)
print(df)
  col_1 col_2
1     1     a
2     3     b
3     8     b
4     7     a
df$col_2
[1] a b b a
Levels: a b
as.character(df$col_2)
[1] "a" "b" "b" "a"
as.integer(df$col_2)
[1] 1 2 2 1

Důležité funkce

  • kromě data(),View() a names(), které jsme už viděli

  • instalace balíků a jejich načtení do R

  • instalace se provádí pouze jednou, načtení balíku je potřeba udělat před každým jeho použitím v rámci nové R Sesssion

install.packages("nycflights13")
library(nycflights13)
data("flights")
View(flights)

Nenačtení balíku či špatně zapsaná funkce

neexistujici_funkce(df)
Error in neexistujici_funkce(df): could not find function "neexistujici_funkce"

Parametry funkcí

  • 3 typy - povinné, nepovinné (obvykle s určenou výchozí hodnotou) a parametr ...
cor(x, y = NULL, use = "everything", 
    method = c("pearson", "kendall", "spearman"))
data.frame(..., row.names = NULL, check.rows = FALSE, 
           check.names = TRUE, fix.empty.names = TRUE, 
           stringsAsFactors = default.stringsAsFactors())

NSE (non-standard evaluation)

  • česky tzv. nestandardní vyhodnocování argumentů

  • příklad

install.packages("tidyverse")
library(tidyverse)
  • u library() pojem tidyverse vypadá jako název proměnné, ale ve skutečnosti ho R vyhodnotí jako textové označení balíku

  • verze volání funkce s textovým řetězcem je také možná, ale považuje se to zbytečné

library("tidyverse")

Dalším příkladem je parametr ...

  • viz dříve zmíněný příklad
data.frame(..., row.names = NULL, check.rows = FALSE, 
           check.names = TRUE, fix.empty.names = TRUE, 
           stringsAsFactors = default.stringsAsFactors())
  • parametr ... zachytí všechny atributy, kromě těch specificky pojmenovaných

  • všechny parametry jsou vyhodnoceny stejně, zde konkrétně vytvoří nové sloupce

Nejvyužívanější balíky pro zpracování dat (Tidyverse)

Balík tidyverse

install.packages("tidyverse")
library(tidyverse)
  • tzv. metabalík - sám definuje pouze minimum funkcí, ale načítá nejdůležitější balíky pro zpracování dat

  • balíky, které sdílejí společnou filozofii designu funkcí

  • některé funkce základního R nemají ujednocené argumenty a celkové chování (vznikaly v různé době a od různých autorů), tidyverse směřuje k tomu tyto problémy odstranit a ujednotit chování funkcí

  • tidyverse balíky v maximální možné míře využívají NSE pro redukci množství kódu, který je potřeba napsat

  • The tidyverse style guide

Řetězení funkcí

log(sin(seq(0.1, 1, by = 0.2)), base = 2)
[1] -3.3243334 -1.7586713 -1.0606213 -0.6343798 -0.3523136
  • operátor %>% (klávesová zkratka Ctrl + Shift + M) umožňuje předat hodnotu před ním jako první parametr funkce za operátorem

  • není nutné vytvářet dočasné proměnné, ani tvořit složité konstrukce (viz výše)

library(magrittr)
seq(0.1, 1, by = 0.2) %>% 
  sin() %>%
  log(base = 2)
[1] -3.3243334 -1.7586713 -1.0606213 -0.6343798 -0.3523136

Řetězení funkce - příklady

  • definice v balíku magrittr, ale lze používat kompletně v rámci tidyverse
x <- seq(1, 5, by = 1)
y <- x %>% 
  sin() %>% 
  cos()
print(y)
[1] 0.6663667 0.6143003 0.9900591 0.7270351 0.5744009

Řetězení funkcí v tidyverse

  • tidyverse maximálně využívá možností řetězení funkcí

  • dosahuje se toho tím, že prvním argumentem funkce jsou vždy vstupní data (což v klasickém R není vždy pravda)

Nejpoužívanější balíky z tidyverse

  • readr, readxl - načítání a ukládání dat

  • dplyr - základní manipulace s daty

  • tidyr - čištění a reformátování dat

  • ggplot2 - vizualizace, tvorba grafů

  • hms, lubridate - práce s datumy a časy

  • stringr - práce s textovými daty

  • purrr - fukncionální programování

Dotazy?