Transformação de Dados

Ciência de dados
R
Tidyverse
Transformação de dados
Manipulação e transformação de dados com as funções principais do Tidyverse, incluindo dplyr e tidyr.

Após importar uma base de dados para o R, os pacotes dplyr e tidyr são essenciais para transformação de data frames. As funções desses pacotes ajudam na análise, modelagem e comunicação de dados. Neste seção são apresentadas as principais funções para transformar observações (linhas) e variáveis em um data frame a partir de uma ou mais tabelas. A Cheatsheets do dplyr apresenta outros recursos não discutidos nesta seção.

1 Ordenando as linhas: funções arrange() e desc()

As funções arrange() e desc() permitem ordenar a base de dados com base nos valores de uma ou mais colunas. Usará-se o conjunto de dados iris como exemplo.

Carregue os pacote dplyr, tidyr e readr.

library(dplyr)
library(tidyr)
library(readr)

Para carregar e visualizar as primeiras linhas da base de dados iris:

data("iris")
head(iris, 10)
   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1           5.1         3.5          1.4         0.2  setosa
2           4.9         3.0          1.4         0.2  setosa
3           4.7         3.2          1.3         0.2  setosa
4           4.6         3.1          1.5         0.2  setosa
5           5.0         3.6          1.4         0.2  setosa
6           5.4         3.9          1.7         0.4  setosa
7           4.6         3.4          1.4         0.3  setosa
8           5.0         3.4          1.5         0.2  setosa
9           4.4         2.9          1.4         0.2  setosa
10          4.9         3.1          1.5         0.1  setosa

Para ordenar a tabela pela coluna Sepal.Length em ordem crescente:

iris |> 
  arrange(Sepal.Length)

Para ordenar em ordem decrescente:

iris |> 
  arrange(desc(Sepal.Length))

É possível também combinar duas colunas, ordenando a tabela pela coluna Species (em ordem alfabética decrescente) e Sepal.Length (em ordem crescente):

iris |> 
  arrange(desc(Species), Sepal.Length)

Para criar um novo objeto com a tabela ordenada

iris_ordenado <- iris |> 
  arrange(Sepal.Length)

iris_ordenado

2 Filtrando linhas: função filter()

A função filter() extrai linhas que satisfazem uma condição lógica. Para filtrar as linhas referentes à espécie virginica:

iris |> 
  filter(Species == "virginica")

Para filtrar espécies diferentes de virginica.

iris |> 
  filter(Species != "virginica")

Para filtrar linhas onde o comprimento das pétalas seja menor que \(1.3\):

iris |> 
  filter(Petal.Length < 1.3)

Para filtrar onde o comprimento das pétalas seja menor que \(1.3\) e o comprimento das sépalas seja maior ou igual a \(5\):

iris |> 
  filter(Petal.Length < 1.3 & Sepal.Length >= 5)

3 Selecionando colunas: função select()

A função select() permite extrair ou reorganizar um subconjunto de colunas de um data frame.

Para extrair uma coluna:

iris |> 
  select(Petal.Length)

Para extrair múltiplas colunas:

iris |> 
  select(Petal.Length, Species)

Para extrair um intervalo de colunas:

iris |> 
  select(Petal.Length:Species)

Para excluir uma coluna:

iris |> 
  select(-Petal.Length)

Para excluir colunas específicas:

iris |> 
  select(!c(Petal.Length, Species))

Para selecionar colunas que começam com “Sepal”:

iris |> 
  select(starts_with("Sepal"))

Para combinar filter() e select() a fim de extrair um subconjunto do data frame:

iris |> 
  select(starts_with("Sepal")) |> 
  filter(Sepal.Length <= 4.5)

3.1 Selecionando/Excluindo variáveis numéricas e categóricas

Importe o conjuntoi de dados Reservatorios_Parana_parcial.csv:

res = read_delim(file = "https://raw.githubusercontent.com/FCopf/datasets/refs/heads/main/Reservatorios_Parana_parcial.csv",
                  delim = ',',
                  locale = locale(decimal_mark = '.',
                                  encoding = 'latin1'))

3.1.1 Seleção de variáveis categóricas

res |>
  select(Reservatorio, Bacia, Trofia)
