Help functions do dplyr

Este post supõe que estamos minimamente familiarizados com o pacote dplyr (se você não está, veja este post), especialmente com a função select e com o pipe.

O dplyr traz algumas funções que podem ser muito úteis em algum momento de nossa manipulação de dados com o select, que são as help functions. Essas funções são, na verdade, do pacote tidyselect, mas são disponibilizadas ao ativar o dplyr (melhor ainda seria ativar o tidyverse). São elas:

  • starts_with, ends_with, contains: selecionam colunas que começam com, terminam com ou contenham um string

  • matches: faz a correspondência com uma expressão regular (regex).

  • num_range: seleciona colunas que contenham números em sequência.

  • one_of: seleciona variáveis num vetor.

  • everything: seleciona todas as colunas.

Exemplos

Novamente vamos usar o dataset starwars. Vejamos o tibble:

require(tidyverse)

starwars
## # A tibble: 87 x 13
##    name  height  mass hair_color skin_color eye_color birth_year gender
##    <chr>  <int> <dbl> <chr>      <chr>      <chr>          <dbl> <chr> 
##  1 Luke~    172    77 blond      fair       blue            19   male  
##  2 C-3PO    167    75 <NA>       gold       yellow         112   <NA>  
##  3 R2-D2     96    32 <NA>       white, bl~ red             33   <NA>  
##  4 Dart~    202   136 none       white      yellow          41.9 male  
##  5 Leia~    150    49 brown      light      brown           19   female
##  6 Owen~    178   120 brown, gr~ light      blue            52   male  
##  7 Beru~    165    75 brown      light      blue            47   female
##  8 R5-D4     97    32 <NA>       white, red red             NA   <NA>  
##  9 Bigg~    183    84 black      light      brown           24   male  
## 10 Obi-~    182    77 auburn, w~ fair       blue-gray       57   male  
## # ... with 77 more rows, and 5 more variables: homeworld <chr>,
## #   species <chr>, films <list>, vehicles <list>, starships <list>

Podemos selecionar colunas que comecem com a letra “h”:

starwars %>% 
  select(starts_with("h"))
## # A tibble: 87 x 3
##    height hair_color    homeworld
##     <int> <chr>         <chr>    
##  1    172 blond         Tatooine 
##  2    167 <NA>          Tatooine 
##  3     96 <NA>          Naboo    
##  4    202 none          Tatooine 
##  5    150 brown         Alderaan 
##  6    178 brown, grey   Tatooine 
##  7    165 brown         Tatooine 
##  8     97 <NA>          Tatooine 
##  9    183 black         Tatooine 
## 10    182 auburn, white Stewjon  
## # ... with 77 more rows

Selecionaremos agora colunas que terminem com a palavra “color”:

starwars %>% 
  select(ends_with("color"))
## # A tibble: 87 x 3
##    hair_color    skin_color  eye_color
##    <chr>         <chr>       <chr>    
##  1 blond         fair        blue     
##  2 <NA>          gold        yellow   
##  3 <NA>          white, blue red      
##  4 none          white       yellow   
##  5 brown         light       brown    
##  6 brown, grey   light       blue     
##  7 brown         light       blue     
##  8 <NA>          white, red  red      
##  9 black         light       brown    
## 10 auburn, white fair        blue-gray
## # ... with 77 more rows

Vamos selecionar colunas que contenham algum caracter + “t” + algum caracter, através da regex ".t.":

starwars %>% 
  select(matches(".t."))
## # A tibble: 87 x 2
##    birth_year starships
##         <dbl> <list>   
##  1       19   <chr [2]>
##  2      112   <chr [0]>
##  3       33   <chr [0]>
##  4       41.9 <chr [1]>
##  5       19   <chr [0]>
##  6       52   <chr [0]>
##  7       47   <chr [0]>
##  8       NA   <chr [0]>
##  9       24   <chr [1]>
## 10       57   <chr [5]>
## # ... with 77 more rows

Se tivermos um vetor com os nomes das colunas a serem selecionadas, utilizamos one_of:

nomes <- names(starwars)[1:5]

starwars %>% 
  select(one_of(nomes))
