5  Capítulo – Manipulação de Dados com R

Neste capítulo, vamos explorar como importar, visualizar, limpar e transformar dados meteorológicos utilizando o R.


5.1 Importando dados

library(readxl)
library(tidyverse)
#library(dplyr)
#library(tidyr)


#Normais Climatológicas (1991-2020) de Temperatura Máxima
#Mensal obtidas do INMET

dados_nc <- read_excel("dados/TMAX_INMET.xlsx")
#head(dados_nc)
str(dados_nc)
tibble [190 × 16] (S3: tbl_df/tbl/data.frame)
 $ Código         : num [1:190] 82989 83249 82353 83007 82970 ...
 $ Nome da Estação: chr [1:190] "AGUA BRANCA" "ALAGOINHAS" "ALTAMIRA" "ALTO DA BOA VISTA" ...
 $ UF             : chr [1:190] "AL" "BA" "PA" "RJ" ...
 $ Janeiro        : num [1:190] 31.1 33.1 31.6 30.2 32 30.6 33.7 31.9 30.8 28.3 ...
 $ Fevereiro      : num [1:190] NA 33 31.2 30.6 32 30.8 34.7 32.1 31 28.8 ...
 $ Março          : num [1:190] 30.7 33.1 31.3 29.1 32.2 30.9 33.7 32.5 31 28.1 ...
 $ Abril          : num [1:190] 29.5 31.1 31.6 27.5 32.7 30.4 32.6 33 31.5 27.8 ...
 $ Maio           : num [1:190] 27.2 29.2 32.1 25 33.2 29.6 30.9 32.5 32.2 26 ...
 $ Junho          : num [1:190] 25.1 27.7 32.9 24.3 33.3 28.6 29.8 32.5 33 25.3 ...
 $ Julho          : num [1:190] 24.2 27.2 NA 24.1 33.8 27.9 29.6 33.1 33.8 25.5 ...
 $ Agosto         : num [1:190] 25.2 27.4 34.5 24.6 35.3 27.9 31 35.4 35.1 27.6 ...
 $ Setembro       : num [1:190] 27.6 28.8 34.8 25.2 36.7 28.4 32.8 36.5 34.8 29 ...
 $ Outubro        : num [1:190] 30 30.6 34.6 26.3 35.8 29.2 34 35.4 32.9 29.4 ...
 $ Novembro       : num [1:190] 31.1 31.9 34 26.8 33.5 29.8 32.3 33 31.6 27.9 ...
 $ Dezembro       : num [1:190] 31.5 32.9 32.9 29.1 32.4 30.2 32.8 32.2 31.1 28.1 ...
 $ Ano            : num [1:190] NA 30.5 NA 26.9 33.6 29.5 32.3 33.3 32.4 27.7 ...

5.2 Explorando os dados

dim(dados_nc)
[1] 190  16
#summary(dados_nc)
# names(dados_nc)

Valores Faltante (NA)

#Verificar de tem valores NA
any(is.na(dados_nc))
[1] TRUE
#Contar quantos valores NA existem no total
# sum(is.na(dados_nc))

#Verificar o número de NAs por coluna
# colSums(is.na(dados_nc))

#ver linhas que contêm pelo menos um NA
# dados_nc  |> 
  # filter(if_any(everything(), is.na))
# Remover valores NA

#De linhas
dados_limpos <- dados_nc  |> 
  drop_na()

dim(dados_limpos)
[1] 142  16
#De colunas específica
# dados_limpos <- dados_nc  |> 
  # drop_na(Janeiro, Fevereiro)
#Substituir (imputar) valores NA

#Substituir NAs por zero
# dados_preenchidos <- dados_nc  |> 
  # mutate(across(everything(), ~replace_na(.x, 0)))

#Substituir NAs por média da variável
dados_preenchidos2 <- dados_nc  |> 
  mutate(across(where(is.numeric), ~ifelse(is.na(.), mean(., na.rm = TRUE), .)))

any(is.na(dados_preenchidos2))
[1] FALSE

