11 tidyr e dplyr

este capítulo está em construção. O que segue abaixo é apenas um rascunho.

11.1 Introdução

Neste capítulo, descreverei os fundamentos e operações da manipulação de dados. Falo como aplicá-las usando os pacotes “dplyr” e “tidyr”.

11.2 Importing e Wrangling

11.2.1 Importing

Não tem muito erro, tem que saber como são os formatos de arquivo que existem. Veja o ex 5 da lista 4 do trainee.

Cada arquivo, a depender do seu tipo, tem configurações diferentes. Ex: um arquivo CSV pode ser separado por , ou ;, qual a planilha quista de um .xlsx. Esse tipo de configuração precisa ser passada para a função que lê o arquivo.

Também podemos estar interessados em:

  • Pular linhas e colunas.
  • Definir tipos das colunas.
  • Especificar o que define strings (ex ' ou "), comentários (ex #), e valores NA.

11.2.2 Tidy Data

Antes de falar sobre tidying, vamos falar sobre o que é um dataset tidy.

Veja a aula 4 do trainee.

Para ciência de dados, será útil utilizar uma organização específica, chamada de “tidy dataset”. Três regras a definem:

  • Cada variável deve ter sua própria coluna.
  • Cada observação deve ter sua própria linha.
  • Cada valor deve ter sua própria célula.

11.2.3 Tidy Data

Quais os benefícios?

  • A consistência de utilizar uma mesma organização, independente de qual, é muito útil, especialmente porque facilita entender as ferramentas que trabalharão com ela.
  • A arrumação tidy é intuitiva, e é utilizada de maneira muito natural nas ferramentas, muitaz vezes vetorizadas, de visualização e modelagem.

11.2.4 Tidying

  1. Agora que já entendemos o que é tidy data, podemos adquirir a habilidade de olhar para um dataset e, sabendo onde queremos chegar, elencar quais são as alterações a serem feitas.
  2. Após elencar quais alterações devem ser feitas, é simples fazer a ponte de quais manipulações de dados você quer fazer – “subset linhas” e “separar colunas”.
  3. Por fim, só falta relembrar como é o código que aplica essa manipulação. Essa é a parte mais simples! É só voltar na aula passada, pesquisar na internet, ver no chat, ou perguntar para o seu amigo preferido!

11.2.5 Tidying: Básico

11.2.6 Tidying: NAs

11.2.7 Tidying: Pivot

11.2.8 Tidying: Pivot

11.2.9 Tidying: Merge

11.2.10 Tidying: Receita

Qual foi a receitinha de bolo que aprendemos? (hmm bolo 😋). Recebemos um dataset, e:

  • Arrumar os dados para o formato data frame.
    • Todas as colunas são homogêneas?
      • Remover linhas “ruins”, converter valores.
    • Todas as colunas são do mesmo tamanho?
      • Remover linhas “ruins”.

11.2.11 Tidying: Receita

  • Arrumar os dados para o formato tidy.
    • Toda coluna é uma variável?
      • Remover colunas “ruins”.
      • Separar/unir colunas colunas.
    • Toda linha é uma observação?
      • Quais são as variáveis que definem uma observação?
      • Pivot e melt.

11.2.12 Tidying: Receita

  • Dados NA.
    • Transformar dados “ruins” em NA.
    • Lidar com dados NA.
  • Tenho mais de um dataset? Deixá-los tidy e então realizaram algum merge.

11.2.13 Transforming

Após arrumarmos um dataset, ainda aplicaremos transformações com base nas demandas da fase de visualização e modelagem.

  • Manipular linhas.
    • Sorting.
    • Sampling.
    • Filtrar observações.

11.2.14 Transforming

  • Transformar/criar colunas:
    • Alterar a unidade de uma variável.
    • Normalizar variáveis.
    • Agrupar as categorias de uma variável categórica.
    • Corrigir/formatar texto de variáveis string.
    • Manipular datas.
    • Criar novas colunas a partir de operações com múltiplas outras.
    • Criar uma coluna para ajudar em um plot.

11.3 tidyr

O tidyr existe “to help you create tidy data”.

Veja:

Aqui, temos as caixinhas:

  • Reshape (pivot)
  • Separate/unite
  • NA handling (+ complete)
  • Outros: lists to dataframes (unnest)

11.3.1 Separate

df <- tibble(id = 1:3, x = c("m-123", "f-455", "f-123"))

df %>% separate_wider_delim(x, delim = "-", names = c("gender", "unit"))
df %>% separate_wider_position(x, c(gender = 1, 1, unit = 3))
df %>% separate_wider_regex(x, c(gender = ".", ".", unit = "\\d+"))
#> # A tibble: 3 × 3
#>      id gender unit 
#>   <int> <chr>  <chr>
#> 1     1 m      123  
#> 2     2 f      455  
#> 3     3 f      123

11.3.2 NA Handling 1

df <- tibble(x = c(1, 2, NA), y = c("a", NA, "b"))

df %>% drop_na(x)
#> # A tibble: 2 × 2
#>       x y
#>   <dbl> <chr>
#> 1     1 a
#> 2     2 NA

df %>% replace_na(list(x = 0, y = "unknown"))
#> # A tibble: 3 × 2
#>       x y
#>   <dbl> <chr>
#> 1     1 a
#> 2     2 unknown
#> 3     0 b

df %>% fill(x, y)
#> # A tibble: 3 × 2
#>       x y
#>   <dbl> <chr>
#> 1     1 a
#> 2     2 a
#> 3     2 b

11.3.3 NA Handling 2

Complete: explicitar valores faltantes

df %>% complete(x, y)
#> # A tibble: 9 × 2
#>       x y
#>   <dbl> <chr>
#> 1     1 a
#> 2     1 b
#> 3     1 NA
#> 4     2 a
#> 5     2 b
#> 6     2 NA
#> 7    NA a
#> 8    NA b
#> 9    NA NA

11.3.4 Reshape

Veja o artigo Pivoting.

Exemplos no R.

11.4 dplyr

O dplyr é “a grammar of data manipulation, providing a consistent set of verbs that help you solve the most common data manipulation challenges”.

Veja:

Aqui, temos as caixinhas:

  • Subset
  • Operate
  • Reorder
  • Rename
  • Combine
  • Summarize
  • E tudo isso com groups

11.4.1 Subset - Linhas

filter():

starwars %>% filter(mass > mean(mass, na.rm = TRUE))

Casos especiais:

starwars %>% filter(n() %in% 1:10)
starwars %>% slice(1:10)
starwars %>% filter(!duplicated(mass))
starwars %>% distinct(mass, .keep_all = TRUE)

11.4.2 Subset - Colunas

select():

starwars %>% select(homeworld, height, mass)

Permite usar vários selection helpers:

starwars %>% select(name:mass)
starwars %>% select(!(name:mass))
iris %>% select(starts_with("Petal") & ends_with("Width"))

11.4.3 Operate

mutate():

starwars %>%
  mutate(
    mass2 = mass * 2,
    mass2_squared = mass2 ^ 2
  )

rows_*():

data <- tibble(a = 1:3, b = letters[1:3], c = 0.5 + 0:2)
rows_insert(data, tibble(a = 4, b = "z"))
#> # A tibble: 4 × 3
#>       a b         c
#>   <int> <chr> <dbl>
#> 1     1 a       0.5
#> 2     2 b       1.5
#> 3     3 NA      2.5
#> 4     4 z      NA 

11.4.4 Reorder

arrange():

by_cyl %>% arrange(wt)
by_cyl %>% arrange(desc(wt))

select() funciona! Mas também temos relocate():

mtcars %>% relocate(vs:gear, .before = cyl)

11.4.5 Rename

A filosofia do tidyverse é não utilizar rownames (“metadata is data”). Portanto, temos funções para renomear colunas, rename() e rename_with():

rename(iris, petal_length = Petal.Length)
rename_with(iris, toupper)

11.4.6 Summarize

summarise(), resumir toda a informação em uma linha:

mtcars %>% summarise(mean = mean(disp), n = n())
#>       mean  n
#> 1 230.7219 32

reframe() mais raro, mais de uma linha de resumo:

mtcars %>% reframe(mean = quantile(disp, c(0.25, 0.75)), n = n())
#>      mean  n
#> 1 120.825 32
#> 2 326.000 32

11.4.7 Combine

cbind() une as colunas de dois dataframes com as “mesmas” linhas. rbind une as linhas de dois dataframes com as “mesmas” colunas.

bind_cols() e bind_rows() são as versões do dplyr, e unem qualquer quantidade de dataframes.

E se as linhas não forem as mesmas? Precisamos de um merge/join: inner_join(), left_join(), right_join(), full_join().

11.4.8 Across

Como visto em select(), temos uma série de tidyverse selection helpers que podem ser utilizados para selecionar colunas.

Esses mesmos seletores podem ser utilizados em outros verbos, via across():

mtcars %>% filter(if_all(mpg:cyl, ~ .x > mean(.x)))
mtcars %>% mutate(across(everything(), as.character()))
mtcars %>% mutate(across(where(~ sum(.x) > 100), ~ .x - 100))

11.4.9 Groups

mtcars %>%
    split(.$cyl) %>%
    purrr:::map_dfr(~ c(cyl = unique(.x$cyl), disp = mean(.x$disp)))
mtcars %>%
    group_by(cyl) %>%
    summarise(mean = mean(disp))

Um grupo pra cada linha: rowwise().

11.4.10 eval_tidy

Lembre de with e rlang::eval_tidy:

mtcars %>%
    with(cyl + disp)

Complemento

Recapitulando


Dicionário de Funções


Referências


Exercícios

@@bs4-math@@