# A tibble: 31 × 3
   Reservatorio Bacia  Trofia       
   <chr>        <chr>  <chr>        
 1 Cavernoso    Iguacu Oligotrófico
 2 Curucaca     Iguacu Oligotrófico
 3 Foz do Areia Iguacu Oligotrófico
 4 Irai         Iguacu Eutrófico   
 5 JMF          Iguacu Mesotrófico 
 6 Jordao       Iguacu Oligotrófico
 7 Passauna     Iguacu Oligotrófico
 8 Piraquara    Iguacu Oligotrófico
 9 Salto Caxias Iguacu Oligotrófico
10 Salto do Vau Iguacu Oligotrófico
# ℹ 21 more rows
res |>
  select(where(is.character))
# A tibble: 31 × 3
   Reservatorio Bacia  Trofia       
   <chr>        <chr>  <chr>        
 1 Cavernoso    Iguacu Oligotrófico
 2 Curucaca     Iguacu Oligotrófico
 3 Foz do Areia Iguacu Oligotrófico
 4 Irai         Iguacu Eutrófico   
 5 JMF          Iguacu Mesotrófico 
 6 Jordao       Iguacu Oligotrófico
 7 Passauna     Iguacu Oligotrófico
 8 Piraquara    Iguacu Oligotrófico
 9 Salto Caxias Iguacu Oligotrófico
10 Salto do Vau Iguacu Oligotrófico
# ℹ 21 more rows

3.1.2 Seleção de variáveis numéricas

res |>
  select(Fechamento, Area, pH, Condutividade, Alcalinidade, P.total, Riqueza, CPUE)
# A tibble: 31 × 8
   Fechamento   Area    pH Condutividade Alcalinidade P.total Riqueza  CPUE
        <dbl>  <dbl> <dbl>         <dbl>        <dbl>   <dbl>   <dbl> <dbl>
 1       1965   2.9    7.4          33.1        140.      7.8      18  9.22
 2       1982   2      7            32.4        126.      4.7      16 28.7 
 3       1980 139      7.3          35.5         97      14.3      19 11.6 
 4       2000  15      6.9          50.2          3.3    53.4      12 30.8 
 5       1970   0.45   7.3          40.2          3.7    41.2      18  5.95
 6       1996   3.4    7.1          23.7        153.      3.3      17  7.75
 7       1978  14      8.8         126.         526      15.2      11  7.51
 8       1979   3.3    7.1          22.8         50.7     4.5       8  4.01
 9       1998 124      7.3          39.6        106      12.1      21 20.8 
10       1959   2.9    6.5          23.2        279      11         8  2.43
# ℹ 21 more rows
res |>
  select(Fechamento, Area, pH:CPUE)
# A tibble: 31 × 8
   Fechamento   Area    pH Condutividade Alcalinidade P.total Riqueza  CPUE
        <dbl>  <dbl> <dbl>         <dbl>        <dbl>   <dbl>   <dbl> <dbl>
 1       1965   2.9    7.4          33.1        140.      7.8      18  9.22
 2       1982   2      7            32.4        126.      4.7      16 28.7 
 3       1980 139      7.3          35.5         97      14.3      19 11.6 
 4       2000  15      6.9          50.2          3.3    53.4      12 30.8 
 5       1970   0.45   7.3          40.2          3.7    41.2      18  5.95
 6       1996   3.4    7.1          23.7        153.      3.3      17  7.75
 7       1978  14      8.8         126.         526      15.2      11  7.51
 8       1979   3.3    7.1          22.8         50.7     4.5       8  4.01
 9       1998 124      7.3          39.6        106      12.1      21 20.8 
10       1959   2.9    6.5          23.2        279      11         8  2.43
# ℹ 21 more rows
res |>
  select(where(is.numeric))
# A tibble: 31 × 8
   Fechamento   Area    pH Condutividade Alcalinidade P.total Riqueza  CPUE
        <dbl>  <dbl> <dbl>         <dbl>        <dbl>   <dbl>   <dbl> <dbl>
 1       1965   2.9    7.4          33.1        140.      7.8      18  9.22
 2       1982   2      7            32.4        126.      4.7      16 28.7 
 3       1980 139      7.3          35.5         97      14.3      19 11.6 
 4       2000  15      6.9          50.2          3.3    53.4      12 30.8 
 5       1970   0.45   7.3          40.2          3.7    41.2      18  5.95
 6       1996   3.4    7.1          23.7        153.      3.3      17  7.75
 7       1978  14      8.8         126.         526      15.2      11  7.51
 8       1979   3.3    7.1          22.8         50.7     4.5       8  4.01
 9       1998 124      7.3          39.6        106      12.1      21 20.8 
