9.5 Exercícios

Pacotes necessários

pcks <- c("rio", "tidyverse", "lubridate")
easypackages::libraries(pcks)

Dados

arq_temp <- tempfile(fileext = ".RData")
download.file(
  "https://github.com/lhmet/adar-ufsm/blob/master/data/dados-lista-exerc4-cap9.RData?raw=true",
  destfile = arq_temp
)
# nome dos dados carregados para os exercícios
print(load(arq_temp))
#>  [1] "soi"                "precd_ncdf"         "poluentes"         
#>  [4] "estacoes"           "dados_sm"           "dados_zorra"       
#>  [7] "datas_comp"         "datas_obs"          "dados_rs_08_16"    
#> [10] "info_emas_rs_08_16"
  1. Converta os dados de anomalias padronizadas do índice de oscilação sul armazenados no data frame soi (dado abaixo) para o formato "arrumado" e em ordem cronológica. Os nomes das variáveis na tabela de dados arrumado deve estar sempre em letras minúsculas (Converta se for necessário usando a função tolower(names(soi_arrumado))).
soi 
#>   YEAR    1    2    3    4    5   6    7    8    9   10   11   12
#> 1 1951  1.5  0.9 -0.1 -0.3 -0.7 0.2 -1.0 -0.2 -1.1 -1.0 -0.8 -0.7
#> 2 1952 -0.9 -0.6  0.5 -0.2  0.8 0.7  0.5  0.1 -0.2  0.4  0.0 -1.2
#> 3 1953  0.3 -0.5 -0.2  0.2 -1.7 0.1  0.0 -1.2 -1.2  0.1 -0.3 -0.5

A estrutura esperada dos dados arrumados é mostrada abaixo:

#> Observations: 36
#> Variables: 3
#> $ year <int> 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 1951, 195...
#> $ mes  <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3, 4, 5, 6, ...
#> $ soi  <dbl> 1.5, 0.9, -0.1, -0.3, -0.7, 0.2, -1.0, -0.2, -1.1, -1.0, ...
  1. Os dados de precipitação diária abaixo são uma pequena amostra dos dados usados na questão 4 da lista do Capítulo 8. Converta o tibble fornecido abaixo para o "formato arrumado". No data frame arrumado, transforme as datas obtidas (na classe de caractere) para classe date usando a função as.Date().
precd_ncdf
#> # A tibble: 5 x 10
#>       x     y X2010.01.01 X2010.01.02 X2010.01.03 X2010.01.04 X2010.01.05
#>   <dbl> <dbl>       <dbl>       <dbl>       <dbl>       <dbl>       <dbl>
#> 1 -60.6  5.12           0           0           0       0.448       2.35 
#> 2 -60.4  5.12           0           0           0       0.441       1.19 
#> 3 -60.1  5.12           0           0           0       0.579       2.01 
#> 4 -60.6  4.88           0           0           0       0.441       1.94 
#> 5 -60.4  4.88           0           0           0       0.392       0.428
#> # ... with 3 more variables: X2010.01.06 <dbl>, X2010.01.07 <dbl>,
#> #   X2010.01.08 <dbl>

A estrutura esperada do tibble resultante é mostrada abaixo:

#> Observations: 40
#> Variables: 4
#> $ x    <dbl> -60.625, -60.375, -60.125, -60.625, -60.375, -60.625, -60...
#> $ y    <dbl> 5.125, 5.125, 5.125, 4.875, 4.875, 5.125, 5.125, 5.125, 4...
#> $ date <date> 2010-01-01, 2010-01-01, 2010-01-01, 2010-01-01, 2010-01-...
#> $ prec <dbl> 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0.0000000, 0....
  1. Coloque os dados de poluição (tibble poluentes) no formato "arrumado".
poluentes
#> # A tibble: 4 x 3
#>   poluente duracao estacao
#>   <chr>    <chr>     <int>
#> 1 ozone    1h            1
#> 2 so2      1h            1
#> 3 ozone    8h            2
#> 4 no2      1h            4

A estrutura esperada do tibble resultante é mostrada abaixo:

#> Observations: 3
#> Variables: 4
#> $ estacao <int> 1, 2, 4
#> $ no2     <chr> NA, NA, "1h"
#> $ ozone   <chr> "1h", "8h", NA
#> $ so2     <chr> "1h", NA, NA
  1. Coloque os dados meteorológicos diários da estação meteorológica de Santa Maria no formato arrumado. Deixe os dados ordenados cronologicamente.
