3.8 Tibble

Kromě data.frame existuje v ještě několik typů datasetů. Později budete potřebovat ještě typ tibble, do kterého převádí datasety balíky dplyr a tidyr. Tento typ datasetu má některé velmi příjemné vlastnosti. Detailní popis této třídy najdete zde: https://blog.rstudio.org/2016/03/24/tibble-1-0-0/ a ve vinětě k balíku tibble.

Dataset tibble vytvoříte pomocí funkce tibble() nebo data_frame() (jedná se o synonyma):

library(tibble)
ds <- tibble(x = 1:1e6, y = 2 * x, zed = x / 3 + 1.5 * y - 7)
ds
## # A tibble: 1,000,000 x 3
##        x     y        zed
##    <int> <dbl>      <dbl>
##  1     1     2 -3.6666667
##  2     2     4 -0.3333333
##  3     3     6  3.0000000
##  4     4     8  6.3333333
##  5     5    10  9.6666667
##  6     6    12 13.0000000
##  7     7    14 16.3333333
##  8     8    16 19.6666667
##  9     9    18 23.0000000
## 10    10    20 26.3333333
## # ... with 999,990 more rows

Ke konverzi jiných tříd na tibble slouží funkce as_tibble() a as_data_frame().

Vytvoření tibble se od vytvoření data.frame v několika ohledech liší: tibble

  1. nepřevádí řetězce na faktory
  2. nemění “nepovolená” jména sloupců na povolená nahrazením divných znaků tečkami
  3. vyhodnocuje své argumenty postupně, takže můžete později zadaný argument použít při tvorbě dříve zadaného argumentu (jako v příkladu výše)
  4. nepoužívá jména řádků (která jsou ostatně nebezpečná k uchovávání dat)
  5. převod na tibble pomocí as_tibble() je rychlejší než převod na data.frame pomocí as.data.frame()

Liší se také tisk tibble od tisku data.frame: oproti data.frame zobrazí tibble navíc rozměr datasetu a typ jednotlivých proměnných. Naopak vypíše jen prvních deset řádků a jen takový počet sloupců, které se vejdou na obrazovku. Počet vypsaných řádků je možné ovlivnit bud ve funkci print(), nebo v options(), viz viněta:

print(ds, n = 5)
## # A tibble: 1,000,000 x 3
##       x     y        zed
##   <int> <dbl>      <dbl>
## 1     1     2 -3.6666667
## 2     2     4 -0.3333333
## 3     3     6  3.0000000
## 4     4     8  6.3333333
## 5     5    10  9.6666667
## # ... with 1e+06 more rows

Liší se také subsetování. tibble nikdy nezahazuje zbytečné rozměry a ani je nepřidává. To znamená, že [] vždy vrací tibble, zatímco [[]] a $ vždy vrací vektor. Navíc tibble nikdy nepodporuje partial matching:

ds <- ds[1:6, ]  # omezíme ds na prvních 6 řádků
ds[, 1]
## # A tibble: 6 x 1
##       x
##   <int>
## 1     1
## 2     2
## 3     3
## 4     4
## 5     5
## 6     6
ds[[1]]
## [1] 1 2 3 4 5 6
ds$z
## Warning: Unknown or uninitialised column: 'z'.
## NULL

Někdy se nehodí pracovat s tibble (např. proto, že některé funkce očekávají jiný výsledek subsetování). V takovém případě můžete tibble převést na data.frame pomocí konverzní funkce as.data.frame():

as.data.frame(ds)
##   x  y        zed
## 1 1  2 -3.6666667
## 2 2  4 -0.3333333
## 3 3  6  3.0000000
## 4 4  8  6.3333333
## 5 5 10  9.6666667
## 6 6 12 13.0000000