10.5 Exercícios

Pacotes necessários

# carregue aqui os pacotes necessários para sua resolução

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,
  mode = "wb"
)
# nome dos dados carregados para os exercícios
print(load(arq_temp))

Enunciados

  1. Converta os dados de anomalias padronizadas do índice de oscilação sul armazenados no quadro de dados soi (mostrado 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 (conheça a função tolower()).

A estrutura esperada dos dados processados é mostrada abaixo:

Rows: 36
Columns: 3
$ year <int> 1951, 1951, 1951, 1951, 1951, 1951, 19...
$ mes  <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,...
$ soi  <dbl> 1.5, 0.9, -0.1, -0.3, -0.7, 0.2, -1.0,...

  1. Faça a conversão dos dados de precipitação diária, armazenados em um tibble, para o "formato arrumado" e transforme as datas para o tipo de dados date.
precd_ncdf

A estrutura esperada do tibble resultante é mostrada abaixo:

Rows: 40
Columns: 4
$ x    <dbl> -60.625, -60.625, -60.625, -60.625, -60.625, -60.625, -6...
$ y    <dbl> 5.125, 5.125, 5.125, 5.125, 5.125, 5.125, 5.125, 5.125, ...
$ date <date> 2010-01-01, 2010-01-02, 2010-01-03, 2010-01-04, 2010-01...
$ prec <dbl> 0.0000000, 0.0000000, 0.0000000, 0.4484863, 2.3515625, 4...

  1. Coloque os dados de poluição (tibble poluentes) no formato "arrumado".

    1. Coloque os dados meteorológicos diários da estação meteorológica de Santa Maria (dados_sm) no formato arrumado.
dados_sm
#> # A tibble: 12 x 35
#>    id    element month  year    d1    d2
#>    <chr> <chr>   <dbl> <dbl> <dbl> <dbl>
#>  1 83936 tmax        1  2010  32.6  33.4
#>  2 83936 tmin        1  2010  17.9  21.4
#>  3 83936 tmax        2  2010  36.8  38.4
#>  4 83936 tmin        2  2010  25.4  25  
#>  5 83936 tmax        3  2010  32    32.4
#>  6 83936 tmin        3  2010  18.6  19  
#>  7 83936 tmax        4  2010  34.4  28.6
#>  8 83936 tmin        4  2010  17.5  21  
#>  9 83936 tmax        5  2010  27    26.4
#> 10 83936 tmin        5  2010   7.2   7  
#> 11 83936 tmax        6  2010  19.2  23.8
#> 12 83936 tmin        6  2010   4.1   8.8
#> # ... with 29 more variables: d3 <dbl>,
#> #   d4 <dbl>, d5 <dbl>, d6 <dbl>, d7 <dbl>,
#> #   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>
  1. Deixe os dados ordenados cronologicamente e obtenha as variáveis com nomes e ordem conforme mostrado na estrutura de dados esperada.
Rows: 186
Columns: 6
$ id    <chr> "83936", "83936", "83936", "83936", "83936", "...
$ year  <dbl> 2010, 2010, 2010, 2010, 2010, 2010, 2010, 2010...
$ month <dbl> 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1...
$ day   <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,...
$ tmax  <dbl> 32.6, 33.4, 24.8, 29.4, 27.0, 24.4, 29.6, 29.4...
$ tmin  <dbl> 17.9, 21.4, 21.6, 23.4, 23.2, 21.8, 18.0, 19.4...
  1. Acrescente uma nova variável tmed aos dados de temperatura diária arrumados, obtida da média diária da tmax e tmin.

  1. Com os dados obtidos na questão 4c:
  1. renomeie as as colunas year, month e daypara ano, mes e dia, respectivamente.

  2. junte as colunas ano, mes e dia em uma única coluna denominada data de forma que a classe dessa nova váriavel seja date.

  3. Filtre os dados obtidos em (b) 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. DICA: quantas observações são esperadas por ano?.


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

Rows: 16
Columns: 3
$ date <dttm> 2010-01-01 00:00:00, 2010-01-01 06:00:00, 2010-01-01 12:00:00, 2010-01-01 18:...
$ tmax <dbl> 22.1, 21.0, 26.4, 27.0, 26.0, 25.0, 29.4, 29.5, 25.7, 26.3, 28.4, 29.0, 23.5, ...
$ tmin <dbl> 16.0, 13.5, 18.2, 24.1, 19.0, 13.7, 16.3, 22.3, 21.0, 14.1, 17.2, 26.0, 23.0, ...

  1. Faça uma junção da tabela de dados de informações das estações de poluição (eatacoes, 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.

A estrutura da tabela resultante é:

Rows: 3
Columns: 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.
# datas completas
datas_comp
# datas das observações de theta
datas_obs

Os resultados esperados, estruturados em um tibble, são:

Rows: 8
Columns: 2
$ date  <date> 2018-07-13, 2018-07-14, 2018-07-15, 2018-07-16, 2018-07-17, 2018-07-18, 2018-07-19, 2018-07-20
$ 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.

Os resultados esperados, estruturados em um tibble, são:

Rows: 7
Columns: 2
$ date  <date> 2018-07-14, 2018-07-15, 2018-07-16, 2018-07-17, 2018-07-18, 2018-07-19, 2018-07-20
$ theta <dbl> 0.4123798, 0.3917322, NA, NA, 0.3268883, NA, NA

  1. Utilizando os dados horários de estações meteorológicas automáticas (EMA) do RS (dados_rs_08_16), determine a data inicial, final e o período de dados (em anos) de cada estação (identificada pela variável site).

A estrutura esperada do tibble resultante é mostrada abaixo:

Rows: 42
Columns: 6
$ site           <chr> "A899", "A897", "A894", "A889", "A886", "A884", "A883", "A882", "A881", "A880", "A879", "A878", "A856", "…
$ inicio         <dttm> 2008-03-07 21:00:00, 2016-11-23 21:00:00, 2016-06-30 21:00:00, 2016-06-30 21:00:00, 2016-08-10 21:00:00,…
$ fim            <dttm> 2016-12-31 20:00:00, 2016-12-31 20:00:00, 2016-12-31 20:00:00, 2016-12-31 20:00:00, 2016-12-31 20:00:00,…
$ period         <dbl> 8.32, 0.10, 0.50, 0.50, 0.39, 2.59, 3.55, 3.75, 6.20, 8.19, 7.86, 8.31, 8.35, 8.50, 8.50, 8.50, 8.50, 8.5…

  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.

A estrutura esperada do tibble resultante é mostrada abaixo:

Rows: 42
Columns: 6
$ site <chr> "A801", "A802", "A803", "A804", "A805", "A808", "A809", "A810", "A811", "A812", "A813", "A826", "A827", "A828", "A8…
$ tair <int> 99, 93, 96, 80, 93, 96, 97, 86, 97, 96, 96, 94, 97, 95, 96, 95, 94, 95, 96, 96, 96, 97, 94, 99, 96, 96, 89, 98, 98,…
$ rh   <int> 99, 86, 96, 77, 93, 91, 97, 86, 95, 96, 96, 94, 97, 95, 96, 95, 94, 95, 96, 94, 96, 97, 94, 99, 96, 96, 89, 98, 98,…
$ prec <int> 99, 93, 96, 80, 93, 96, 97, 87, 95, 96, 97, 93, 97, 93, 96, 90, 91, 95, 96, 96, 96, 97, 94, 99, 96, 95, 88, 98, 98,…
$ rg   <int> 52, 49, 51, 44, 49, 50, 48, 46, 51, 51, 51, 49, 51, 50, 51, 50, 50, 50, 49, 50, 50, 50, 49, 50, 51, 51, 47, 51, 51,…
$ ws   <int> 99, 93, 95, 80, 93, 96, 96, 87, 97, 97, 96, 94, 97, 96, 75, 95, 94, 95, 92, 95, 96, 97, 94, 99, 96, 96, 89, 98, 98,…

  1. Com o resultado da questão anterior, 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.

A estrutura esperada do tibble resultante é mostrada abaixo:

Rows: 42
Columns: 7
$ site     <chr> "A894", "A886", "A801", "A884", "A839", "A889", "A879", "A853", "A854", "A880", "A882", "A827", "A897", "A837",…
$ tair     <int> 100, 99, 99, 99, 99, 100, 98, 98, 98, 98, 98, 97, 96, 97, 96, 96, 97, 97, 96, 96, 96, 96, 96, 95, 96, 95, 96, 9…
$ rh       <int> 100, 99, 99, 99, 99, 94, 98, 98, 98, 98, 98, 97, 96, 97, 96, 96, 97, 95, 96, 96, 96, 96, 94, 95, 91, 95, 96, 97…
$ prec     <int> 100, 99, 99, 99, 99, 100, 98, 98, 98, 98, 95, 97, 96, 97, 96, 97, 97, 95, 96, 96, 96, 95, 96, 95, 96, 93, 96, 8…
$ rg       <int> 53, 55, 52, 52, 50, 53, 52, 51, 51, 52, 52, 51, 56, 50, 51, 51, 48, 51, 51, 51, 50, 51, 50, 50, 50, 50, 49, 48,…
$ ws       <int> 99, 99, 99, 99, 99, 99, 98, 98, 98, 95, 98, 97, 95, 97, 97, 96, 96, 97, 96, 95, 96, 96, 95, 95, 96, 96, 92, 97,…
$ disp_med <dbl> 90.4, 90.2, 89.6, 89.6, 89.2, 89.2, 88.8, 88.6, 88.6, 88.2, 88.2, 87.8, 87.8, 87.6, 87.2, 87.2, 87.0, 87.0, 87.…

  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).

A estrutura esperada do tibble resultante é mostrada abaixo:

Rows: 24
Columns: 3
$ hour      <int> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23
$ tair_med  <dbl> 17.26933, 16.87304, 16.52604, 16.21440, 15.94268, 15.73293, 15.57606, 15.70728, 16.40075, 17.63952, 19.12996, …
$ tair_disp <dbl> 96.68384, 96.55505, 96.42627, 96.26529, 96.13651, 96.10431, 96.10431, 96.00773, 96.13651, 96.74823, 96.81262, …

  1. Com os dados de temperatura do ar (tair) filtrados para EMA de Santa Maria (a) selecione somente os dias observações válidas nas 24 horas (dias completos, ou seja, sem nenhuma falha nas 24 h). A partir destes dados (b) obtenha a frequência de ocorrência da temperatura mínima para cada horário do dia. (c) 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").

Os resultados para (a) são mostrados abaixo:

nrow(sm_tair)
74544

glimpse(dias_completos)
Rows: 2,945
Columns: 1
$ dias <dttm> 2008-01-01, 2008-01-02, 2008-01-03, 2008-01-04, 2008-01-05, 2008-01-06, 2008-01-07, 2008-01-08, 2008-01-09, 2008-01…

glimpse(tail(dias_completos))
Rows: 6
Columns: 1
$ day <dttm> 2016-12-25, 2016-12-26, 2016-12-27, 2016-12-28, 2016-12-29, 2016-12-30

A estrutura dos resultados para (b) é mostrada abaixo:

glimpse(freq_htmin)
Rows: 24
Columns: 2
$ h_tmin <int> 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23
$ n      <int> 75, 60, 90, 122, 190, 311, 720, 560, 196, 28, 16, 7, 8, 3, 7, 6, 4, 7, 2, 6, 15, 29, 47, 436

A estrutura dos resultados para (c) é mostrada abaixo:

Rows: 24
Columns: 2
$ h_tmin <int> 6, 7, 23, 5, 8, 4, 3, 2, 0, 1, 22, 21, 9, 10, 20, 12, 11, 14, 17, 15, 19, 16, 13, 18
$ n      <int> 720, 560, 436, 311, 196, 190, 122, 90, 75, 60, 47, 29, 28, 16, 15, 8, 7, 7, 7, 6, 6, 4, 3, 2

  1. Neste exercício aplicaremos um controle de qualidade básico de dados meteorológicos. Você irá verificar se nos dados da EMA de Santa Maria (A803, mesmos dados do item a do exercício anterior) ocorreram casos em que a temperatura máxima (mínima) diária foi acima (abaixo) dos recordes históricos registrados pela estação meteorológica convencional do INMET de Santa Maria (site 83936). Os recordes históricos de temperatura máxima e mínima estão disponíveis nos dados recordes_temp para cada mês do ano. Você deve obter os casos suspeitos na estrutura conforme abaixo.
# A tibble: 8 x 7
  date                 tmax  tmin   mes site 
  <dttm>              <dbl> <dbl> <dbl> <chr>
1 2009-10-30 00:00:00  35.8  20.4    10 83936
2 2009-10-31 00:00:00  36.8  21.8    10 83936
3 2013-12-26 00:00:00  38.3  21.2    12 83936
4 2014-02-05 00:00:00  38    23.8     2 83936
5 2014-02-06 00:00:00  38.3  24.4     2 83936
6 2014-02-07 00:00:00  39.5  23.2     2 83936
7 2014-02-09 00:00:00  38.3  22.9     2 83936
8 2014-10-29 00:00:00  36.8  22.4    10 83936
# ... with 2 more variables: tmin_abs <dbl>,
#   tmax_abs <dbl>

A estrutura dos dados resultantes esperados é mostrada abaixo.

Rows: 8
Columns: 9
$ site_ema <chr> "A803", "A803", "A803", "A803", "A803", "A803", "A803", "A803"
$ date     <dttm> 2009-10-30, 2009-10-31, 2013-12-26, 2014-02-05, 2014-02-06, 2014-02-07, 2014-02-09, 2014-10-29
$ tmax     <dbl> 35.80, 36.80, 38.35, 38.00, 38.30, 39.50, 38.30, 36.75
$ tmin     <dbl> 20.40, 21.80, 21.20, 23.85, 24.35, 23.20, 22.90, 22.45
$ nobs     <int> 24, 24, 24, 24, 24, 24, 24, 24
$ mes      <dbl> 10, 10, 12, 2, 2, 2, 2, 10
$ site_emc <chr> "83936", "83936", "83936", "83936", "83936", "83936", "83936", "83936"
$ tmin_abs <dbl> 3.6, 3.6, 7.2, 10.4, 10.4, 10.4, 10.4, 3.6
$ tmax_abs <dbl> 35.5, 35.5, 38.3, 37.6, 37.6, 37.6, 37.6, 35.5