| Title: | Water Quality Assessment and Environmental Compliance in Brazil |
|---|---|
| Description: | Tools to import, clean, validate, and analyze freshwater quality data in Brazil. Implements water quality indices including the Water Quality Index (WQI/IQA), the Trophic State Index (TSI/IET) after Carlson (1977) <doi:10.4319/lo.1977.22.2.0361> and Lamparelli (2004) <https://www.teses.usp.br/teses/disponiveis/41/41134/tde-20032006-075813/publico/TeseLamparelli2004.pdf>, and the National Sanitation Foundation Water Quality Index (NSF WQI) <doi:10.1007/s11157-023-09650-7>. The package also checks compliance with Brazilian standard CONAMA Resolution 357/2005 <https://conama.mma.gov.br/?id=450&option=com_sisconama&task=arquivo.download> and generates reproducible reports for routine monitoring workflows. The example dataset (`wq_demo`) is now a real subset from monitoring data (BURANHEM river, 2020-2024, 4 points, 20 rows, 14 columns including extra `rio`, `lat`, `lon`). All core examples and vignettes use this realistic sample, improving reproducibility and documentation value for users. |
| Authors: | Vinicius Saraiva Santos [aut, cre] (ORCID: <https://orcid.org/0009-0007-1387-7927>) |
| Maintainer: | Vinicius Saraiva Santos <[email protected]> |
| License: | MIT + file LICENSE |
| Version: | 0.8.2 |
| Built: | 2026-05-26 07:15:50 UTC |
| Source: | https://github.com/tikatuwq/tikatuwq |
Converte valores numericos de IQA (0-100) em classes qualitativas padronizadas. Suporta rotulos em portugues ("pt") ou ingles ("en").
classify_iqa(x, locale = c("pt", "en"))classify_iqa(x, locale = c("pt", "en"))
x |
Vetor numerico com IQA em 0-100. Valores NA sao preservados. |
locale |
Idioma dos rotulos: |
Um fator ordenado com os rotulos de classe.
classify_iqa(c(15, 40, 65, 80, 95)) classify_iqa(c(15, 40, 65, 80, 95), locale = "en")classify_iqa(c(15, 40, 65, 80, 95)) classify_iqa(c(15, 40, 65, 80, 95), locale = "en")
Converte valores do indice trofico de Carlson (TSI/IET) para classes qualitativas ordenadas. Retorna fator ordenado em portugues ("pt") ou ingles ("en").
classify_tsi_carlson(x, locale = c("pt", "en"))classify_tsi_carlson(x, locale = c("pt", "en"))
x |
Vetor numerico com TSI/IET (0-100). NA preservado. |
locale |
Idioma dos rotulos: |
Fator ordenado com classes de trofia.
classify_tsi_carlson(c(25, 35, 45, 60, 80)) classify_tsi_carlson(c(25, 35, 45, 60, 80), locale = "en")classify_tsi_carlson(c(25, 35, 45, 60, 80)) classify_tsi_carlson(c(25, 35, 45, 60, 80), locale = "en")
Converte valores do indice trofico de Lamparelli (TSI/IET) para classes qualitativas ordenadas. Retorna fator ordenado em portugues ("pt") ou ingles ("en").
classify_tsi_lamparelli(x, locale = c("pt", "en"))classify_tsi_lamparelli(x, locale = c("pt", "en"))
x |
Vetor numerico com TSI/IET (0-100). NA preservado. |
locale |
Idioma dos rotulos: |
Fator ordenado com classes de trofia (Lamparelli).
classify_tsi_lamparelli(c(40, 50, 56, 61, 65, 72)) classify_tsi_lamparelli(c(40, 50, 56, 61, 65, 72), locale = "en")classify_tsi_lamparelli(c(40, 50, 56, 61, 65, 72)) classify_tsi_lamparelli(c(40, 50, 56, 61, 65, 72), locale = "en")
Normalizes units for water quality parameters. Currently handles common conversions (mg/L to µg/L for phosphorus, unit standardization). Also validates expected unit ranges and emits warnings for values outside typical ranges.
clean_units(df, units_map = NULL)clean_units(df, units_map = NULL)
df |
Input data frame / tibble. |
units_map |
Optional named list mapping parameter names to target units (currently used for validation only). |
This function is designed as an extension point. Future versions may implement actual unit conversions based on metadata or user specifications.
The input df with normalized units. Currently performs:
Validation of unit ranges (warns if values are outside typical ranges)
No actual conversions are performed (returns input unchanged)
df <- data.frame(ph = c(7, 7.2), od = c(6.5, 7.0), p_total = c(0.05, 0.08)) clean_units(df)df <- data.frame(ph = c(7, 7.2), od = c(6.5, 7.0), p_total = c(0.05, 0.08)) clean_units(df)
For each parameter present in df, adds columns:
*_ok (logical),
*_status one of "ok", "acima_do_maximo", "abaixo_do_minimo",
*__lim_min and *__lim_max (thresholds used),
*__delta (difference to the relevant limit; >0 above max, <0 below min, 0 if ok).
If multiple limit rows exist for the same parameter, *_ok is TRUE if
any row is satisfied; for status/lim_min/lim_max/delta, the first
satisfied row is chosen; if none satisfy, the row with the smallest
absolute violation (min |delta|) is used.
conama_check(df, classe = "2")conama_check(df, classe = "2")
df |
A tibble/data.frame with parameter columns (e.g., ph, turbidez, od, dbo). |
classe |
Character class label (e.g., "especial", "1", "2", "3", "4"). |
The input df with additional columns per parameter as described.
conama_limits(), conama_summary(), conama_report(), conama_text()
## Not run: data("wq_demo", package = "tikatuwq") head(conama_check(wq_demo, classe = "2")) ## End(Not run)## Not run: data("wq_demo", package = "tikatuwq") head(conama_check(wq_demo, classe = "2")) ## End(Not run)
Returns the parameter limits defined by CONAMA Resolution 357/2005 for a given water-use class.
conama_limits(class)conama_limits(class)
class |
Integer or character. Target class (e.g., 1, 2, 3, 4 or "special"), according to CONAMA 357/2005. |
A tibble/data frame with one row per parameter and regulatory thresholds. Typical columns:
parametro: parameter name (character, normalized to snake_case)
classe: class label (character)
min/max (or equivalents): numeric thresholds (may be NA)
other metadata columns if present (e.g., unit, criterion)
# Class 2 thresholds (first rows) head(conama_limits(2))# Class 2 thresholds (first rows) head(conama_limits(2))
CONAMA conformity report (table)
conama_report( df, classe = "2", only_violations = TRUE, pretty = FALSE, decimal_mark = ",", big_mark = "." )conama_report( df, classe = "2", only_violations = TRUE, pretty = FALSE, decimal_mark = ",", big_mark = "." )
df |
Input data |
classe |
CONAMA class label (e.g., "2") |
only_violations |
If TRUE, returns only rows with |
pretty |
If TRUE, returns formatted numeric columns for display |
decimal_mark |
Decimal separator (default |
big_mark |
Thousands separator (default |
A tibble. When pretty = FALSE:
parametro, valor, lim_min, lim_max,
status, delta. When pretty = TRUE, numeric columns
are formatted as character with "natural" decimals.
conama_summary(), conama_text()
## Not run: data("wq_demo", package = "tikatuwq") conama_report(wq_demo, classe = "2", only_violations = TRUE) conama_report(wq_demo, classe = "2", only_violations = TRUE, pretty = TRUE) ## End(Not run)## Not run: data("wq_demo", package = "tikatuwq") conama_report(wq_demo, classe = "2", only_violations = TRUE) conama_report(wq_demo, classe = "2", only_violations = TRUE, pretty = TRUE) ## End(Not run)
CONAMA conformity summary (long format)
conama_summary(df, classe = "2")conama_summary(df, classe = "2")
df |
Input data |
classe |
CONAMA class label |
A tibble with columns:
parametro, valor, lim_min, lim_max,
status, ok, delta.
conama_check(), conama_report(), conama_text()
## Not run: data("wq_demo", package = "tikatuwq") head(conama_summary(wq_demo, classe = "2")) ## End(Not run)## Not run: data("wq_demo", package = "tikatuwq") head(conama_summary(wq_demo, classe = "2")) ## End(Not run)
Text summary of conformity (bulleted, formatted)
conama_text( df, classe = "2", only_violations = FALSE, decimal_mark = ",", big_mark = "." )conama_text( df, classe = "2", only_violations = FALSE, decimal_mark = ",", big_mark = "." )
df |
Input data |
classe |
CONAMA class label |
only_violations |
If TRUE, list only parameters with violation |
decimal_mark |
Decimal separator (default |
big_mark |
Thousands separator (default |
Character vector of lines (first line is a header, the rest are bullets).
conama_summary(), conama_report()
## Not run: data("wq_demo", package = "tikatuwq") cat(conama_text(wq_demo, classe = "2"), sep = "\n") ## End(Not run)## Not run: data("wq_demo", package = "tikatuwq") cat(conama_text(wq_demo, classe = "2"), sep = "\n") ## End(Not run)
Normaliza latitude/longitude quando vierem em graus multiplicados por 1e7 (padrao de alguns exports de GPS) e invalida valores fora dos limites.
fix_coords(df, lat = "lat", lon = "lon", divisor = 1e+07)fix_coords(df, lat = "lat", lon = "lon", divisor = 1e+07)
df |
data.frame de entrada. |
lat |
Nome da coluna de latitude (padrao: "lat"). |
lon |
Nome da coluna de longitude (padrao: "lon"). |
divisor |
Se abs(valor) exceder os limites, divide por este numero (padrao 1e7). |
O df com lat/lon corrigidos quando presentes.
# d <- data.frame(lat = -155432345, lon = -393212345) # fix_coords(d)# d <- data.frame(lat = -155432345, lon = -393212345) # fix_coords(d)
Produz 3–5 paragrafos curtos, legiveis por humanos, resumindo a qualidade da agua a partir de IQA/WQI, conformidade com a CONAMA 357/2005 e (opcionalmente) tendencias temporais simples. E rule-based (nao usa IA) e aceita metadados opcionais para compor o texto.
generate_analysis( df, classe_conama = "2", incluir_tendencia = TRUE, parametros_tendencia = c("turbidez", "od", "pH"), contexto = list(rio = NA, periodo = NA, cidade = NA) )generate_analysis( df, classe_conama = "2", incluir_tendencia = TRUE, parametros_tendencia = c("turbidez", "od", "pH"), contexto = list(rio = NA, periodo = NA, cidade = NA) )
df |
Data frame contendo ao menos a coluna |
classe_conama |
Character (ex. "2"). Classe-alvo para a checagem da Resolucao CONAMA 357/2005. |
incluir_tendencia |
Logical; se |
parametros_tendencia |
Character vector; nomes dos parametros para testar tendencia temporal. |
contexto |
Lista com metadados opcionais (PT/EN), por exemplo
|
Vetor character com 3 a 5 paragrafos analiticos prontos para relatorio.
## Not run: library(tikatuwq) data("wq_demo") txt <- generate_analysis( df = wq_demo, classe_conama = "2", incluir_tendencia = TRUE, parametros_tendencia = c("turbidez","od","pH"), contexto = list(rio = "Rio Azul", periodo = "jan–jun/2025") ) cat(paste(txt, collapse = "\n\n")) ## End(Not run)## Not run: library(tikatuwq) data("wq_demo") txt <- generate_analysis( df = wq_demo, classe_conama = "2", incluir_tendencia = TRUE, parametros_tendencia = c("turbidez","od","pH"), contexto = list(rio = "Rio Azul", periodo = "jan–jun/2025") ) cat(paste(txt, collapse = "\n\n")) ## End(Not run)
Computa o indice trofico de Carlson (TSI/IET) a partir de profundidade de disco de Secchi, clorofila-a e fosforo total. Retorna componentes e o IET como media por linha dos componentes disponiveis.
Pode receber um data.frame como primeiro argumento (ver Detalhes).
iet_carlson( secchi = NULL, clorofila = NULL, tp = NULL, .keep_ids = FALSE, add_status = TRUE, locale = c("pt", "en"), ... )iet_carlson( secchi = NULL, clorofila = NULL, tp = NULL, .keep_ids = FALSE, add_status = TRUE, locale = c("pt", "en"), ... )
secchi |
Vetor numerico com profundidade de Secchi (m) ou
um data.frame contendo colunas |
clorofila |
Vetor numerico com clorofila-a (ug/L). |
tp |
Vetor numerico com fosforo total (ug/L). |
.keep_ids |
Logico; quando data.frame, vincula colunas de ID
comuns ( |
add_status |
Logico; se |
locale |
Idioma de |
... |
Reservado para uso futuro (ignorado). |
Formulas implementadas (Carlson 1977):
TSI_Secchi = 60 - 14.41 * log10(secchi)
TSI_Chla = 9.81 * log10(clorofila) + 30.6
TSI_TP = 14.42 * log10(tp) + 4.15
Quando um data.frame e fornecido, strings com virgula decimal (ex.: "3,2")
ou sinais de desigualdade (ex.: "<0,1") sao convertidas com seguranca.
Se existir p_total (mg/L) em vez de tp (ug/L),
e feita conversao interna (tp = p_total * 1000).
Os componentes e o IET final sao limitados ao intervalo [0, 100]
para manter consistencia com as figuras e tabelas do pacote/artigo.
Um data.frame com colunas (quando aplicavel):
TSI_Secchi — componente de Secchi (0-100).
TSI_Chla — componente de clorofila-a (0-100).
TSI_TP — componente de fosforo total (0-100).
IET — indice Carlson agregado (media por linha, 0-100).
TSI_status — classe qualitativa (quando add_status=TRUE).
Carlson, R. E. (1977). A trophic state index for lakes. Limnology and Oceanography, 22(2), 361-369. doi:10.4319/lo.1977.22.2.0361
iet_lamparelli(),
iqa(), conama_check()
# Vetores secchi <- c(1.2, 0.8, 0.4) # m clorofila <- c(5, 12, 30) # ug/L tp <- c(20, 40, 70) # ug/L iet_carlson(secchi = secchi, clorofila = clorofila, tp = tp) # Data frame # df <- data.frame(secchi = secchi, clorofila = clorofila, p_total = c(0.02, 0.04, 0.07)) # iet_carlson(df) # converte p_total -> tp (ug/L) # iet_carlson(df, .keep_ids = TRUE)# Vetores secchi <- c(1.2, 0.8, 0.4) # m clorofila <- c(5, 12, 30) # ug/L tp <- c(20, 40, 70) # ug/L iet_carlson(secchi = secchi, clorofila = clorofila, tp = tp) # Data frame # df <- data.frame(secchi = secchi, clorofila = clorofila, p_total = c(0.02, 0.04, 0.07)) # iet_carlson(df) # converte p_total -> tp (ug/L) # iet_carlson(df, .keep_ids = TRUE)
Computa componentes do indice trofico de Lamparelli (TSI/IET) a partir de fosforo total, clorofila-a e profundidade do disco de Secchi, e retorna o indice agregado como a media por linha dos componentes disponiveis.
Pode receber um data.frame como primeiro argumento (ver Detalhes).
iet_lamparelli( tp = NULL, chla = NULL, sd = NULL, ambiente = c("rio", "reservatorio"), .keep_ids = FALSE, add_status = TRUE, locale = c("pt", "en"), ... )iet_lamparelli( tp = NULL, chla = NULL, sd = NULL, ambiente = c("rio", "reservatorio"), .keep_ids = FALSE, add_status = TRUE, locale = c("pt", "en"), ... )
tp |
Fosforo total (mg/L) ou um data.frame contendo colunas
|
chla |
Clorofila-a (ug/L). |
sd |
Profundidade do disco de Secchi (m). |
ambiente |
Tipo de ambiente: |
.keep_ids |
Logico; quando data.frame, vincula colunas de ID
( |
add_status |
Logico; se |
locale |
Idioma de |
... |
Reservado para uso futuro (ignorado). |
Implementacao pragmatica; confirme coeficientes/limiares para seu
contexto regulatorio. Entradas com virgula decimal (ex.: "3,2") ou
desigualdades (ex.: "<0,1") sao convertidas com seguranca por
helpers internos. Se houver apenas p_total (mg/L), e convertida
para tp (ug/L) via tp = p_total * 1000.
Os componentes e o indice agregado sao limitados ao intervalo [0, 100]
para consistencia com as figuras e tabelas do pacote/artigo.
Um data.frame com colunas (quando aplicavel):
IET_TP — componente de fosforo total (0-100).
IET_Chla — componente de clorofila-a (0-100).
IET_Secchi — componente de Secchi (0-100).
IET_Lamp — indice Lamparelli agregado (0-100).
TSI_status — classe qualitativa (quando add_status=TRUE).
ambiente — tipo de ambiente informado.
iet_carlson(), iqa(),
conama_check()
Computa o IQA/WQI combinando subindices (Qi) por media ponderada. Os subindices sao obtidos por interpolacao linear por trechos sobre curvas aproximadas (estilo CETESB/NSF).
iqa( df, pesos = c(od = 0.17, coliformes = 0.15, dbo = 0.1, nt_total = 0.1, p_total = 0.1, turbidez = 0.08, tds = 0.08, pH = 0.12, temperatura = 0.1), method = c("CETESB_approx"), na_rm = FALSE, add_status = TRUE, locale = c("pt", "en"), ... )iqa( df, pesos = c(od = 0.17, coliformes = 0.15, dbo = 0.1, nt_total = 0.1, p_total = 0.1, turbidez = 0.08, tds = 0.08, pH = 0.12, temperatura = 0.1), method = c("CETESB_approx"), na_rm = FALSE, add_status = TRUE, locale = c("pt", "en"), ... )
df |
Data frame (ou tibble) com as colunas requeridas.
Nomes esperados (portugues): |
pesos |
Pesos nomeados para cada parametro. Padroes seguem pratica
CETESB/NSF: |
method |
Conjunto de curvas de interpolacao; atualmente apenas
|
na_rm |
Logico; se |
add_status |
Logico; se |
locale |
Idioma de |
... |
Reservado para uso futuro (ignorado). |
Compatibilidade de nomes:
A tabela de curvas usa a chave "pH".
Se seus dados possuem ph (minusculo), a curva "pH"
e mapeada para a coluna ph.
Para temperatura, a coluna temp (alias comum)
e automaticamente aceita caso temperatura nao exista.
Se as curvas internas retornarem Qi em 0-10 (variante historica),
o valor agregado e normalizado internamente para 0-100 antes do retorno.
Valores finais sao limitados ao intervalo [0, 100].
O df de entrada com a coluna numerica IQA (0-100) e,
quando add_status = TRUE, a coluna fator IQA_status.
O atributo "iqa_method" e definido no objeto retornado.
d <- wq_demo d2 <- iqa(d, na_rm = TRUE) table(d2$IQA_status, useNA = "ifany")d <- wq_demo d2 <- iqa(d, na_rm = TRUE) table(d2$IQA_status, useNA = "ifany")
Computes a prototype NSF WQI as a weighted arithmetic mean of parameter sub-scores (Qi) using simple piecewise rules. This is intended for quick demonstrations and is not a full replication of the original NSF curves.
nsfwqi( df, pesos = c(do = 0.17, fc = 0.16, ph = 0.11, bod = 0.11, temp_change = 0.1, po4 = 0.1, no3 = 0.1, turbidez = 0.08, sst = 0.07), na_rm = FALSE )nsfwqi( df, pesos = c(do = 0.17, fc = 0.16, ph = 0.11, bod = 0.11, temp_change = 0.1, po4 = 0.1, no3 = 0.1, turbidez = 0.08, sst = 0.07), na_rm = FALSE )
df |
Data frame containing columns compatible with the mapping above. |
pesos |
Named numeric vector with parameter weights. Defaults follow a
common NSF WQI variant:
|
na_rm |
Logical; allow NA per row and rescale weights to available
parameters ( |
The function accepts both NSF-style column names and common Brazilian aliases. The mapping tried (if present) is:
do <- od
fc <- coliformes
ph <- pH or ph
bod <- dbo
turbidez stays turbidez
sst <- solidos_suspensos
po4 <- po4 or p_ortofosfato
no3 <- no3 or n_nitrato
temp_change must be supplied as-is (delta T to reference)
If na_rm = TRUE, weights are rescaled per row to the parameters
available in that row. If na_rm = FALSE (default), any missing
required input leads to an error.
The input df with an added numeric column NSFWQI.
d <- wq_demo # create minimal aliases so the prototype can run d$do <- d$od d$fc <- d$coliformes d$ph <- d$ph d$bod <- d$dbo # others are missing; use na_rm = TRUE to rescale weights by row out <- nsfwqi(d, na_rm = TRUE) head(out$NSFWQI)d <- wq_demo # create minimal aliases so the prototype can run d$do <- d$od d$fc <- d$coliformes d$ph <- d$ph d$bod <- d$dbo # others are missing; use na_rm = TRUE to rescale weights by row out <- nsfwqi(d, na_rm = TRUE) head(out$NSFWQI)
Gera grafico temporal para um parametro, com opcoes de filtro por rios
e/ou pontos. Se houver mais de um ponto, a cor diferencia pontos; opcional
facet = TRUE para facetar por ponto. Pode adicionar reta de tendencia com
add_trend = TRUE (lm).
param_plot( df, parametro, rios = NULL, pontos = NULL, add_trend = TRUE, facet = FALSE )param_plot( df, parametro, rios = NULL, pontos = NULL, add_trend = TRUE, facet = FALSE )
df |
Data frame com |
parametro |
Character; nome do parametro. |
rios |
Vetor de nomes de rio a filtrar (opcional; usa coluna |
pontos |
Vetor de pontos a filtrar (opcional; usa coluna |
add_trend |
Logical; se |
facet |
Logical; se |
Objeto ggplot.
Other parameter-tools:
param_plot_multi(),
param_summary(),
param_summary_multi(),
param_trend(),
param_trend_multi()
## Not run: data("wq_demo", package = "tikatuwq") param_plot(wq_demo, "turbidez", pontos = c("P1","P2"), add_trend = TRUE, facet = TRUE) ## End(Not run)## Not run: data("wq_demo", package = "tikatuwq") param_plot(wq_demo, "turbidez", pontos = c("P1","P2"), add_trend = TRUE, facet = TRUE) ## End(Not run)
Combina varios parametros em um unico grafico. Por padrao:
cor = ponto (se existir);
facet = "parametro" cria paineis por parametro;
facet = "grid" usa grade ponto ~ parametro quando ha mais de um ponto.
param_plot_multi( df, parametros, rios = NULL, pontos = NULL, add_trend = TRUE, facet = c("parametro", "none", "grid") )param_plot_multi( df, parametros, rios = NULL, pontos = NULL, add_trend = TRUE, facet = c("parametro", "none", "grid") )
df |
Data frame com |
parametros |
Vetor de nomes de parametros. |
rios |
Vetor de rios para filtrar (opcional; usa coluna |
pontos |
Vetor de pontos para filtrar (opcional; usa coluna |
add_trend |
Logical; se TRUE, adiciona reta |
facet |
"parametro", "none" ou "grid". |
Objeto ggplot.
Other parameter-tools:
param_plot(),
param_summary(),
param_summary_multi(),
param_trend(),
param_trend_multi()
## Not run: data("wq_demo", package = "tikatuwq") param_plot_multi(wq_demo, c("turbidez","od"), pontos = c("P1","P2"), add_trend = TRUE, facet = "grid") ## End(Not run)## Not run: data("wq_demo", package = "tikatuwq") param_plot_multi(wq_demo, c("turbidez","od"), pontos = c("P1","P2"), add_trend = TRUE, facet = "grid") ## End(Not run)
Produz resumo estatistico para um parametro, com opcoes de filtro por
rios e/ou pontos e agregacao opcional por periodo (mes/trimestre/ano),
quando houver coluna data.
param_summary( df, parametro, rios = NULL, pontos = NULL, period = c("none", "month", "quarter", "year"), na_rm = TRUE )param_summary( df, parametro, rios = NULL, pontos = NULL, period = c("none", "month", "quarter", "year"), na_rm = TRUE )
df |
Data frame com ao menos a coluna do |
parametro |
Character; nome do parametro (ex.: "turbidez", "od", "pH"). |
rios |
Vetor de nomes de rio a filtrar (opcional; usa coluna |
pontos |
Vetor de pontos a filtrar (opcional; usa coluna |
period |
"none", "month", "quarter" ou "year" para agregar por periodo
(requer coluna |
na_rm |
Remover |
Tibble com colunas de agrupamento disponiveis (rio, ponto, periodo)
e metricas: n, mean, sd, min, median, max.
Other parameter-tools:
param_plot(),
param_plot_multi(),
param_summary_multi(),
param_trend(),
param_trend_multi()
## Not run: data("wq_demo", package = "tikatuwq") param_summary(wq_demo, "turbidez", pontos = "P1") param_summary(wq_demo, "od", rios = "Rio Azul", period = "month") ## End(Not run)## Not run: data("wq_demo", package = "tikatuwq") param_summary(wq_demo, "turbidez", pontos = "P1") param_summary(wq_demo, "od", rios = "Rio Azul", period = "month") ## End(Not run)
Itera sobre um vetor de parametros, chamando param_summary() para cada um,
e combina as saidas em uma unica tabela, acrescentando a coluna parametro.
param_summary_multi( df, parametros, rios = NULL, pontos = NULL, period = c("none", "month", "quarter", "year"), na_rm = TRUE )param_summary_multi( df, parametros, rios = NULL, pontos = NULL, period = c("none", "month", "quarter", "year"), na_rm = TRUE )
df |
Data frame com colunas necessarias (ver |
parametros |
Vetor de nomes de parametros (ex.: c("turbidez","od","pH")). |
rios |
Vetor de rios para filtrar (opcional; usa coluna |
pontos |
Vetor de pontos para filtrar (opcional; usa coluna |
period |
"none","month","quarter","year" (igual a |
na_rm |
Logical; repassado para |
Tibble combinando os resumos de todos os parametros,
com coluna parametro indicando a origem.
Other parameter-tools:
param_plot(),
param_plot_multi(),
param_summary(),
param_trend(),
param_trend_multi()
## Not run: data("wq_demo", package = "tikatuwq") param_summary_multi(wq_demo, c("turbidez","od"), pontos = c("P1","P2")) ## End(Not run)## Not run: data("wq_demo", package = "tikatuwq") param_summary_multi(wq_demo, c("turbidez","od"), pontos = c("P1","P2")) ## End(Not run)
Ajusta um modelo lm(valor ~ tempo) para um parametro, retornando
slope, p_value, r2 e n. Se existirem colunas rio e/ou ponto,
calcula por grupo; caso contrario, calcula geral.
param_trend(df, parametro, rios = NULL, pontos = NULL, na_rm = TRUE)param_trend(df, parametro, rios = NULL, pontos = NULL, na_rm = TRUE)
df |
Data frame com |
parametro |
Character; nome do parametro. |
rios |
Vetor de nomes de rio a filtrar (opcional; usa coluna |
pontos |
Vetor de pontos a filtrar (opcional; usa coluna |
na_rm |
Remover |
Tibble com colunas de agrupamento (quando existirem) + slope (por dia),
p_value, r2, n.
Other parameter-tools:
param_plot(),
param_plot_multi(),
param_summary(),
param_summary_multi(),
param_trend_multi()
## Not run: data("wq_demo", package = "tikatuwq") param_trend(wq_demo, "turbidez", pontos = c("P1","P2")) ## End(Not run)## Not run: data("wq_demo", package = "tikatuwq") param_trend(wq_demo, "turbidez", pontos = c("P1","P2")) ## End(Not run)
Itera sobre um vetor de parametros, chamando param_trend() para cada um,
e combina as saidas em uma unica tabela, acrescentando a coluna parametro.
param_trend_multi(df, parametros, rios = NULL, pontos = NULL, na_rm = TRUE)param_trend_multi(df, parametros, rios = NULL, pontos = NULL, na_rm = TRUE)
df |
Data frame com |
parametros |
Vetor de nomes de parametros. |
rios |
Vetor de rios (opcional; usa coluna |
pontos |
Vetor de pontos (opcional; usa coluna |
na_rm |
Logical; repassado para |
Tibble combinando as tendencias de todos os parametros,
com coluna parametro.
Other parameter-tools:
param_plot(),
param_plot_multi(),
param_summary(),
param_summary_multi(),
param_trend()
## Not run: data("wq_demo", package = "tikatuwq") param_trend_multi(wq_demo, c("turbidez","od"), pontos = "P1") ## End(Not run)## Not run: data("wq_demo", package = "tikatuwq") param_trend_multi(wq_demo, c("turbidez","od"), pontos = "P1") ## End(Not run)
Boxplots of one numeric parameter grouped by a categorical column.
plot_box(df, parametro, by = "ponto")plot_box(df, parametro, by = "ponto")
df |
Data frame with water quality data. |
parametro |
Character; name of the numeric parameter column. |
by |
Character; grouping column (e.g., "ponto"). |
A ggplot object.
plot_series(), plot_heatmap(), iqa()
data(wq_demo) plot_box(wq_demo, "turbidez", by = "ponto")data(wq_demo) plot_box(wq_demo, "turbidez", by = "ponto")
Heatmap for long-format data (date x parameter).
plot_heatmap(df_long)plot_heatmap(df_long)
df_long |
Long-format data frame with columns |
A ggplot object.
# Example: reshape wq_demo to long and plot data(wq_demo) library(tidyr) df_long <- tidyr::pivot_longer( wq_demo, cols = c("ph","od","turbidez","dbo"), names_to = "parametro", values_to = "valor" ) plot_heatmap(df_long)# Example: reshape wq_demo to long and plot data(wq_demo) library(tidyr) df_long <- tidyr::pivot_longer( wq_demo, cols = c("ph","od","turbidez","dbo"), names_to = "parametro", values_to = "valor" ) plot_heatmap(df_long)
Bar plot of IQA values per site/date. Requires an IQA column.
plot_iqa(df)plot_iqa(df)
df |
Data frame returned by |
A ggplot object.
iqa(), plot_series(), plot_box()
data(wq_demo) d <- iqa(wq_demo, na_rm = TRUE) plot_iqa(d)data(wq_demo) d <- iqa(wq_demo, na_rm = TRUE) plot_iqa(d)
Creates an interactive Leaflet map of sampling points using the default
Leaflet marker (blue pin). Latitude/longitude are autodetected from
columns lat and lon. If these columns are not present, but
latitude and/or longitude exist, they are automatically
copied to lat and lon. You may group layers with
group_by (e.g., "year") and show popups with popup.
If color_by is provided, a legend is drawn to describe the values,
but markers are not colorized (the default Leaflet pin has fixed
style).
plot_map( df, color_by = NULL, popup = NULL, group_by = NULL, legend_title = NULL, na_rm = TRUE )plot_map( df, color_by = NULL, popup = NULL, group_by = NULL, legend_title = NULL, na_rm = TRUE )
df |
data.frame/tibble with coordinates; must contain |
color_by |
optional column used to build a legend (numeric or factor). It does not change the marker color. |
popup |
optional column name with popup/tooltip text. |
group_by |
optional column name to create overlay layers (e.g., "year"). |
legend_title |
optional legend title (used when |
na_rm |
logical; if |
The function expects coordinates in columns named lat and lon.
If those columns are not found, but latitude and/or longitude
are present, they are copied to lat and lon respectively
before plotting.
a leaflet htmlwidget.
data("wq_demo", package = "tikatuwq") d2 <- wq_demo |> validate_wq() |> iqa(na_rm = TRUE) d2$year <- as.integer(format(d2$data, "%Y")) # Marcadores padrao + legenda de IQA plot_map(d2, color_by = "IQA", group_by = "year", popup = "ponto", legend_title = "IQA (0–100)")data("wq_demo", package = "tikatuwq") d2 <- wq_demo |> validate_wq() |> iqa(na_rm = TRUE) d2$year <- as.integer(format(d2$data, "%Y")) # Marcadores padrao + legenda de IQA plot_map(d2, color_by = "IQA", group_by = "year", popup = "ponto", legend_title = "IQA (0–100)")
Plot a time series for one numeric parameter, optionally colored/faceted by a grouping column.
plot_series(df, parametro, facet = NULL)plot_series(df, parametro, facet = NULL)
df |
Data frame with a |
parametro |
Character; name of the numeric column to plot on Y. |
facet |
Character or |
A ggplot object.
plot_box(), plot_heatmap(), iqa()
data(wq_demo) # Basic: time series of turbidity p <- plot_series(wq_demo, "turbidez") # With color/facet by sampling point p2 <- plot_series(wq_demo, "turbidez", facet = "ponto")data(wq_demo) # Basic: time series of turbidity p <- plot_series(wq_demo, "turbidez") # With color/facet by sampling point p2 <- plot_series(wq_demo, "turbidez", facet = "ponto")
Gera um grafico de series temporais com pontos observados e linhas de tendencia ajustadas. Suporta metodos robustos (Theil-Sen), lineares (OLS) ou suavizados (LOESS). Util para verificar tendencias de parametros ambientais por ponto e/ou rio.
plot_trend( data, param, date_col = "data", group_cols = c("rio", "ponto"), method = c("theilsen", "ols", "loess"), show_points = TRUE, min_n = 6 )plot_trend( data, param, date_col = "data", group_cols = c("rio", "ponto"), method = c("theilsen", "ols", "loess"), show_points = TRUE, min_n = 6 )
data |
data.frame. Deve conter ao menos uma coluna de datas e a coluna do parametro a ser analisado. |
param |
character. Nome da coluna do parametro (ex.: "turbidez", "iqa"). |
date_col |
character. Nome da coluna de datas. Default = "data". |
group_cols |
character. Vetor com colunas para agrupamento (ex.: c("rio","ponto")). Use "none" para nao facetar. Default = c("rio","ponto"). |
method |
character. Metodo de ajuste da tendencia:
|
show_points |
logical. Mostrar pontos observados? Default = TRUE. |
min_n |
integer. Numero minimo de observacoes por grupo para calcular tendencia. Default = 6. |
A funcao desenha pontos e linhas conectando as observacoes, alem da linha de tendencia calculada pelo metodo escolhido.
Quando group_cols possui mais de uma categoria, os grupos sao facetados.
"theilsen" e mais robusto a valores atipicos do que "ols".
"loess" e util quando nao se espera relacao linear no tempo.
Objeto ggplot2, que pode ser plotado diretamente.
# Exemplo simples: turbidez com tendencia Theil-Sen set.seed(1) df <- data.frame( data = as.Date("2024-01-01") + 0:11*30, rio = "Demo", ponto = "P1", turbidez = 20 + (-0.3)*(0:11) + rnorm(12, 0, 1) ) plot_trend(df, param = "turbidez", method = "theilsen") # Exemplo com multiplos grupos e facetamento (OLS) df2 <- data.frame( data = rep(seq(as.Date("2024-01-01"), by = "30 days", length.out = 12), 2), rio = rep(c("Rio A","Rio B"), each = 12), ponto = rep(c("P1","P2"), each = 12), od = c(7 + rnorm(12, 0, 0.5), 6 + rnorm(12, 0, 0.5)) ) plot_trend(df2, param = "od", method = "ols")# Exemplo simples: turbidez com tendencia Theil-Sen set.seed(1) df <- data.frame( data = as.Date("2024-01-01") + 0:11*30, rio = "Demo", ponto = "P1", turbidez = 20 + (-0.3)*(0:11) + rnorm(12, 0, 1) ) plot_trend(df, param = "turbidez", method = "theilsen") # Exemplo com multiplos grupos e facetamento (OLS) df2 <- data.frame( data = rep(seq(as.Date("2024-01-01"), by = "30 days", length.out = 12), 2), rio = rep(c("Rio A","Rio B"), each = 12), ponto = rep(c("P1","P2"), each = 12), od = c(7 + rnorm(12, 0, 0.5), 6 + rnorm(12, 0, 0.5)) ) plot_trend(df2, param = "od", method = "ols")
Le um CSV com delimitador virgula ou ponto-e-virgula e virgula ou ponto
como separador decimal, ignorando sufixos de unidade (ex.: "0,04 mg/L").
Le tudo como texto primeiro, normaliza nomes, e faz parse robusto de colunas
numericas. Ajusta pH evidentemente fora de faixa (ex.: 72 -> 7.2). Opcionalmente
normaliza coordenadas geograficas se vierem em graus * 1e7.
read_wq( path, tz = "America/Bahia", normalize_coords = TRUE, nd_policy = c("ld2", "ld", "zero", "na") )read_wq( path, tz = "America/Bahia", normalize_coords = TRUE, nd_policy = c("ld2", "ld", "zero", "na") )
path |
Caminho para o arquivo CSV. |
tz |
Fuso horario para datas (mantido por compatibilidade; datas sao |
normalize_coords |
Logico; se |
nd_policy |
Politica para valores censurados (ND/<LD/<LOQ). Opcoes:
|
Um tibble com:
nomes de colunas normalizados (minusculas, espacos -> _, sem nao-alfanum);
colunas numericas parseadas ignorando strings de unidade;
data parseada para Date (tenta ymd e depois dmy);
ponto coerido para character (quando presente);
lat/lon corrigidos quando normalize_coords = TRUE.
c("ph","od","turbidez","dbo","coliformes","p_total","ptotal",
"fosforo_total","temperatura","ec","condutividade","n_nitrato","n_nitrito",
"amonia","nt_total","n_total","ntk","nkjeldahl","nitrogenio_total",
"solidos_totais","solidos_suspensos","tds","conducao","qi","iqa","iet",
"iet_carlson","iet_lamparelli","nsfwqi","vazao","lat","lon")
O pacote implementa uma politica explicita para tratamento de valores censurados.
Valores como "<0.01", "<LD", "<LOD", "<LOQ", "ND"
sao detectados e tratados conforme a politica especificada em nd_policy.
O padrao "ld2" usa metade do limite de deteccao (recomendacao conservadora).
clean_units(), validate_wq(), conama_check(), iqa()
## Not run: tmp <- tempfile(fileext = ".csv") writeLines( c("ponto;data;ph;od;turbidez;lat;lon", "R1_01;2025-01-20;7,2;6,8;5,1;-163456789;-396543210", "R1_01;21/01/2025;7.1;7.0;4.8 mg/L;-16.3456789;-39.6543210"), tmp ) x <- read_wq(tmp) str(x) ## End(Not run)## Not run: tmp <- tempfile(fileext = ".csv") writeLines( c("ponto;data;ph;od;turbidez;lat;lon", "R1_01;2025-01-20;7,2;6,8;5,1;-163456789;-396543210", "R1_01;21/01/2025;7.1;7.0;4.8 mg/L;-16.3456789;-39.6543210"), tmp ) x <- read_wq(tmp) str(x) ## End(Not run)
Renders an HTML report using the package's internal R Markdown template. By default, the output is written to a temporary directory to comply with CRAN policies. The function returns (invisibly) the full path to the generated file.
render_report( df, meta = list(river = NA, period = NA), output_file = "wq_report.html", output_dir = tempdir(), template = system.file("templates", "report_rmd.Rmd", package = "tikatuwq") )render_report( df, meta = list(river = NA, period = NA), output_file = "wq_report.html", output_dir = tempdir(), template = system.file("templates", "report_rmd.Rmd", package = "tikatuwq") )
df |
Data frame with the input data used by the template. |
meta |
Named list with contextual metadata (e.g., |
output_file |
File name for the report (default |
output_dir |
Directory where the file will be written (default |
template |
Path to the internal template file. Defaults to the package
Rmd template shipped under |
The template expects a data frame with columns compatible with the package
(e.g., ponto, data, parameters used by IQA/CONAMA checks). You can pass
optional metadata via meta, such as river and period.
This function relies on rmarkdown (listed in Suggests). If the package is not available, an informative error is thrown.
Invisible character string: the absolute path to the generated report.
The default output directory is tempdir() to comply with CRAN policies.
All files (including intermediate files generated during rendering) are
written only to output_dir or temporary directories, never to the package
installation directory.
The template is an Rmd (R Markdown). If you prefer Quarto, provide a
custom template path to a .qmd and ensure your environment supports it.
rmarkdown::render()
# Minimal example (writes to a temporary directory) d <- wq_demo path <- render_report(d, meta = list(river = "Example River", period = "Jan–Feb")) file.exists(path)# Minimal example (writes to a temporary directory) d <- wq_demo path <- render_report(d, meta = list(river = "Example River", period = "Jan–Feb")) file.exists(path)
Computes basic descriptive statistics (mean, median, sd) for all numeric
columns in df, grouped by one or more keys.
resume_wq(df, by = c("ponto", "mes"), funs = c("mean", "median", "sd"))resume_wq(df, by = c("ponto", "mes"), funs = c("mean", "median", "sd"))
df |
A data frame or tibble. |
by |
Character vector with grouping column names (default |
funs |
Deprecated (kept for compatibility; ignored). The function
always computes |
Grouping columns not found in df are silently dropped.
If no grouping columns remain, an error is thrown.
Only numeric columns are summarized; if none exist, an error is thrown.
Missing values are ignored (na.rm = TRUE).
A tibble with the grouping keys and one column per
statistic/variable, named as {var}_{stat} (e.g., od_mean, od_median, od_sd).
dplyr::summarise(), dplyr::across()
# Using the demo dataset shipped with the package d <- wq_demo # Example: group by point (ponto) s1 <- resume_wq(d, by = "ponto") head(s1) # Example: group by point and month (if 'mes' exists in your data) # s2 <- resume_wq(d, by = c("ponto", "mes"))# Using the demo dataset shipped with the package d <- wq_demo # Example: group by point (ponto) s1 <- resume_wq(d, by = "ponto") head(s1) # Example: group by point and month (if 'mes' exists in your data) # s2 <- resume_wq(d, by = c("ponto", "mes"))
Calcula a inclinacao de Theil-Sen (robusta) e o p-valor do teste de correlacao de Spearman entre tempo e o valor do parametro. Retorna estatisticas por grupo (ex.: rio, ponto).
trend_param( data, param, date_col = "data", group_cols = c("rio", "ponto"), min_n = 6, alpha = 0.05 )trend_param( data, param, date_col = "data", group_cols = c("rio", "ponto"), min_n = 6, alpha = 0.05 )
data |
data.frame com pelo menos uma coluna de data e a coluna do parametro. |
param |
nome do parametro (string), por exemplo "turbidez" ou "iqa". |
date_col |
nome da coluna de datas. Default: "data". |
group_cols |
vetor de nomes para agrupar. Default: c("rio","ponto"). |
min_n |
amostra minima por grupo. Default: 6. |
alpha |
nivel de significancia para classificar tendencia. Default: 0.05. |
data.frame com colunas por grupo e: n, date_min, date_max, days_span, slope_per_year, intercept, rho_spearman, p_value, trend ("aumento" / "queda" / "estavel"), pct_change_period (aprox. % no periodo observado).
set.seed(1) df <- data.frame( data = as.Date("2024-01-01") + 0:11*30, rio = "Demo", ponto = "P1", turbidez = 20 + (-0.3)*(0:11) + rnorm(12, 0, 1) ) trend_param(df, param = "turbidez")set.seed(1) df <- data.frame( data = as.Date("2024-01-01") + 0:11*30, rio = "Demo", ponto = "P1", turbidez = 20 + (-0.3)*(0:11) + rnorm(12, 0, 1) ) trend_param(df, param = "turbidez")
Ensures a minimal set of columns exists in the dataset; otherwise throws an error listing the missing names.
validate_wq( df, required = c("ph", "turbidez", "od", "dbo", "nt_total", "p_total", "tds", "temperatura", "coliformes"), nd_policy = c("ld2", "ld", "zero", "na") )validate_wq( df, required = c("ph", "turbidez", "od", "dbo", "nt_total", "p_total", "tds", "temperatura", "coliformes"), nd_policy = c("ld2", "ld", "zero", "na") )
df |
Input data.frame/tibble to validate. |
required |
Character vector of required column names to check for. |
nd_policy |
Policy for censored values (ND/<LD/<LOQ) when required columns are not numeric. One of:
|
The input df if valid; otherwise, an error is thrown.
df_ex <- data.frame( ph = 7, turbidez = 2, od = 7, dbo = 3, nt_total = 0.8, p_total = 0.05, tds = 150, temperatura = 24, coliformes = 200 ) validate_wq(df_ex)df_ex <- data.frame( ph = 7, turbidez = 2, od = 7, dbo = 3, nt_total = 0.8, p_total = 0.05, tds = 150, temperatura = 24, coliformes = 200 ) validate_wq(df_ex)
A small subset of real monitoring data used in examples and vignettes. Now includes extra columns rio, lat, lon.
This dataset contains real water quality measurements collected by INEMA (Instituto do Meio Ambiente e Recursos Hidricos, Bahia) during monitoring campaigns conducted between 2021 and 2024 in the Rio Buranhem watershed, municipality of Porto Seguro, Bahia, Brazil. The dataset was incorporated into the package for demonstration, reproducibility and methodological illustration, following the analytical workflow implemented in tikatuwq. Parameters include sampling dates, site identifiers and multiple physicochemical variables measured during field campaigns.
data(wq_demo) data(wq_demo)data(wq_demo) data(wq_demo)
A tibble/data.frame with 20 rows and 14 columns:
character, river name
character, monitoring point id
Date, sampling date
numeric, pH
numeric, dissolved oxygen (mg/L)
numeric, NTU
numeric, mg/L
numeric, MPN/100 mL
numeric, total phosphorus (mg/L)
numeric, total nitrogen (mg/L)
numeric, degrees Celsius
numeric, total dissolved solids (mg/L)
numeric, latitude
numeric, longitude
A tibble/data.frame. See wq_demo documentation for column details.
The dataset is a real subset selected from BURANHEM river (dataset-real.csv), used for reproducible examples and vignettes. Covers 4 monitoring points and years 2020–2024. All core columns for IQA/CONAMA/plotting helpers are present.
Subset of dataset-real.csv (BURANHEM river, 4 sites, years 2020–2024).
iqa(), conama_check(), plot_series(),
plot_box(), plot_iqa(), plot_heatmap()
wq_demo
data("wq_demo", package = "tikatuwq") head(wq_demo) # quick IQA example: # iqa(wq_demo, na_rm = TRUE)data("wq_demo", package = "tikatuwq") head(wq_demo) # quick IQA example: # iqa(wq_demo, na_rm = TRUE)