10       1959   2.9    6.5          23.2        279      11         8  2.43
# ℹ 21 more rows

3.2 Exclusão de variáveis

res |>
  select(-Fechamento, -Area)
# A tibble: 31 × 9
   Reservatorio Bacia  Trofia      pH Condutividade Alcalinidade P.total Riqueza
   <chr>        <chr>  <chr>    <dbl>         <dbl>        <dbl>   <dbl>   <dbl>
 1 Cavernoso    Iguacu Oligotr…   7.4          33.1        140.      7.8      18
 2 Curucaca     Iguacu Oligotr…   7            32.4        126.      4.7      16
 3 Foz do Areia Iguacu Oligotr…   7.3          35.5         97      14.3      19
 4 Irai         Iguacu Eutróf…   6.9          50.2          3.3    53.4      12
 5 JMF          Iguacu MesotrÃ…   7.3          40.2          3.7    41.2      18
 6 Jordao       Iguacu Oligotr…   7.1          23.7        153.      3.3      17
 7 Passauna     Iguacu Oligotr…   8.8         126.         526      15.2      11
 8 Piraquara    Iguacu Oligotr…   7.1          22.8         50.7     4.5       8
 9 Salto Caxias Iguacu Oligotr…   7.3          39.6        106      12.1      21
10 Salto do Vau Iguacu Oligotr…   6.5          23.2        279      11         8
# ℹ 21 more rows
# ℹ 1 more variable: CPUE <dbl>
res |>
  select(!where(is.numeric))
# A tibble: 31 × 3
   Reservatorio Bacia  Trofia       
   <chr>        <chr>  <chr>        
 1 Cavernoso    Iguacu Oligotrófico
 2 Curucaca     Iguacu Oligotrófico
 3 Foz do Areia Iguacu Oligotrófico
 4 Irai         Iguacu Eutrófico   
 5 JMF          Iguacu Mesotrófico 
 6 Jordao       Iguacu Oligotrófico
 7 Passauna     Iguacu Oligotrófico
 8 Piraquara    Iguacu Oligotrófico
 9 Salto Caxias Iguacu Oligotrófico
10 Salto do Vau Iguacu Oligotrófico
# ℹ 21 more rows
res |>
  select(!where(is.character))
# A tibble: 31 × 8
   Fechamento   Area    pH Condutividade Alcalinidade P.total Riqueza  CPUE
        <dbl>  <dbl> <dbl>         <dbl>        <dbl>   <dbl>   <dbl> <dbl>
 1       1965   2.9    7.4          33.1        140.      7.8      18  9.22
 2       1982   2      7            32.4        126.      4.7      16 28.7 
 3       1980 139      7.3          35.5         97      14.3      19 11.6 
 4       2000  15      6.9          50.2          3.3    53.4      12 30.8 
 5       1970   0.45   7.3          40.2          3.7    41.2      18  5.95
 6       1996   3.4    7.1          23.7        153.      3.3      17  7.75
 7       1978  14      8.8         126.         526      15.2      11  7.51
 8       1979   3.3    7.1          22.8         50.7     4.5       8  4.01
 9       1998 124      7.3          39.6        106      12.1      21 20.8 
10       1959   2.9    6.5          23.2        279      11         8  2.43
# ℹ 21 more rows

4 Outros exemplos de seleção/exclusão de variáveis

4.1 all_off(), any_of(), one_of()

# 1. all_of(): Seleciona todas as colunas mencionadas
res |>
  select(all_of(c('Reservatorio', 'Bacia')))
# A tibble: 31 × 2
   Reservatorio Bacia 
   <chr>        <chr> 
 1 Cavernoso    Iguacu
 2 Curucaca     Iguacu
 3 Foz do Areia Iguacu
 4 Irai         Iguacu
 5 JMF          Iguacu
 6 Jordao       Iguacu
 7 Passauna     Iguacu
 8 Piraquara    Iguacu
 9 Salto Caxias Iguacu