dados_sm
#> # A tibble: 12 x 35
#>    id    element month  year    d1    d2    d3    d4    d5    d6    d7
#>    <chr> <chr>   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#>  1 83936 tmax        1  2010  32.6  33.4  24.8  29.4  27    24.4  29.6
#>  2 83936 tmin        1  2010  17.9  21.4  21.6  23.4  23.2  21.8  18  
#>  3 83936 tmax        2  2010  36.8  38.4  32.6  38.6  34    36.4  29.8
#>  4 83936 tmin        2  2010  25.4  25    29.6  26.2  25    25.8  25.4
#>  5 83936 tmax        3  2010  32    32.4  33.6  32.4  32    29.6  30.2
#>  6 83936 tmin        3  2010  18.6  19    20.2  21.6  19.8  18.4  17.3
#>  7 83936 tmax        4  2010  34.4  28.6  21    24.2  23.4  24    24.6
#>  8 83936 tmin        4  2010  17.5  21    20.6  17.6  15    10.8  11.7
#>  9 83936 tmax        5  2010  27    26.4  20.2  22.8  25.4  17.4  19.6
#> 10 83936 tmin        5  2010   7.2   7    13    16.2  14.1  11.5  14.4
#> 11 83936 tmax        6  2010  19.2  23.8  17.2  18.6  21.2  20.2  17.8
#> 12 83936 tmin        6  2010   4.1   8.8   9.1  15.2  11.4   6.1   6.3
#> # ... with 24 more variables: d8 <dbl>, d9 <dbl>, d10 <dbl>, d11 <dbl>,
#> #   d12 <dbl>, d13 <dbl>, d14 <dbl>, d15 <dbl>, d16 <dbl>, d17 <dbl>,
#> #   d18 <dbl>, d19 <dbl>, d20 <dbl>, d21 <dbl>, d22 <dbl>, d23 <dbl>,
#> #   d24 <dbl>, d25 <dbl>, d26 <dbl>, d27 <dbl>, d28 <dbl>, d29 <dbl>,
#> #   d30 <dbl>, d31 <dbl>

A estrutura esperada do tibble resultante é mostrada abaixo:

#> Observations: 186
#> Variables: 6
#> $ id    <chr> "83936", "83936", "83936", "83936", "83936", "83936", "8...
#> $ month <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,...
#> $ year  <dbl> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010, 20...
#> $ day   <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 1...
#> $ tmax  <dbl> 32.6, 33.4, 24.8, 29.4, 27.0, 24.4, 29.6, 29.4, 29.6, 31...
#> $ tmin  <dbl> 17.9, 21.4, 21.6, 23.4, 23.2, 21.8, 18.0, 19.4, 21.8, 22...

  1. Com os dados obtidos na questão 4:
  1. junte as colunas year, month e day em uma única coluna denominada date de forma que a classe dessa nova coluna seja date.

  2. Filtre os dados obtidos em (a) de forma a descobrir as datas em que as observações de tmax ou tmin são faltantes. Mostre o tibble filtrado com as datas e explique o porquê de seus valores.


  1. A amostra de dados abaixo possui medidas a cada 6 horas de uma estação meteorológica de superfície. Reestruture os dados no formato "arrumado" e as informações de data e horário agregadas em uma única variável da classe POSIXct.
dados_zorra
#>         date tmax.0 tmax.600 tmax.1200 tmax.1800 tmin.0 tmin.600 tmin.1200
#> 2 01-01-2010   22.1     21.0      26.4      27.0     16     13.5      18.2
#> 3 02-01-2010   26.0     25.0      29.4      29.5     19     13.7      16.3
#> 4 03-01-2010   25.7     26.3      28.4      29.0     21     14.1      17.2
#> 5 04-01-2010   23.5     24.5      27.4      28.0     23     16.2      16.9
#>   tmin.1800
#> 2      24.1
#> 3      22.3
#> 4      26.0
#> 5      23.0

A estrutura esperada do tibble resultante é mostrada abaixo:

#> Observations: 16
#> Variables: 3
#> $ date <dttm> 2010-01-01 00:00:00, 2010-01-01 06:00:00, 2010-01-01 12:...
#> $ tmax <dbl> 22.1, 21.0, 26.4, 27.0, 26.0, 25.0, 29.4, 29.5, 25.7, 26....
#> $ tmin <dbl> 16.0, 13.5, 18.2, 24.1, 19.0, 13.7, 16.3, 22.3, 21.0, 14....

  1. Faça uma junção da tabela de dados de informações das estações de poluição (etacoes, dada abaixo) com os períodos de duração de poluição crítica (poluentes). A tabela resultante deve conter somente estações que tenham coordenadas espaciais e medidas de poluentes válidas.
estacoes
#>   id      lat       lon
#> 1  1 42.46757 -87.81005
#> 2  2 42.04915 -88.27303
#> 3  3 39.11054 -90.32408

Estrutura da tabela resultante:

#> Observations: 3
#> Variables: 5
#> $ id       <int> 1, 1, 2
#> $ lat      <dbl> 42.46757, 42.46757, 42.04915
#> $ lon      <dbl> -87.81005, -87.81005, -88.27303
#> $ poluente <chr> "ozone", "so2", "ozone"
#> $ duracao  <chr> "1h", "1h", "8h"

  1. Combine as 2 tabelas abaixo de forma que:
  1. a tabela resultante contenha todas as datas compreendidas pelas duas tabelas (e em ordem cronológica) e as observações de umidade do solo (theta) sejam preenchidas com NA.

Estrutura da tabela de dados resultante:

