Extrair head e tail de um dataset ao mesmo tempo

Oi, pessoal!

Tenho uma dúvida: existe alguma função que possibilite extrair head e tail de um dataset ao mesmo tempo? Atualmente eu uso o código abaixo para fazer esse trabalho, mas seria muito útil conseguir selecionar tanto os melhores registros de uma váriável quanto os piores de uma só vez.

library(tidyverse)

best_mpg <- mtcars %>% 
  arrange(-mpg) %>% 
  slice_head(n = 10)

worst_mpg <- mtcars %>% 
  arrange(-mpg) %>% 
  slice_tail(n = 10)

bind_rows(best_mpg, worst_mpg)
#>                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> Toyota Corolla      33.9   4  71.1  65 4.22 1.835 19.90  1  1    4    1
#> Fiat 128            32.4   4  78.7  66 4.08 2.200 19.47  1  1    4    1
#> Honda Civic         30.4   4  75.7  52 4.93 1.615 18.52  1  1    4    2
#> Lotus Europa        30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
#> Fiat X1-9           27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#> Porsche 914-2       26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
#> Merc 240D           24.4   4 146.7  62 3.69 3.190 20.00  1  0    4    2
#> Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#> Merc 230            22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
#> Toyota Corona       21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
#> Ford Pantera L      15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
#> Dodge Challenger    15.5   8 318.0 150 2.76 3.520 16.87  0  0    3    2
#> Merc 450SLC         15.2   8 275.8 180 3.07 3.780 18.00  0  0    3    3
#> AMC Javelin         15.2   8 304.0 150 3.15 3.435 17.30  0  0    3    2
#> Maserati Bora       15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
#> Chrysler Imperial   14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
#> Duster 360          14.3   8 360.0 245 3.21 3.570 15.84  0  0    3    4
#> Camaro Z28          13.3   8 350.0 245 3.73 3.840 15.41  0  0    3    4
#> Cadillac Fleetwood  10.4   8 472.0 205 2.93 5.250 17.98  0  0    3    4
#> Lincoln Continental 10.4   8 460.0 215 3.00 5.424 17.82  0  0    3    4

Created on 2021-04-04 by the reprex package (v1.0.0)

Oi Brunna!

Uma forma de fazer isso é com a função dplyr::slice(). Considerei o head e tail como as 6 primeiras e 6 últimas linhas.

Adicionei uma linha que não era necessária mas que ajuda a visualizar que a resolução funcionou:
tibble::rowid_to_column() %>% # Essa linha é apenas para colocar o número da linha na base como uma variável.

library(magrittr)
mtcars %>% 
  tibble::rowid_to_column() %>% 
  dplyr::slice(1:6,(dplyr::n()-6):dplyr::n())
#>    rowid  mpg cyl  disp  hp drat    wt  qsec vs am gear carb
#> 1      1 21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
#> 2      2 21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
#> 3      3 22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
#> 4      4 21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
#> 5      5 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
#> 6      6 18.1   6 225.0 105 2.76 3.460 20.22  1  0    3    1
#> 7     26 27.3   4  79.0  66 4.08 1.935 18.90  1  1    4    1
#> 8     27 26.0   4 120.3  91 4.43 2.140 16.70  0  1    5    2
#> 9     28 30.4   4  95.1 113 3.77 1.513 16.90  1  1    5    2
#> 10    29 15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
#> 11    30 19.7   6 145.0 175 3.62 2.770 15.50  0  1    5    6
#> 12    31 15.0   8 301.0 335 3.54 3.570 14.60  0  1    5    8
#> 13    32 21.4   4 121.0 109 4.11 2.780 18.60  1  1    4    2

Created on 2021-04-06 by the reprex package (v1.0.0)

Existem algumas funções como slice(). Recomendo dar uma olhada na documentação: https://dplyr.tidyverse.org/reference/slice.html

1 curtida

Outra alternativa (podem me julgar) é transformar para um data.table

library(tidyverse)
diamonds %>% 
  data.table::data.table()
#>        carat       cut color clarity depth table price    x    y    z
#>     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
#>    ---                                                               
#> 53936:  0.72     Ideal     D     SI1  60.8    57  2757 5.75 5.76 3.50
#> 53937:  0.72      Good     D     SI1  63.1    55  2757 5.69 5.75 3.61
#> 53938:  0.70 Very Good     D     SI1  62.8    60  2757 5.66 5.68 3.56
#> 53939:  0.86   Premium     H     SI2  61.0    58  2757 6.15 6.12 3.74
#> 53940:  0.75     Ideal     D     SI2  62.2    55  2757 5.83 5.87 3.64

Created on 2021-04-11 by the reprex package (v2.0.0)

1 curtida