10 Salto do Vau Iguacu
# ℹ 21 more rows
# 2. any_of(): Seleciona qualquer coluna que exista na lista (ignora colunas inexistentes)
res |>
  select(any_of(c('Reservatorio', 'Bacia', 'Turbidez'))) # funciona, any_of() ignora que `Turbidez` não existe
# A tibble: 31 × 2
   Reservatorio Bacia 
   <chr>        <chr> 
 1 Cavernoso    Iguacu
 2 Curucaca     Iguacu
 3 Foz do Areia Iguacu
 4 Irai         Iguacu
 5 JMF          Iguacu
 6 Jordao       Iguacu
 7 Passauna     Iguacu
 8 Piraquara    Iguacu
 9 Salto Caxias Iguacu
10 Salto do Vau Iguacu
# ℹ 21 more rows
res |>
  select(one_of(c('Reservatorio', 'Trofia', 'Turbidez'))) # funciona, one_of() avisa que `Turbidez` não existe
# A tibble: 31 × 2
   Reservatorio Trofia       
   <chr>        <chr>        
 1 Cavernoso    Oligotrófico
 2 Curucaca     Oligotrófico
 3 Foz do Areia Oligotrófico
 4 Irai         Eutrófico   
 5 JMF          Mesotrófico 
 6 Jordao       Oligotrófico
 7 Passauna     Oligotrófico
 8 Piraquara    Oligotrófico
 9 Salto Caxias Oligotrófico
10 Salto do Vau Oligotrófico
# ℹ 21 more rows
# res |>
#   select(Reservatorio, Bacia, Turbidez) # Não funciona, pois `Turbidez` não existe

4.2 contains(), ends_with(), everything(), last_col()

# 3. contains(): Seleciona colunas cujos nomes contêm uma string específica
res |>
  select(contains('to'))
# A tibble: 31 × 3
   Reservatorio Fechamento P.total
   <chr>             <dbl>   <dbl>
 1 Cavernoso          1965     7.8
 2 Curucaca           1982     4.7
 3 Foz do Areia       1980    14.3
 4 Irai               2000    53.4
 5 JMF                1970    41.2
 6 Jordao             1996     3.3
 7 Passauna           1978    15.2
 8 Piraquara          1979     4.5
 9 Salto Caxias       1998    12.1
10 Salto do Vau       1959    11  
# ℹ 21 more rows
# 4. ends_with(): Seleciona colunas que terminam com uma string específica
res |>
  select(ends_with('dade'))
# A tibble: 31 × 2
   Condutividade Alcalinidade
           <dbl>        <dbl>
 1          33.1        140. 
 2          32.4        126. 
 3          35.5         97  
 4          50.2          3.3
 5          40.2          3.7
 6          23.7        153. 
 7         126.         526  
 8          22.8         50.7
 9          39.6        106  
10          23.2        279  
# ℹ 21 more rows
# 5. everything(): Seleciona todas as colunas (pode ser usado para reorganizar)
res |>
  select(Fechamento, pH, everything())
# A tibble: 31 × 11
   Fechamento    pH Reservatorio Bacia    Area Trofia Condutividade Alcalinidade
        <dbl> <dbl> <chr>        <chr>   <dbl> <chr>          <dbl>        <dbl>
 1       1965   7.4 Cavernoso    Iguacu   2.9  Oligo…          33.1        140. 
 2       1982   7   Curucaca     Iguacu   2    Oligo…          32.4        126. 
 3       1980   7.3 Foz do Areia Iguacu 139    Oligo…          35.5         97  
 4       2000   6.9 Irai         Iguacu  15    EutrÃ…          50.2          3.3
 5       1970   7.3 JMF          Iguacu   0.45 Mesot…          40.2          3.7
 6       1996   7.1 Jordao       Iguacu   3.4  Oligo…          23.7        153. 
 7       1978   8.8 Passauna     Iguacu  14    Oligo…         126.         526  
 8       1979   7.1 Piraquara    Iguacu   3.3  Oligo…          22.8         50.7
 9       1998   7.3 Salto Caxias Iguacu 124    Oligo…          39.6        106  
10       1959   6.5 Salto do Vau Iguacu   2.9  Oligo…          23.2        279  
# ℹ 21 more rows
# ℹ 3 more variables: P.total <dbl>, Riqueza <dbl>, CPUE <dbl>
# 6. last_col(): Seleciona a última coluna
res |>
  select(last_col())