#> Observations: 8
#> Variables: 2
#> $ date  <date> 2018-07-13, 2018-07-14, 2018-07-15, 2018-07-16, 2018-07...
#> $ theta <dbl> 0.3295812, 0.4123798, 0.3917322, NA, NA, 0.3268883, NA, NA
  1. a tabela resultante contenha exatamente as datas da tabela data_comp (em ordem cronológica) e as observações de umidade do solo (theta) sejam preenchidas com NA.

Estrutura da tabela de dados resultante:

#> Observations: 7
#> Variables: 2
#> $ date  <date> 2018-07-14, 2018-07-15, 2018-07-16, 2018-07-17, 2018-07...
#> $ theta <dbl> 0.4123798, 0.3917322, NA, NA, 0.3268883, NA, NA

Utilize os dados horários de estações meteorológicas automáticas (EMA) do RS (dados_rs_08_16) para solução das questões a seguir.

  1. Determinar a data inicial, final e o período de dados (em anos) de cada estação (identificada pela variável site).

Estrutura da tabela de dados resultante:

#> Observations: 42
#> Variables: 5
#> $ site        <chr> "A801", "A802", "A803", "A804", "A805", "A808", "A...
#> $ periodo     <dbl> 8.5027322, 8.5027322, 8.5027322, 0.5027322, 8.5027...
#> $ inicio      <dttm> 2007-12-31 21:00:00, 2007-12-31 21:00:00, 2007-12...
#> $ fim         <dttm> 2016-12-31 20:00:00, 2016-12-31 20:00:00, 2016-12...
#> $ periodo_err <dbl> 9.0081050, 9.0081050, 9.0081050, 0.5039954, 9.0081...
  1. Determine a porcentagem de dados válidos (ou seja, não faltantes) de cada variável para cada EMA. Aproxime os valores para números inteiros.

Estrutura da tabela de dados resultante:

#> Observations: 42
#> Variables: 6
#> $ site <chr> "A801", "A802", "A803", "A804", "A805", "A808", "A809", "...
#> $ tair <int> 99, 93, 96, 80, 93, 96, 97, 86, 97, 96, 96, 94, 97, 95, 9...
#> $ rh   <int> 99, 86, 96, 77, 93, 91, 97, 86, 95, 96, 96, 94, 97, 95, 9...
#> $ prec <int> 99, 93, 96, 80, 93, 96, 97, 87, 95, 96, 97, 93, 97, 93, 9...
#> $ rg   <int> 52, 49, 51, 44, 49, 50, 48, 46, 51, 51, 51, 49, 51, 50, 5...
#> $ ws   <int> 99, 93, 95, 80, 93, 96, 96, 87, 97, 97, 96, 94, 97, 96, 7...
  1. Adicione uma variável indicativa da porcentagem média de observações válidas de todas variáveis. Ordene esta tabela em ordem decrescente da disponibilidade média de observações.

Estrutura da tabela de dados resultante:

#> Observations: 42
#> Variables: 7
#> $ site     <chr> "A894", "A886", "A801", "A884", "A839", "A889", "A879...
#> $ tair     <int> 100, 99, 99, 99, 99, 100, 98, 98, 98, 98, 98, 97, 96,...
#> $ rh       <int> 100, 99, 99, 99, 99, 94, 98, 98, 98, 98, 98, 97, 96, ...
#> $ prec     <int> 100, 99, 99, 99, 99, 100, 98, 98, 98, 98, 95, 97, 96,...
#> $ rg       <int> 53, 55, 52, 52, 50, 53, 52, 51, 51, 52, 52, 51, 56, 5...
#> $ ws       <int> 99, 99, 99, 99, 99, 99, 98, 98, 98, 95, 98, 97, 95, 9...
#> $ disp_med <dbl> 90.4, 90.2, 89.6, 89.6, 89.2, 89.2, 88.8, 88.6, 88.6,...
  1. Para a EMA de Santa Maria (ver info_emas_rs_08_16) obtenha o ciclo diurno médio da temperatura do ar e a porcentagem de dados válidos usados para compor a tair média de cada hora.

Dica: Para extrair as horas das datas use a função lubridate::hour(date).

Estrutura da tabela de dados resultante:

#> Observations: 24
#> Variables: 3
#> $ hour      <int> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15...
#> $ tair_med  <dbl> 17.26933, 16.87304, 16.52604, 16.21440, 15.94268, 15...
#> $ tair_disp <dbl> 96.68384, 96.55505, 96.42627, 96.26529, 96.13651, 96...
  1. Com os dados de temperatura do ar (tair) da EMA de Santa Maria selecione somente os dias observações válidas nas 24 horas. Obtenha a partir destes dados a frequência de ocorrência da temperatura mínima para cada horário do dia. Apresente a tabela de resultados em ordem decrescente da frequência de ocorrência.

Dica: para obter o dia a partir da data e hora (coluna date do tipo POSIXct) use lubridate::floor_date(date, unit = "day").

Estrutura da tabela de dados resultante:

#> Observations: 24
#> Variables: 2
#> $ h_tmin <int> 6, 7, 23, 5, 8, 4, 3, 2, 0, 1, 22, 21, 9, 10, 20, 12, 1...
#> $ n      <int> 720, 561, 438, 311, 196, 190, 123, 90, 75, 60, 47, 29, ...