library(dplyr)
library(tidyr)
library(readr)Transformação de Dados
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.
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_ordenado2 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 existe4.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
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