# A tibble: 31 × 1
    CPUE
   <dbl>
 1  9.22
 2 28.7 
 3 11.6 
 4 30.8 
 5  5.95
 6  7.75
 7  7.51
 8  4.01
 9 20.8 
10  2.43
# ℹ 21 more rows

4.3 Expressoes regulares

# 7. matches(): Seleciona colunas que correspondem a uma expressão regular
res |>
  select(matches('^[FA]')) # Colunas que começam com 'F ou A'
# A tibble: 31 × 3
   Fechamento   Area Alcalinidade
        <dbl>  <dbl>        <dbl>
 1       1965   2.9         140. 
 2       1982   2           126. 
 3       1980 139            97  
 4       2000  15             3.3
 5       1970   0.45          3.7
 6       1996   3.4         153. 
 7       1978  14           526  
 8       1979   3.3          50.7
 9       1998 124           106  
10       1959   2.9         279  
# ℹ 21 more rows
# 8. Seleciona colunas cujos nomes:
# 1. Começam com a letra "A" ou "C"
# 2. Podem conter qualquer sequência de caracteres após a primeira letra
# 3. Terminam com as letras "a" ou "e"
res |>
  select(matches('^[AC].*[ae]$'))
# A tibble: 31 × 4
     Area Condutividade Alcalinidade  CPUE
    <dbl>         <dbl>        <dbl> <dbl>
 1   2.9           33.1        140.   9.22
 2   2             32.4        126.  28.7 
 3 139             35.5         97   11.6 
 4  15             50.2          3.3 30.8 
 5   0.45          40.2          3.7  5.95
 6   3.4           23.7        153.   7.75
 7  14            126.         526    7.51
 8   3.3           22.8         50.7  4.01
 9 124             39.6        106   20.8 
10   2.9           23.2        279    2.43
# ℹ 21 more rows

5 Renomeando colunas

res |>
  rename(Fosforo_total = P.total,
         Captura_kg = CPUE)
# A tibble: 31 × 11
   Reservatorio Bacia  Fechamento   Area Trofia    pH Condutividade Alcalinidade
   <chr>        <chr>       <dbl>  <dbl> <chr>  <dbl>         <dbl>        <dbl>
 1 Cavernoso    Iguacu       1965   2.9  Oligo…   7.4          33.1        140. 
 2 Curucaca     Iguacu       1982   2    Oligo…   7            32.4        126. 
 3 Foz do Areia Iguacu       1980 139    Oligo…   7.3          35.5         97  
 4 Irai         Iguacu       2000  15    EutrÃ…   6.9          50.2          3.3
 5 JMF          Iguacu       1970   0.45 Mesot…   7.3          40.2          3.7
 6 Jordao       Iguacu       1996   3.4  Oligo…   7.1          23.7        153. 
 7 Passauna     Iguacu       1978  14    Oligo…   8.8         126.         526  
 8 Piraquara    Iguacu       1979   3.3  Oligo…   7.1          22.8         50.7
 9 Salto Caxias Iguacu       1998 124    Oligo…   7.3          39.6        106  
10 Salto do Vau Iguacu       1959   2.9  Oligo…   6.5          23.2        279  
# ℹ 21 more rows
# ℹ 3 more variables: Fosforo_total <dbl>, Riqueza <dbl>, Captura_kg <dbl>

6 Agrupando tabelas: funções do grupo join

As funções left_join(), right_join(), inner_join(), anti_join() e full_join() do pacote dplyr em R são utilizadas para combinar dois data frames baseados em uma coluna ou colunas comuns. Esses tipos de joins são amplamente utilizados em operações de banco de dados e manipulação de dados.

Considere os arquivos regiao.csv e habitat.csv do repositório datasets.

regiao <- read_csv("https://raw.githubusercontent.com/FCopf/datasets/refs/heads/main/regiao.csv")
habitat <- read_csv("https://raw.githubusercontent.com/FCopf/datasets/refs/heads/main/habitat.csv")
regiao
# A tibble: 10 × 4
   Riacho Bacia      Município      Área
   <chr>  <chr>      <chr>         <dbl>
 1 R1     Boicucanga São Sebastião  30.3
 2 R4     Boicucanga São Sebastião  30.3
 3 R8     Boicucanga São Sebastião  30.3
 4 R2     Cubatão    Cubatão       189  
 5 R5     Cubatão    Cubatão       189  
 6 R10    Cubatão    Cubatão       189  
 7 R13    Cubatão    Cubatão       189  
 8 R6     Quilombo   Santos         86  
 9 R9     Quilombo   Santos         86  
