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"
- 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çãotolower(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, ...
- 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....
- 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
- 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...
- Com os dados obtidos na questão 4:
junte as colunas
year
,month
eday
em uma única coluna denominadadate
de forma que a classe dessa nova coluna sejadate
.Filtre os dados obtidos em (a) de forma a descobrir as datas em que as observações de
tmax
outmin
são faltantes. Mostre o tibble filtrado com as datas e explique o porquê de seus valores.
- 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....
- 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"
- Combine as 2 tabelas abaixo de forma que:
- 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 comNA
.
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
- 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 comNA
.
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.
- 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...
- 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...
- 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,...
- 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 atair
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...
- 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 tipoPOSIXct
) uselubridate::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, ...