1.2 Ochutnávka práce s daty

Tento oddíl už začíná slíbenou ochutnávku toho, na co se můžete v R těšit. Začneme práci s daty. Jak elegantně umí R zacházet s daty si ukážema na příkladu datasetu diamonds. Nejdříve načteme potřebné balíky pomocí funkce library() a následně i vlastní data.

library(dplyr)
library(tidyr)
library(ggplot2)
library(stargazer)
data("diamonds")

Nejprve se na data podíváme. Dataset obsahuje údaje o 53940 diamantech. Pro každý diamant (řádek tabulky) dataset uvádí váhu diamantu v karátech, kvalitu jeho řezu (cut), jeho barvu (color), rozměry a cenu (price). R inteligentně vypíše jen několik prvních řádků tabulky.

diamonds
## # A tibble: 53,940 x 10
##    carat       cut color clarity depth table price     x     y     z
##    <dbl>     <ord> <ord>   <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
##  1  0.23     Ideal     E     SI2  61.5    55   326  3.95  3.98  2.43
##  2  0.21   Premium     E     SI1  59.8    61   326  3.89  3.84  2.31
##  3  0.23      Good     E     VS1  56.9    65   327  4.05  4.07  2.31
##  4  0.29   Premium     I     VS2  62.4    58   334  4.20  4.23  2.63
##  5  0.31      Good     J     SI2  63.3    58   335  4.34  4.35  2.75
##  6  0.24 Very Good     J    VVS2  62.8    57   336  3.94  3.96  2.48
##  7  0.24 Very Good     I    VVS1  62.3    57   336  3.95  3.98  2.47
##  8  0.26 Very Good     H     SI1  61.9    55   337  4.07  4.11  2.53
##  9  0.22      Fair     E     VS2  65.1    61   337  3.87  3.78  2.49
## 10  0.23 Very Good     H     VS1  59.4    61   338  4.00  4.05  2.39
## # ... with 53,930 more rows

R umožňuje s daty manipulovat velmi elegantně. Například se můžeme podívat na cenu a váhu u nejlépe zbarvených kamenů:

diamonds %>%
    filter(color == "D") %>%
    select(color, price, carat)
## # A tibble: 6,775 x 3
##    color price carat
##    <ord> <int> <dbl>
##  1     D   357  0.23
##  2     D   402  0.23
##  3     D   403  0.26
##  4     D   403  0.26
##  5     D   403  0.26
##  6     D   404  0.22
##  7     D   552  0.30
##  8     D   552  0.30
##  9     D   552  0.30
## 10     D   553  0.24
## # ... with 6,765 more rows

Data lze i jednoduše řadit. Například je možné se podívat na ty nejdražší kameny:

diamonds %>%
    arrange(desc(price))
## # A tibble: 53,940 x 10
##    carat       cut color clarity depth table price     x     y     z
##    <dbl>     <ord> <ord>   <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
##  1  2.29   Premium     I     VS2  60.8    60 18823  8.50  8.47  5.16
##  2  2.00 Very Good     G     SI1  63.5    56 18818  7.90  7.97  5.04
##  3  1.51     Ideal     G      IF  61.7    55 18806  7.37  7.41  4.56
##  4  2.07     Ideal     G     SI2  62.5    55 18804  8.20  8.13  5.11
##  5  2.00 Very Good     H     SI1  62.8    57 18803  7.95  8.00  5.01
##  6  2.29   Premium     I     SI1  61.8    59 18797  8.52  8.45  5.24
##  7  2.04   Premium     H     SI1  58.1    60 18795  8.37  8.28  4.84
##  8  2.00   Premium     I     VS1  60.8    59 18795  8.13  8.02  4.91
##  9  1.71   Premium     F     VS2  62.3    59 18791  7.57  7.53  4.70
## 10  2.15     Ideal     G     SI2  62.6    54 18791  8.29  8.35  5.21
## # ... with 53,930 more rows

Jednotlivé operace lze snadno kombinovat do větších celků. Rekněme, že nás např. zajímá, jaká cena nejdražšího kamene pro každou barvu:

diamonds %>%
    group_by(color) %>%
    arrange(desc(price)) %>%
    slice(1L)
## # A tibble: 7 x 10
## # Groups:   color [7]
##   carat       cut color clarity depth table price     x     y     z
##   <dbl>     <ord> <ord>   <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
## 1  2.19     Ideal     D     SI2  61.8    57 18693  8.23  8.49  5.17
## 2  2.02 Very Good     E     SI1  59.8    59 18731  8.11  8.20  4.88
## 3  1.71   Premium     F     VS2  62.3    59 18791  7.57  7.53  4.70
## 4  2.00 Very Good     G     SI1  63.5    56 18818  7.90  7.97  5.04
## 5  2.00 Very Good     H     SI1  62.8    57 18803  7.95  8.00  5.01
## 6  2.29   Premium     I     VS2  60.8    60 18823  8.50  8.47  5.16
## 7  3.01   Premium     J     SI2  60.7    59 18710  9.35  9.22  5.64

Data lze i jednoduše agregovat. Můžeme např. snadno spočítat průměrnou cenu pro každou barvu kamenů:

diamonds %>%
    group_by(color) %>%
    summarise(average_price = mean(price, na.rm = TRUE))
## # A tibble: 7 x 2
##   color average_price
##   <ord>         <dbl>
## 1     D      3169.954
## 2     E      3076.752
## 3     F      3724.886
## 4     G      3999.136
## 5     H      4486.669
## 6     I      5091.875
## 7     J      5323.818

Kritéria je možné i kombinovat. Následující tabulka obsahuje průměrnou cenu kamene pro kombinaci barvy a řezu:

diamonds %>%
    group_by(color, cut) %>%
    summarise(average_price = mean(price, na.rm = TRUE))
## # A tibble: 35 x 3
## # Groups:   color [?]
##    color       cut average_price
##    <ord>     <ord>         <dbl>
##  1     D      Fair      4291.061
##  2     D      Good      3405.382
##  3     D Very Good      3470.467
##  4     D   Premium      3631.293
##  5     D     Ideal      2629.095
##  6     E      Fair      3682.312
##  7     E      Good      3423.644
##  8     E Very Good      3214.652
##  9     E   Premium      3538.914
## 10     E     Ideal      2597.550
## # ... with 25 more rows