10 R7     Quilombo   Santos         86  
habitat
# A tibble: 8 × 4
  Riacho Altitude Largura Profundidade
  <chr>     <dbl>   <dbl>        <dbl>
1 R1           74     7.8         20.2
2 R4           14    10.9         17.7
3 R8          245     8.3         19.5
4 R11         241     2.2         20.3
5 R2           29     1.6         11.8
6 R6           86    15.2         35.3
7 R9           77     4.1         18.9
8 R7           63    14.2         42.1

Tabela regiao: Contém informações sobre a bacia hidrográfica, área da bacia e município de alguns riachos da região litorânea de São Paulo.

Tabela habitat: Contém informações sobre a largura e profundidade desses riachos. Algumas entradas são comuns às duas tabelas, enquanto outras são exclusivas de uma delas. A coluna Riacho serve como chave para combinar as informações.

Função left_join()

Retorna todas as linhas da tabela à esquerda (regiao) e adiciona colunas da tabela à direita (habitat). Linhas sem correspondência na tabela da direita terão valores de NA.

regiao |> left_join(y = habitat)
# A tibble: 10 × 7
   Riacho Bacia      Município      Área Altitude Largura Profundidade
   <chr>  <chr>      <chr>         <dbl>    <dbl>   <dbl>        <dbl>
 1 R1     Boicucanga São Sebastião  30.3       74     7.8         20.2
 2 R4     Boicucanga São Sebastião  30.3       14    10.9         17.7
 3 R8     Boicucanga São Sebastião  30.3      245     8.3         19.5
 4 R2     Cubatão    Cubatão       189         29     1.6         11.8
 5 R5     Cubatão    Cubatão       189         NA    NA           NA  
 6 R10    Cubatão    Cubatão       189         NA    NA           NA  
 7 R13    Cubatão    Cubatão       189         NA    NA           NA  
 8 R6     Quilombo   Santos         86         86    15.2         35.3
 9 R9     Quilombo   Santos         86         77     4.1         18.9
10 R7     Quilombo   Santos         86         63    14.2         42.1

Função right_join()

Retorna todas as linhas da tabela à direita (habitat) e adiciona colunas da tabela à esquerda (regiao). Linhas sem correspondência na tabela da esquerda terão valores de NA.

regiao |> right_join(y = habitat, keep=TRUE)
# A tibble: 8 × 8
  Riacho.x Bacia      Município      Área Riacho.y Altitude Largura Profundidade
  <chr>    <chr>      <chr>         <dbl> <chr>       <dbl>   <dbl>        <dbl>
1 R1       Boicucanga São Sebastião  30.3 R1             74     7.8         20.2
2 R4       Boicucanga São Sebastião  30.3 R4             14    10.9         17.7
3 R8       Boicucanga São Sebastião  30.3 R8            245     8.3         19.5
4 R2       Cubatão    Cubatão       189   R2             29     1.6         11.8
5 R6       Quilombo   Santos         86   R6             86    15.2         35.3
6 R9       Quilombo   Santos         86   R9             77     4.1         18.9
7 R7       Quilombo   Santos         86   R7             63    14.2         42.1
8 <NA>     <NA>       <NA>           NA   R11           241     2.2         20.3

Função inner_join()

Retorna apenas as linhas que têm correspondência em ambas as tabelas.

regiao |> inner_join(y = habitat)
# A tibble: 7 × 7
  Riacho Bacia      Município      Área Altitude Largura Profundidade
  <chr>  <chr>      <chr>         <dbl>    <dbl>   <dbl>        <dbl>
1 R1     Boicucanga São Sebastião  30.3       74     7.8         20.2
2 R4     Boicucanga São Sebastião  30.3       14    10.9         17.7
3 R8     Boicucanga São Sebastião  30.3      245     8.3         19.5
4 R2     Cubatão    Cubatão       189         29     1.6         11.8
5 R6     Quilombo   Santos         86         86    15.2         35.3
6 R9     Quilombo   Santos         86         77     4.1         18.9
7 R7     Quilombo   Santos         86         63    14.2         42.1