5.3 Trabalhando com Linhas e Colunas

# Selecionar coluna pelo nome
# dados$UF

# Selecionar várias colunas por índice
# dados[, c(1,3)]

# Selecionar linha específica
# dados[10, ]

# Célula na linha 5, coluna 3
#dados[5, 3]

5.4 Renomeando, criando, deletando colunas

# Renomeando coluna
TMAX_INMET <- dados_nc |> 
  rename(
    Estacao = `Nome da Estação`,
    Jan = Janeiro,
    Fev = Fevereiro,
    Mar = Março,
    Abr = Abril,
    Mai = Maio,
    Jun = Junho,
    Jul = Julho,
    Ago = Agosto,
    Set = Setembro,
    Out = Outubro,
    Nov = Novembro,
    Dez = Dezembro
  )

head(TMAX_INMET)
# A tibble: 6 × 16
  Código Estacao     UF      Jan   Fev   Mar   Abr   Mai   Jun   Jul   Ago   Set
   <dbl> <chr>       <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1  82989 AGUA BRANCA AL     31.1  NA    30.7  29.5  27.2  25.1  24.2  25.2  27.6
2  83249 ALAGOINHAS  BA     33.1  33    33.1  31.1  29.2  27.7  27.2  27.4  28.8
3  82353 ALTAMIRA    PA     31.6  31.2  31.3  31.6  32.1  32.9  NA    34.5  34.8
4  83007 ALTO DA BO… RJ     30.2  30.6  29.1  27.5  25    24.3  24.1  24.6  25.2
5  82970 ALTO PARNA… MA     32    32    32.2  32.7  33.2  33.3  33.8  35.3  36.7
6  83096 ARACAJU     SE     30.6  30.8  30.9  30.4  29.6  28.6  27.9  27.9  28.4
# ℹ 4 more variables: Out <dbl>, Nov <dbl>, Dez <dbl>, Ano <dbl>
# Pivotando 

TMAX_longer <- 
  TMAX_INMET |> 
  dplyr::mutate(Ano = NULL) |> 
  tidyr::pivot_longer(
    cols = Jan:Dez,      
    names_to = 'Meses',  
    values_to = 'Tmax'
  )

head(TMAX_longer)
# A tibble: 6 × 5
  Código Estacao     UF    Meses  Tmax
   <dbl> <chr>       <chr> <chr> <dbl>
1  82989 AGUA BRANCA AL    Jan    31.1
2  82989 AGUA BRANCA AL    Fev    NA  
3  82989 AGUA BRANCA AL    Mar    30.7
4  82989 AGUA BRANCA AL    Abr    29.5
5  82989 AGUA BRANCA AL    Mai    27.2
6  82989 AGUA BRANCA AL    Jun    25.1
# Filtrando os dados UF == SP 

TMAX_SP <- 
  TMAX_longer |> 
  dplyr::filter(UF == 'SP')

TMAX_SP
# A tibble: 72 × 5
   Código Estacao          UF    Meses  Tmax
    <dbl> <chr>            <chr> <chr> <dbl>
 1  83714 CAMPOS DO JORDAO SP    Jan    NA  
 2  83714 CAMPOS DO JORDAO SP    Fev    23  
 3  83714 CAMPOS DO JORDAO SP    Mar    22  
 4  83714 CAMPOS DO JORDAO SP    Abr    20.8
 5  83714 CAMPOS DO JORDAO SP    Mai    18.1
 6  83714 CAMPOS DO JORDAO SP    Jun    17.5
 7  83714 CAMPOS DO JORDAO SP    Jul    17.8
 8  83714 CAMPOS DO JORDAO SP    Ago    19.6
 9  83714 CAMPOS DO JORDAO SP    Set    21  
10  83714 CAMPOS DO JORDAO SP    Out    21.8
# ℹ 62 more rows

5.5 ✍️ Prática

Agora faça você mesmo!
  • Filtrar os dados para o MA

5.6 Gerando gráfico de pontos

#Organizando ordem dos meses

