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”) a FALSE (“nepravda”); tyto hodnoty je možné zkrátit na T a F, ale výrazně se to nedoporučuje, protože zkrácená jména T a F 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