Função anti_join()

Retorna as linhas da tabela à esquerda que não têm correspondência na tabela à direita. Também retorna todas as colunas da tabela à esquerda.

regiao |> anti_join(y = habitat)
# A tibble: 3 × 4
  Riacho Bacia   Município  Área
  <chr>  <chr>   <chr>     <dbl>
1 R5     Cubatão Cubatão     189
2 R10    Cubatão Cubatão     189
3 R13    Cubatão Cubatão     189
habitat |> anti_join(y = regiao)
# A tibble: 1 × 4
  Riacho Altitude Largura Profundidade
  <chr>     <dbl>   <dbl>        <dbl>
1 R11         241     2.2         20.3

Função full_join()

Retorna todas as linhas e colunas de ambas as tabelas. Nas células onde não houver correspondência, retorna NA.

regiao |> full_join(y = habitat, keep = TRUE)
# A tibble: 11 × 8
   Riacho.x Bacia      Município     Área Riacho.y Altitude Largura Profundidade
   <chr>    <chr>      <chr>        <dbl> <chr>       <dbl>   <dbl>        <dbl>
 1 R1       Boicucanga São Sebasti…  30.3 R1             74     7.8         20.2
 2 R4       Boicucanga São Sebasti…  30.3 R4             14    10.9         17.7
 3 R8       Boicucanga São Sebasti…  30.3 R8            245     8.3         19.5
 4 R2       Cubatão    Cubatão      189   R2             29     1.6         11.8
 5 R5       Cubatão    Cubatão      189   <NA>           NA    NA           NA  
 6 R10      Cubatão    Cubatão      189   <NA>           NA    NA           NA  
 7 R13      Cubatão    Cubatão      189   <NA>           NA    NA           NA  
 8 R6       Quilombo   Santos        86   R6             86    15.2         35.3
 9 R9       Quilombo   Santos        86   R9             77     4.1         18.9
10 R7       Quilombo   Santos        86   R7             63    14.2         42.1
11 <NA>     <NA>       <NA>          NA   R11           241     2.2         20.3

7 Criando e modificando colunas com mutate()

A função mutate() permite criar e modificar colunas em um data frame. Usando a base de dados Doubs river:

library(ade4)
data(doubs)
dbenv <- doubs$env
head(dbenv)
  dfs alt   slo flo pH har pho nit amm oxy bdo
1   3 934 6.176  84 79  45   1  20   0 122  27
2  22 932 3.434 100 80  40   2  20  10 103  19
3 102 914 3.638 180 83  52   5  22   5 105  35
4 185 854 3.497 253 80  72  10  21   0 110  13
5 215 849 3.178 264 81  84  38  52  20  80  62
6 324 846 3.497 286 79  60  20  15   0 102  53

Ajustando a escala de pH

A coluna pH está multiplicada por \(10\). Vamos ajustar isso:

dbenv <- dbenv  |> 
  mutate(pH = pH / 10)

head(dbenv)
  dfs alt   slo flo  pH har pho nit amm oxy bdo
1   3 934 6.176  84 7.9  45   1  20   0 122  27
2  22 932 3.434 100 8.0  40   2  20  10 103  19
3 102 914 3.638 180 8.3  52   5  22   5 105  35
4 185 854 3.497 253 8.0  72  10  21   0 110  13
5 215 849 3.178 264 8.1  84  38  52  20  80  62
6 324 846 3.497 286 7.9  60  20  15   0 102  53

Criando variável categórica

Criar uma variável categórica pH_cat com níveis Elevado (maior ou igual a \(8\)) e Neutro (menor que \(8\)):

dbenv <- dbenv |> 
  mutate(pH = pH / 10) |> 
  mutate(pH_cat = if_else(pH < 8, true = "Neutro", false = "Elevado"),
         , .after = pH)

head(dbenv)
  dfs alt   slo flo   pH pH_cat har pho nit amm oxy bdo
1   3 934 6.176  84 0.79 Neutro  45   1  20   0 122  27
2  22 932 3.434 100 0.80 Neutro  40   2  20  10 103  19
3 102 914 3.638 180 0.83 Neutro  52   5  22   5 105  35
4 185 854 3.497 253 0.80 Neutro  72  10  21   0 110  13
5 215 849 3.178 264 0.81 Neutro  84  38  52  20  80  62
6 324 846 3.497 286 0.79 Neutro  60  20  15   0 102  53

