class: center, middle, inverse, title-slide # Transformação de dados de forma
tidy
### 1º Meetup R-Ladies Curitiba ### Junho, 2018 --- class: inverse, center, middle # Olá! Bruna Wundervald <br> <a href="mailto:brunadaviesw@gmail.com"><i class="fa fa-paper-plane fa-fw"></i> brunadaviesw@gmail.com</a><br> <a href="https://brunaw.github.io/"><i class="fa fa-link fa-fw"></i> brunaw.github.io</a><br> <a href="http://github.com/brunaw"><i class="fa fa-github fa-fw"></i> @brunaw</a><br> <i class="fa fa-map-marker fa-fw"></i> São Paulo, SP, Brasil</a> <p> </p> <img src="img/logos.png" width="75%" /> --- class: center # O *tidyverse* --- > Coleção de pacotes para ciência de dados, que compartilham a mesma filosofia, gramática e estruturas de dados. <img src="img/tidy_workflow.png" width="75%" style="display: block; margin: auto;" /> --- class: left # Pacotes ```r library(tidyverse) tidyverse::tidyverse_packages() ``` * `ggplot2`: gráficos bonitos * `dplyr`: manipulação de dados * `tidyr`: leitura de dados * `readr`: *tidy*zar os dados * `purrr`: programação funcional * `tibble`: *data.frames* simples * `magrittr`: semântica * `stringr`: lidar com *strings* (texto) * `forcats`: lidar com fatores (classes) * `lubridate`: lidar com datas (classes) --- class: left # Pacotes ```r library(tidyverse) tidyverse::tidyverse_packages() ``` * `ggplot2`: gráficos bonitos * **`dplyr`: manipulação de dados** * `tidyr`: leitura de dados * `readr`: *tidy*zar os dados * `purrr`: programação funcional * `tibble`: *data.frames* simples * **`magrittr`: semântica** * `stringr`: lidar com *strings* (texto) * `forcats`: lidar com fatores (classes) * `lubridate`: lidar com datas (classes) --- class: left # Livro <div class="figure" style="text-align: center"> <img src="img/ds.png" alt="Livro: R for Data Science, Hadley Wickham & Garrett Grolemund" width="35%" /> <p class="caption">Livro: R for Data Science, Hadley Wickham & Garrett Grolemund</p> </div> --- # O `magrittr` e o `pipe` * O `pipe`, ou `%>%`, é um operador que aplica aos valores a sua esquerda operações que estão a direita. ```r library(magrittr) iris %>% summary() ``` ``` ## Sepal.Length Sepal.Width Petal.Length Petal.Width ## Min. :4.300 Min. :2.000 Min. :1.000 Min. :0.100 ## 1st Qu.:5.100 1st Qu.:2.800 1st Qu.:1.600 1st Qu.:0.300 ## Median :5.800 Median :3.000 Median :4.350 Median :1.300 ## Mean :5.843 Mean :3.057 Mean :3.758 Mean :1.199 ## 3rd Qu.:6.400 3rd Qu.:3.300 3rd Qu.:5.100 3rd Qu.:1.800 ## Max. :7.900 Max. :4.400 Max. :6.900 Max. :2.500 ## Species ## setosa :50 ## versicolor:50 ## virginica :50 ## ## ## ``` --- # O `magrittr` e o `pipe` * Podem ser encadeadas tantas operações quanto se queira. * Variáveis temporárias não são criadas. ```r iris %>% subset(Sepal.Length > mean(Sepal.Length)) %>% summary() ``` ``` ## Sepal.Length Sepal.Width Petal.Length Petal.Width ## Min. :5.90 Min. :2.200 Min. :4.000 Min. :1.000 ## 1st Qu.:6.20 1st Qu.:2.800 1st Qu.:4.700 1st Qu.:1.500 ## Median :6.45 Median :3.000 Median :5.100 Median :1.800 ## Mean :6.58 Mean :2.970 Mean :5.239 Mean :1.811 ## 3rd Qu.:6.80 3rd Qu.:3.175 3rd Qu.:5.700 3rd Qu.:2.100 ## Max. :7.90 Max. :3.800 Max. :6.900 Max. :2.500 ## Species ## setosa : 0 ## versicolor:26 ## virginica :44 ## ## ## ``` --- # `%<>%` * Operador de subscrição: `%<>%` ```r iris$Sepal.Length %<>% sqrt() ``` <div class="figure" style="text-align: center"> <img src="img/pipe.png" alt="Isto não é um cachimbo!" width="25%" /> <p class="caption">Isto não é um cachimbo!</p> </div> --- background-image: url("https://media.giphy.com/media/3o7btPCcdNniyf0ArS/giphy-downsized.gif") background-position: 50% 80% # O `dplyr` > Gramática de manipulação de dados, construída através de "verbos". * `mutate()`: adicionar novas variáveis, que podem ser funções de outras. * `select()`: seleciona ou descarta variáveis. * `filter()`: filtros por critérios. * `summarise()`: resumir os dados. * `arrange()`: ordenar os dados. * `group_by()`: performar operações dentro de grupos. --- # Exemplos ```r library(dplyr) starwars %>% head() ``` ``` ## # A tibble: 6 x 13 ## name height mass hair_color skin_color eye_color birth_year gender ## <chr> <int> <dbl> <chr> <chr> <chr> <dbl> <chr> ## 1 Luke Sky… 172 77. blond fair blue 19.0 male ## 2 C-3PO 167 75. <NA> gold yellow 112. <NA> ## 3 R2-D2 96 32. <NA> white, bl… red 33.0 <NA> ## 4 Darth Va… 202 136. none white yellow 41.9 male ## 5 Leia Org… 150 49. brown light brown 19.0 female ## 6 Owen Lars 178 120. brown, gr… light blue 52.0 male ## # ... with 5 more variables: homeworld <chr>, species <chr>, films <list>, ## # vehicles <list>, starships <list> ``` * `tibbles`: data.frames modernos --- # Exemplos ```r starwars %>% select(hair_color, birth_year, name) %>% head(4) ``` ``` ## # A tibble: 4 x 3 ## hair_color birth_year name ## <chr> <dbl> <chr> ## 1 blond 19.0 Luke Skywalker ## 2 <NA> 112. C-3PO ## 3 <NA> 33.0 R2-D2 ## 4 none 41.9 Darth Vader ``` ```r starwars %>% select(-hair_color, -birth_year, -name) %>% head(4) ``` ``` ## # A tibble: 4 x 10 ## height mass skin_color eye_color gender homeworld species films ## <int> <dbl> <chr> <chr> <chr> <chr> <chr> <list> ## 1 172 77. fair blue male Tatooine Human <chr [5]> ## 2 167 75. gold yellow <NA> Tatooine Droid <chr [6]> ## 3 96 32. white, blue red <NA> Naboo Droid <chr [7]> ## 4 202 136. white yellow male Tatooine Human <chr [4]> ## # ... with 2 more variables: vehicles <list>, starships <list> ``` --- # Exemplos ```r starwars %>% na.omit() %>% filter(eye_color == "yellow") %>% mutate(imc = mass/(height^2)) %>% select(name, gender, imc) ``` ``` ## # A tibble: 4 x 3 ## name gender imc ## <chr> <chr> <dbl> ## 1 Darth Vader male 0.00333 ## 2 Palpatine male 0.00260 ## 3 Darth Maul male 0.00261 ## 4 Ki-Adi-Mundi male 0.00209 ``` --- # Exemplos ```r starwars %>% na.omit() %>% dplyr::mutate(imc = mass/(height^2)) %>% dplyr::group_by(species) %>% dplyr::summarise( qtde = n_distinct(name), media_imc = mean(imc) ) %>% dplyr::select(species, qtde, media_imc) %>% dplyr::arrange(media_imc) ``` ``` ## # A tibble: 11 x 3 ## species qtde media_imc ## <chr> <int> <dbl> ## 1 Gungan 1 0.00172 ## 2 Twi'lek 1 0.00174 ## 3 Mirialan 2 0.00188 ## 4 Cerean 1 0.00209 ## 5 Wookiee 1 0.00215 ## 6 Kel Dor 1 0.00226 ## 7 Human 18 0.00253 ## 8 Mon Calamari 1 0.00256 ## 9 Ewok 1 0.00258 ## 10 Zabrak 1 0.00261 ## 11 Trandoshan 1 0.00313 ``` --- # Exemplos * E porque usar os `::`? * Os `::` acesssam funções diretamente do pacote. * O `dplyr`, na verdade, é a nova versão do `plyr`, focada em data.frames. * Eles têm funções com o mesmo nome. ```r plyr::summarise() dplyr::summarise() ``` * Como posso ver o que está em conflito no meu ambiente? ```r conflicts() %>% head(10) ``` ``` ## [1] "%>%" "filter" "lag" "iris" "body<-" ## [6] "intersect" "kronecker" "setdiff" "setequal" "union" ``` --- # Joins > Uniões de bases através de chaves. <p> </p> * `left_join()`: dados que estão na base "à esquerda". * `right_join()`: dados que estão na base "à direita". * `inner_join()`: dados que estão em ambas as bases. * `anti_join()`: linhas que estão apenas em uma base, removendo a intersecção. * `full_join()`: todas as linhas. --- <img src="img/joins.png" width="60%" style="display: block; margin: auto;" /> --- # Exemplo ```r bd_1 <- starwars %>% filter(height < 165) %>% select(name, height) bd_1 %>% head() ``` ``` ## # A tibble: 6 x 2 ## name height ## <chr> <int> ## 1 R2-D2 96 ## 2 Leia Organa 150 ## 3 R5-D4 97 ## 4 Yoda 66 ## 5 Mon Mothma 150 ## 6 Wicket Systri Warrick 88 ``` ```r dim(bd_1) ``` ``` ## [1] 16 2 ``` --- # Exemplo ```r bd_2 <- starwars %>% filter(mass < 100) %>% select(name, mass) bd_2 %>% head() ``` ``` ## # A tibble: 6 x 2 ## name mass ## <chr> <dbl> ## 1 Luke Skywalker 77. ## 2 C-3PO 75. ## 3 R2-D2 32. ## 4 Leia Organa 49. ## 5 Beru Whitesun lars 75. ## 6 R5-D4 32. ``` ```r dim(bd_2) ``` ``` ## [1] 49 2 ``` --- # Exemplo ```r dplyr::left_join(bd_1, bd_2, by = "name") ``` ``` ## # A tibble: 16 x 3 ## name height mass ## <chr> <int> <dbl> ## 1 R2-D2 96 32. ## 2 Leia Organa 150 49. ## 3 R5-D4 97 32. ## 4 Yoda 66 17. ## 5 Mon Mothma 150 NA ## 6 Wicket Systri Warrick 88 20. ## 7 Nien Nunb 160 68. ## 8 Watto 137 NA ## 9 Sebulba 112 40. ## 10 Shmi Skywalker 163 NA ## 11 Dud Bolt 94 45. ## 12 Gasgano 122 NA ## 13 Ben Quadinaros 163 65. ## 14 Cordé 157 NA ## 15 Ratts Tyerell 79 15. ## 16 R4-P17 96 NA ``` --- # Exemplo ```r dplyr::inner_join(bd_1, bd_2, by = "name") ``` ``` ## # A tibble: 10 x 3 ## name height mass ## <chr> <int> <dbl> ## 1 R2-D2 96 32. ## 2 Leia Organa 150 49. ## 3 R5-D4 97 32. ## 4 Yoda 66 17. ## 5 Wicket Systri Warrick 88 20. ## 6 Nien Nunb 160 68. ## 7 Sebulba 112 40. ## 8 Dud Bolt 94 45. ## 9 Ben Quadinaros 163 65. ## 10 Ratts Tyerell 79 15. ``` --- # Exemplo ```r dplyr::full_join(bd_1, bd_2, by = "name") ``` ``` ## # A tibble: 55 x 3 ## name height mass ## <chr> <int> <dbl> ## 1 R2-D2 96 32. ## 2 Leia Organa 150 49. ## 3 R5-D4 97 32. ## 4 Yoda 66 17. ## 5 Mon Mothma 150 NA ## 6 Wicket Systri Warrick 88 20. ## 7 Nien Nunb 160 68. ## 8 Watto 137 NA ## 9 Sebulba 112 40. ## 10 Shmi Skywalker 163 NA ## # ... with 45 more rows ``` --- class: center, middle <img src="img/dplyr.png" width="35%" style="display: block; margin: auto;" /> --- class: center, middle # Obrigada!