Vytvoření a odstranění objektu
Erkové objekty jdou vytvořit dvěma způsoby:
- operátorem přiřazení (
<-
) - jedním rovnítkem (
=
)
Ačkoliv jsou tyto operátory mezi sebou zpravidla zaměnitelné, platí úzus, že pro vytváření objektů používáme operátor <-
a rovnítko používáme pouze pro specifikaci parametrů funkcí jménem (tj. pouze uvnitř kulatých závorek).
Operátor jedno rovnítko (=
) značící přiřazení je třeba odlišovat od operátoru dvě rovnítka (==
), značící porovnání rovnosti.
Operátor jedno rovnítko přiřadí do proměnné na levé straně hodnotu z pravé strany. Operátor dvě rovnítka mezi sebou porovná hodnoty na levé a pravé straně, a o výsledku podá zprávu. V případě rovnosti vrátí TRUE, v případě nerovnosti FALSE.
jedna <- 1 # proměnné "jedna" přiřadíme hodnotu 1 šipkou
jedna # zobrazit obsah proměnné jedna
## [1] 1
jedna = 1 # proměnné "jedna" přiřadíme hodnotu 1 rovnítkem
# a nic nezobrazíme, takže se nic neukáže
jedna == 1 # hodnotu proměnné "jedna" porovnáme s jedničkou (výsledek = pravda)
## [1] TRUE
Pro zničení objektů máme dvě možnosti:
- cíleně odstranit konkrétní objekt voláním
rm()
s objektem jako argumentem - restartovat R (z R Studia přes menu Session / Restart R)
Restartování R zničí všechny objekty v paměti, a je třeba je vytvořit znovu spuštěním skriptů. To může být praktické v okamžiku, kdy jsme objekty v paměti upravovali (například z příkazové řádky) a chceme ověřit správnost skriptu jako celku.
rm(jedna) # odstraním objekt jedna
# a nyní nepůjde zavolat...
Datové typy
Základní datové typy má erko tři:
- číslo (numeric)
- text (character)
- logickou hodnotu (logical)
Existuje ještě jemnější členění čísel na celá čísla (integer), reálná (double) a komplexní (complex); v naprosté většině případů ho můžeme zanedbat (erko převod typů zařídí na pozadí).
U čísel přitom platí, že jako desetinný oddělovač se používá výhradně tečka. Čárka má vlastní význam a za tečku zaměnit nejde.
Navíc k základním typům existují dva speciální datové typy:
- kategorické proměnné (factor)
- uspořádané kategorické proměnné (ordered factor)
Typický příklad kategorické proměnné je pohlaví. Pohlaví můžeme definovat jako mužské, ženské a jiné, přičemž nemá smysl uvažovat o tom že jedno z nich by bylo víc (nebo míň) než druhé.
Typický příklad uspořádané kategorické proměnné je spokojenost. Spokojenost můžeme definovat jako malou, střední či velkou.
Následně můžeme uvažovat o tom, že spokojenost velká > střední > malá, ale už nejde pracovat s tím, že velká spokojenost = 2 × střední.
S kategorickými proměnnými se často setkáváme při importu (stringsAsFactors) a při tvorbě grafických výstupů (pořadí sad v legendě grafu).
Navíc existují speciální hodnoty:
NA
(Not Available) = neznámá hodnotaNULL
= prázdná / neexistující hodnotaNaN
= hodnota, která není číslo (v místě, kde se číslo očekává)Inf
= nekonečno (například jako výsledek dělení nulou)
Ze speciálních hodnot je nejpoužívanější NA, často se na ní ptáme funkcí is.na()
.
Datové struktury
Skalár / jednorozměrná proměnná
Skalární proměnnou vytvoříme přiřazením pomocí operátoru <-
, typ zpravidla dopředu nedeklarujeme.
cislo <- 1
cislo
## [1] 1
text <- "Máma má mísu"
text
## [1] "Máma má mísu"
logi <- TRUE
logi
## [1] TRUE
Vektor
Vektor hodnot stejného základního datového typu vytvoříme funkcí c()
.
K jednotlivým hodnotám přistupujeme přes hranaté závorky a index. Platí přitom, že index se počítá od jedničky (první prvek má číslo 1, ne nula); pro některé uživatele (programátory) to může být nezvyk…
Hranatá závorka se na české klávesnici napíše jako pravý Alt + F, respektive pravý Alt + G.
cislo <- c(10, 20, 30)
cislo[3]
## [1] 30
text <- c("Máma", "má", "mísu")
text[1]
## [1] "Máma"
logi <- c(TRUE, FALSE, TRUE)
logi[2]
## [1] FALSE
Číselný vektor můžeme vytvořit jako sekvenci pomocí operátoru dvojtečka, případně funkcí seq()
, která nám dává více možností kontroly.
jedna_az_pet <- 1:5
jedna_az_pet
## [1] 1 2 3 4 5
trig <- seq(from = 0, to = 2 * pi, by = pi / 8)
trig
## [1] 0.0000000 0.3926991 0.7853982 1.1780972 1.5707963 1.9634954 2.3561945
## [8] 2.7488936 3.1415927 3.5342917 3.9269908 4.3196899 4.7123890 5.1050881
## [15] 5.4977871 5.8904862 6.2831853
Vektorové operace
S vektory jdou provádět stejné operace jako se skaláry, s tím že se provedou s každým prvkem vektoru zvlášť.
jedna_az_pet <- 1:5
jedna_az_pet * 2 # výstup = stejně dlouhý vektor, každý prvek dvojnásobný
## [1] 2 4 6 8 10
sest_az_deset <- 6:10
jedna_az_pet + sest_az_deset # první z prvního + první z druhého vektoru
## [1] 7 9 11 13 15
slova <- c("máma", "táta", "bába") # textový vektor
paste(slova, "má mísu") # paste() = spojení textových řetězců
## [1] "máma má mísu" "táta má mísu" "bába má mísu"
Pro spojení dvou vektorů nefunguje operátor +
(ten by sečetl první s prvním, druhý s druhým prvkem při zachování délky) ale použije se c()
(zkráceně pro concatenate = spojení) jako při vytváření vektoru
jedna_az_deset <- c(jedna_az_pet, sest_az_deset)
jedna_az_deset
## [1] 1 2 3 4 5 6 7 8 9 10
Recyklace (pozor na ní)
Erko má v sobě zabudovanou recyklaci vektorů – což v praxi znamená, že když potřebuje pracovat s vektory nestejné délky, tak si kratší vektor “natáhne” zopakováním hodnot.
papir <- c(1:16) # vektor papir = sekvence od jedničky do patnáckty
plast <- papir * c(1, 0) # plast = lichý "papír" ×1, sudý ×0
plast
## [1] 1 0 3 0 5 0 7 0 9 0 11 0 13 0 15 0
Někdy se to může hodit – jako v zde citovaném příkladu, kdy násobením dlouhého a krátkého vektoru vynulujeme všechny sudé hodnoty – ale zpravidla to není očekávaný stav.
Uvažujme příklad, kdy bychom chtěli sečíst dva vektory – dlouhý s 10 prvky a krátký se dvěma prvky; očekávali bychom tedy změnu na první a druhé pozici, ale od třetího prvku dál pouze hodnoty z delšího vektoru. To se ale nestane.
Aby k tomu došlo je třeba uplatnit “prokrustovu transoformaci” a kratší vektor dorovnat nulami na délku delšího vektoru.
dlouhy <- 1:10
kratky <- c(10, 20)
dlouhy # vektor s deseti prvky
## [1] 1 2 3 4 5 6 7 8 9 10
kratky # vektor se dvěma prvky
## [1] 10 20
# krátký vektor se použije 5x
dlouhy + kratky
## [1] 11 22 13 24 15 26 17 28 19 30
# prokrustova transformace - nuly v délce rozdílu délek
kratky <- c(kratky,
rep(0, length(dlouhy) - length(kratky)))
kratky # vektor dříve krátký má 10 prvků (jako dlouhý)
## [1] 10 20 0 0 0 0 0 0 0 0
# "krátký" vektor se použije jen 1x
dlouhy + kratky
## [1] 11 22 3 4 5 6 7 8 9 10
Data Frame
Základním tabulkovým objektem je data frame. Lze ho chápat jako pospojované vektory, ve kterých sloupce (vždy s hodnotami stejného datového typu) představují proměnné, a řádky (nikoliv nutně stejného datového typu) představují pozorování.
Data frame vytvoříme pomocí funkce data.frame()
nebo (častěji) načtením z externího zdroje.
Sloupce (proměnné) mohou být teoreticky jak ASCII tak UTF-8, ale prakticky volíme pouze ASCII názvy (k UTF-8 názvům je potřeba přistupovat přes uvozovky, což je mimořádně nepohodlné).
pocty <- data.frame(cislo = c(1, 2, 3, 4, 5, 6),
CZ = c("jedna", "dva", "tři", "čtyři", "pět", "šest"),
EN = c("one", "two", "three", "four", "five", "six"),
LA = factor(c("unus", "duo", "tres", "quattuor", "quinque", "sex")))
pocty
## cislo CZ EN LA
## 1 1 jedna one unus
## 2 2 dva two duo
## 3 3 tři three tres
## 4 4 čtyři four quattuor
## 5 5 pět five quinque
## 6 6 šest six sex
K jednotlivým hodnotám přistupujeme buď přes hranaté závorky a index sloupce a řádku, nebo přes dolar ($
) a název sloupce – v takovém případě je výstupem sloupec jako vektor.
Dolar se na české klávesnici napíše jako pravý Alt + ů.
pocty[4, 4] # čtvrtý řádek, čtvrtý sloupec - jde o faktor, vypíše se i rozsah hodnot
## [1] quattuor
## Levels: duo quattuor quinque sex tres unus
pocty[2:3, ] # druhý až třetí řádek, sloupce bez omezení (podmnožina data framu)
## cislo CZ EN LA
## 2 2 dva two duo
## 3 3 tři three tres
pocty[ , 3] # celý třetí sloupec (jako vektor)
## [1] "one" "two" "three" "four" "five" "six"
pocty$CZ # sloupec CZ jako vektor
## [1] "jedna" "dva" "tři" "čtyři" "pět" "šest"
pocty$CZ[2:3] # druhá až třetí hodnota vektoru CZ
## [1] "dva" "tři"
Další čtení / reference
- Base R cheatsheet od RStudia
- An introduction to R – od CRAN, spíše techničtější…
- Workflow Basics kapitola R for Data Science