Unindo colunas com unite()

A função unite() do tidyr combina duas colunas em uma nova coluna. Usando a tabela iris:

iris2 <- iris |> 
  mutate(Genus = "Iris", .before = Species)  |>  
  unite(scientic_name, Genus, Species, sep = " ")

head(iris2)
  Sepal.Length Sepal.Width Petal.Length Petal.Width scientic_name
1          5.1         3.5          1.4         0.2   Iris setosa
2          4.9         3.0          1.4         0.2   Iris setosa
3          4.7         3.2          1.3         0.2   Iris setosa
4          4.6         3.1          1.5         0.2   Iris setosa
5          5.0         3.6          1.4         0.2   Iris setosa
6          5.4         3.9          1.7         0.4   Iris setosa
NotaObservação

A função unite() excluiu as colunas que foram unificadas da tabela. Mara mantê-las na tabela utilize o argumento remove = FALSE.

8 Reformatando data frames: funções pivot_wider() e pivot_longer()

A tabela HubbardBrook.csv (datasets) contém dados anuais de vazão e precipitação em dois bacias hidrográficas (Hornbeck et al. 1993). A primeira (Deforested) teve toda a vegetação removida como parte de um experimento de longa duração enquanto a outra se manteve intacta (Referenca). Os daods de origem e o experimento detalhado são apresentados am Os dados foram retirados de tiee.esa.org

hbrook <- read_csv("https://raw.githubusercontent.com/FCopf/datasets/refs/heads/main/HubbardBrook.csv")
hbrook
# A tibble: 62 × 4
    Year Treatment   Flow Precipitation
   <dbl> <chr>      <dbl>         <dbl>
 1  1958 Deforested  645.         1168.
 2  1959 Deforested 1012.         1483.
 3  1960 Deforested  825.         1321.
 4  1961 Deforested  470.          980.
 5  1962 Deforested  777.         1232.
 6  1963 Deforested  774.         1139.
 7  1964 Deforested  712.         1175.
 8  1965 Deforested  599.         1115.
 9  1966 Deforested 1189.         1222.
10  1967 Deforested 1132.         1315.
# ℹ 52 more rows

Reorganizando data frames de formato longo para formato largo

A função pivot_wider() é utilizada para transformar dados do formato longo para o formato largo. A seguir, será feito isso apenas para a variável Flow, excluindo Precipitation, separando os dados nas colunas Deforested e Reference.

hbrook_largo <- hbrook |>
  select(-Precipitation) |>
  pivot_wider(names_from = Treatment, values_from = Flow)
hbrook_largo
# A tibble: 31 × 3
    Year Deforested Reference
   <dbl>      <dbl>     <dbl>
 1  1958       645.      567.
 2  1959      1012.      918.
 3  1960       825.      752.
 4  1961       470.      436.
 5  1962       777.      699.
 6  1963       774.      663.
 7  1964       712.      630.
 8  1965       599.      547.
 9  1966      1189.      727.
10  1967      1132.      781.
# ℹ 21 more rows

Reorganizando data frames de formato largo para formato longo

A função pivot_longer() é utilizada para transformar dados do formato largo para o formato longo, fazendo o caminho inverso de pivot_wider().

hbrook_longo <- hbrook_largo |>
  pivot_longer(!Year, names_to = "Desmatamento", values_to = "Flow")
hbrook_longo
# A tibble: 62 × 3
    Year Desmatamento  Flow
   <dbl> <chr>        <dbl>
 1  1958 Deforested    645.
 2  1958 Reference     567.
 3  1959 Deforested   1012.
 4  1959 Reference     918.
 5  1960 Deforested    825.
 6  1960 Reference     752.
 7  1961 Deforested    470.
 8  1961 Reference     436.
 9  1962 Deforested    777.
10  1962 Reference     699.
# ℹ 52 more rows

Referências

Hornbeck, J. W., M. B. Adams, E. S. Corbett, E. S. Verry, e J. A. Lynch. 1993. «Long-term impacts of forest treatment on water yield: a summary for northeastern USA». Journal of Hydrology 150: 323–44.