3.2 Základní datové typy
Data se skládají z jednotlivých hodnot. Každá taková hodnota má určitý datový typ. V R máte k dispozici zejména následující čtyři datové typy (ve skutečnosti je jich více, ale při datové analýze se ostatní typy příliš nepoužívají):
- logical – může obsahovat jen dvě logické hodnoty:
TRUE
(“pravda”) aFALSE
(“nepravda”); tyto hodnoty je možné zkrátit naT
aF
, ale výrazně se to nedoporučuje, protože zkrácená jménaT
aF
je možné předefinovat, po čemž by původně funkční kód dělal nepředvídatelné věci, - integer – může obsahovat kladná i záporná celá čísla; pokud je chcete zadat, musíte za číslo napsal
L
, tj. např.1L
, - double – kladné i záporné reálné číslo; když zadáte v konzoli nebo skriptu číslo bez příznaku
L
, bude v paměti reprezentované jako double, i když to bude shodou okolností celé číslo; na konzulu je však R vypíše celá čísla inteligentně bez desetinných míst a - character – řetězec (text); v R se zadává mezi dvěma uvozovkami nebo apostrofy; uvozovky a apostrofy nelze kombinovat, což umožňuje zadat apostrofy nebo uvozovky jako součást řetězce; jiná možnost, jak zadat uvozovky, apostrofy a jiné zvláštní znaky, je “escapovat” je, tj. napsat je pomocí zpětného lomítka
\
a vybraného znaku (např.\"
znamená uvozovku,\n
konec řádku apod.).
x1 <- TRUE # logická hodnota
x1
## [1] TRUE
x2 <- 1L # celé číslo
x2
## [1] 1
x3 <- 1 # desetinné číslo
x3
## [1] 1
x4 <- 'Josef řekl: "Miluji R!"' # řetězec
x4
## [1] "Josef řekl: \"Miluji R!\""
Reálná čísla jde zadat i pomocí tzv. “vědecké notace”, kde číslo před e
je mantisa, číslo za e
dekadický exponent:
1.3e3 # 1.3 krát 10 na třetí, tj. 1 300
## [1] 1300
2.7e-5 # 2.7 krát 10 na minus pátou, tj. 0.000027
## [1] 2.7e-05
R někdy reálná čísla takto samo vypisuje. Pokud chcete ovlivnit, jak bude reálné číslo vypsané, můžete použít funkci format()
(víc parametrů viz nápověda funkce):
format(2.7e-5, scientific = FALSE)
## [1] "0.000027"
Mezi proměnnou typu integer a double je několik rozdílů. Hlavní z nich se týká přesnosti: typ integer sice umí zahrnout jen celá čísla, reprezentuje je však naprosto přesně. Naproti tomu typ double umí zahrnout i desetinná čísla (a také velmi velká čísla), reprezentuje je však pouze přibližně, takže v následujícím výpočtu vznikne chyba, i když velmi malá:
sqrt(2) ^ 2 - 2 # odmocnina 2 umocněná na druhou minus 2
## [1] 4.440892e-16
3.2.1 Testování datového typu
R umožňuje otestovat, jaký datový typ má zvolená proměnná, pomocí funkcí is.X()
, kde X
je daný datový typ. Tyto funkce vrací TRUE
, pokud je daná proměnná daného datového typu. Existuje i funkce is.numeric()
, která vrací hodnotu TRUE
v případě, že proměnná je číselná, tj. celočíselná nebo reálná
Funkce typeof()
vrací datový typ proměnné jako řetězec (např. "logical"
). Podobná, ale zdaleka ne stejná, je funkce class()
, která vrací třídu objektu z hlediska objektově orientovaného programování. Pro vektory však vrací typ proměnných.
typeof(x1)
## [1] "logical"
is.logical(x1)
## [1] TRUE
is.numeric(x1)
## [1] FALSE
typeof(x2)
## [1] "integer"
is.integer(x2)
## [1] TRUE
is.numeric(x2)
## [1] TRUE
typeof(x3)
## [1] "double"
is.integer(x3)
## [1] FALSE
is.double(x3)
## [1] TRUE
is.numeric(x3)
## [1] TRUE
typeof(x4)
## [1] "character"
is.character(x4)
## [1] TRUE
Podobné, ale poněkud přísněji se chovající testy nabízí balík purrr:
purrr::is_integer(x1)
## [1] FALSE
3.2.2 Chybějící a divné hodnoty
V některých případech může proměnná obsahovat příznak, že její hodnota chybí nebo je chybná. R k tomu má tři speciální hodnoty:
- chybějící hodnota
NA
(“not available”) - hodnota není číslo – je chybná
NaN
(“not a number”) (jen typ double) - hodnota je nekonečná
Inf
(nebo samozřejmě-Inf
) (jen typ double)
Nekonečná hodnota vznikne např. při dělení nenulového čísla nulou:
1 / 0
## [1] Inf
Chybná hodnota vznikne při různých nepovolených operacích, které však nevedou na nekonečno, např. při dělení nuly nulou:
0 / 0
## [1] NaN
Chybějící hodnoty NA
se obvykle používají při zadávání hodnot v konzoli nebo ve skriptu a při ukládání čísel do souboru, aby se označilo, která hodnota chybí.
Existují testy, které testují, zda je hodnota NA
, NaN
nebo Inf
, a které vracejí jako výsledek logickou hodnotu testu (TRUE
nebo FALSE
): is.na()
, is.nan()
, is.finite()
a is.infinite()
(is.infinite()
vrací TRUE
pro Inf
i -Inf
, is.finite()
naopak). Pozor: funkce is.na()
vrací TRUE
jak pro NA
, tak i pro NaN
.
Stejně jako ostatní hodnoty v R, tak i chybějící hodnoty mají svůj typ. V celočíselné proměnné je tak NA
ve skutečnosti reprezentované jako NA_integer_
, zatímco v reálné proměnné jako NA_real_
apod. Pokud byste vypsali obsah těchto dvou proměnných na obrazovku, uvidíte NA
; pokud byste použili k otestování shody jejich obsahu funkci identical()
(viz dále), dostanete:
x1 <- c(1L, NA)[2] # vezme se druhá hodnota celočíselného vektoru
x2 <- c(1, NA)[2] # vezme se druhá hodnota reálného vektoru
x1
## [1] NA
x2
## [1] NA
identical(x1, x2)
## [1] FALSE
Velmi speciální hodnotou je NULL
. NULL
je speciální objekt (má vlastní datový typ) a zároveň rezervované slovo, které R vrací v situaci, kdy nějaká hodnota není definovaná nebo nějaký vektor neexistuje. NULL
se často chová jako vektor nulové délky. K otestování, zda je hodnota objektu NULL
slouží funkce is.null()
.
3.2.3 Převody mezi datovými typy
V případě, že R potřebuje nějakým způsobem sladit dva základní datové typy (např. je spojit do jednoho atomického vektoru), provede R jejich automatickou konverzi a převede jednodušší typ na obecnější typ. Převod probíhá od logických proměnných k celočíselným (TRUE
se převede na 1 a FALSE
na 0), od celočíselných k reálným a od nich k řetězcům. Při automatické konverzi záleží na pořadí:
# funkce c() spojí hodnoty v závorkách do vektoru a převede je na společný typ
c(TRUE, 1L, 1, "1")
## [1] "TRUE" "1" "1" "1"
c(c(TRUE, 1L), 1, "1")
## [1] "1" "1" "1" "1"
c(c(TRUE, 1L, 1), "1")
## [1] "1" "1" "1" "1"
Automatické konverze lze někdy využít k zajímavým trikům. Pokud např. chceme sečíst počet případů, ve kterých platí nějaká podmínka, jde použít na logický vektor numerickou funkci pro součet hodnot prvků vektoru sum()
a využít automatickou konverzi:
x <- c(1, 2, 3, 7, 19, 31) # vytvoří vektor daných čísel
# kolik hodnot x je větší než 10?
sum(x > 10)
## [1] 2
Výraz sum(x > 10)
se vyhodnotí postupně: nejdříve se vyhodnotí výraz x > 10
, jehož výsledkem je logický vektor, kde je každé číslo větší než 10 nahrazeno TRUE
a každé číslo menší rovno 10 nahrazeno FALSE
. Ve druhém kroku R automaticky nahradí každé TRUE
jedničkou a každé FALSE
nulou. Ve třetím kroku sečte vektor jedniček a nul.
V některých situacích je třeba provést konverzi ručně. K tomu slouží funkce as.X()
, kde X
je jméno datového typu.
as.character(TRUE)
## [1] "TRUE"
as.integer(TRUE)
## [1] 1
as.logical(c(-1, 0, 0.1, 1, 2, 5)) # nula se převede na FALSE, ostatní čísla na TRUE
## [1] TRUE FALSE TRUE TRUE TRUE TRUE
Překvapivě je možné převést i řetězce na čísla, pokud dané řetězce obsahují číselné hodnoty, nebo na logické hodnoty, pokud je obsahují. Tyto operace však nemusejí být bezpečné.
as.integer("11")
## [1] 11
as.double("11.111")
## [1] 11.111
as.logical("TRUE")
## [1] TRUE
Někdy R neví, jak nějaký objekt převést. Pak je výsledkem hodnota NA
a R vydá varování:
x <- c("a", "b", "c")
as.numeric(x)
## Warning: NAs introduced by coercion
## [1] NA NA NA