TMAX_SP <-
   TMAX_SP |>
   mutate(Meses = factor(Meses,
                         levels = c('Jan', 'Fev', 'Mar', 'Abr', 'Mai',
                                    'Jun','Jul', 'Ago', 'Set', 'Out',
                                    'Nov', 'Dez')))
paleta_cor <- colorRampPalette(c('red', 'blue', 'goldenrod'))

g1 <- ggplot(data = TMAX_SP) +
  geom_point(aes(x = Meses, y = Tmax, color = Meses),
             shape = 18, size = 3)+
  scale_color_manual(values = paleta_cor(12)) +
  theme_classic()

g1

5.7 ✍️ Prática

Agora faça você mesmo!
  • Gerar gráfico para os dados do MA

5.8 Gerando gráfico de barras

#
TMAX_UF <- 
  TMAX_longer |> 
  group_by(UF) |> 
  summarise(Tmax_anual = mean(Tmax, na.rm = T))


tail(TMAX_UF)
# A tibble: 6 × 2
  UF    Tmax_anual
  <chr>      <dbl>
1 RR          33.6
2 RS          24.0
3 SC          23.5
4 SE          30.2
5 SP          26.8
6 TO          33.2
ggplot(TMAX_UF, aes(x = reorder(UF, Tmax_anual),
                    y = Tmax_anual)) +
  geom_col(fill = "lightblue") +
  scale_y_continuous(expand = c(0,0)) +
  labs(title = "Temperatura Média Anual por Estado",
       x = "Estado (UF)", y = "Temperatura Média Anual (°C)") +
  theme(
    axis.text.x = element_text(angle = 45)
  ) +
  theme_bw()

5.9 ✍️ Prática

Acessando planilha .csv

#Acessando tabela dos dados

Sao_Luis <- 'https://raw.githubusercontent.com/IzadoraSC/ebook-intro-computacao-meteorologia/refs/heads/main/dados/dados_82564_D_1991-01-01_2020-12-31.csv'


Imperatriz <- 'https://raw.githubusercontent.com/IzadoraSC/ebook-intro-computacao-meteorologia/refs/heads/main/dados/dados_82564_D_1991-01-01_2020-12-31.csv'


#Lendo os dados

df_slz <- read.csv2(
  file = Sao_Luis,
  na = 'null',
  skip = 10
)

head(df_slz)
  Data.Medicao EVAPORACAO.DO.PICHE..DIARIA.mm. INSOLACAO.TOTAL..DIARIO.h.
1   1991-01-01                             0.8                        3.6
2   1991-01-02                             1.4                        5.8
3   1991-01-03                             2.6                        7.6
4   1991-01-04                             2.8                        9.7
5   1991-01-05                             1.0                        4.3
6   1991-01-06                             2.5                        7.7
  PRECIPITACAO.TOTAL..DIARIO.mm. TEMPERATURA.MAXIMA..DIARIA..C.
1                            1.6                           31.1
2                           16.6                           31.5
3                            0.3                           32.1
4                            3.0                           32.5
5                            0.0                           33.1
6                           68.3                           32.7
  TEMPERATURA.MEDIA.COMPENSADA..DIARIA..C. TEMPERATURA.MINIMA..DIARIA..C.
1                                     24.1                           19.6
2                                     25.3                           19.4
3                                     25.7                           23.2
4                                     27.5                           23.0
5                                     26.2                           24.0
6                                     27.1                           23.4
  UMIDADE.RELATIVA.DO.AR..MEDIA.DIARIA...
1                                    86.8
2                                    80.8
3                                    80.5
4                                    71.3
5                                    80.8
6                                    77.5
  UMIDADE.RELATIVA.DO.AR..MINIMA.DIARIA... VENTO..VELOCIDADE.MEDIA.DIARIA.m.s.
1                                       63                                 0.5
2                                       58                                 1.2
3                                       61                                 1.9
4                                       55                                 1.3
5                                       51                                 2.5
6                                       49                                 1.2
   X
1 NA
2 NA
3 NA
4 NA
5 NA
6 NA