## # A tibble: 87 x 5
##    name               height  mass hair_color    skin_color 
##    <chr>               <int> <dbl> <chr>         <chr>      
##  1 Luke Skywalker        172    77 blond         fair       
##  2 C-3PO                 167    75 <NA>          gold       
##  3 R2-D2                  96    32 <NA>          white, blue
##  4 Darth Vader           202   136 none          white      
##  5 Leia Organa           150    49 brown         light      
##  6 Owen Lars             178   120 brown, grey   light      
##  7 Beru Whitesun lars    165    75 brown         light      
##  8 R5-D4                  97    32 <NA>          white, red 
##  9 Biggs Darklighter     183    84 black         light      
## 10 Obi-Wan Kenobi        182    77 auburn, white fair       
## # ... with 77 more rows

A função everything pode ser útil se quisermos colocar alguma coluna como a primeira de nosso tibble:

starwars %>% 
  select(homeworld, everything())
## # A tibble: 87 x 13
##    homeworld name  height  mass hair_color skin_color eye_color birth_year
##    <chr>     <chr>  <int> <dbl> <chr>      <chr>      <chr>          <dbl>
##  1 Tatooine  Luke~    172    77 blond      fair       blue            19  
##  2 Tatooine  C-3PO    167    75 <NA>       gold       yellow         112  
##  3 Naboo     R2-D2     96    32 <NA>       white, bl~ red             33  
##  4 Tatooine  Dart~    202   136 none       white      yellow          41.9
##  5 Alderaan  Leia~    150    49 brown      light      brown           19  
##  6 Tatooine  Owen~    178   120 brown, gr~ light      blue            52  
##  7 Tatooine  Beru~    165    75 brown      light      blue            47  
##  8 Tatooine  R5-D4     97    32 <NA>       white, red red             NA  
##  9 Tatooine  Bigg~    183    84 black      light      brown           24  
## 10 Stewjon   Obi-~    182    77 auburn, w~ fair       blue-gray       57  
## # ... with 77 more rows, and 5 more variables: gender <chr>,
## #   species <chr>, films <list>, vehicles <list>, starships <list>

Iremos criar um tibble para poder mostrar o uso de num_range:

dados <- tibble(x1 = 1:10, x2 = letters[1:10], valor = 11:20)

dados %>% 
  select(num_range("x", 1:2))
## # A tibble: 10 x 2
##       x1 x2   
##    <int> <chr>
##  1     1 a    
##  2     2 b    
##  3     3 c    
##  4     4 d    
##  5     5 e    
##  6     6 f    
##  7     7 g    
##  8     8 h    
##  9     9 i    
## 10    10 j

Também podemos juntar várias funções auxiliares dentro de um mesmo select. Vamos selecionar colunas que terminam com “color”, contenham a string “es”, e depois todas as outras colunas:

starwars %>% 
  select(name, ends_with("color"), contains("es"), everything())
## # A tibble: 87 x 13
##    name  hair_color skin_color eye_color species vehicles height  mass
##    <chr> <chr>      <chr>      <chr>     <chr>   <list>    <int> <dbl>
##  1 Luke~ blond      fair       blue      Human   <chr [2~    172    77
##  2 C-3PO <NA>       gold       yellow    Droid   <chr [0~    167    75
##  3 R2-D2 <NA>       white, bl~ red       Droid   <chr [0~     96    32
##  4 Dart~ none       white      yellow    Human   <chr [0~    202   136
##  5 Leia~ brown      light      brown     Human   <chr [1~    150    49
##  6 Owen~ brown, gr~ light      blue      Human   <chr [0~    178   120
##  7 Beru~ brown      light      blue      Human   <chr [0~    165    75
##  8 R5-D4 <NA>       white, red red       Droid   <chr [0~     97    32
##  9 Bigg~ black      light      brown     Human   <chr [0~    183    84
## 10 Obi-~ auburn, w~ fair       blue-gray Human   <chr [1~    182    77
## # ... with 77 more rows, and 5 more variables: birth_year <dbl>,
## #   gender <chr>, homeworld <chr>, films <list>, starships <list>

De se tornar um novo jediR, um passo mais próximo você está!