From 2be4d95f883cf78052bacbfbfe4dbcc56eb4a6fa Mon Sep 17 00:00:00 2001 From: larnsce Date: Wed, 9 Sep 2026 09:15:01 +0200 Subject: [PATCH 1/6] feat: hardened metadata parsers with fixtures (#3) Ported from the parts bin on the closed PR #15 branch, with three changes the acceptance criteria of #3 asked for and the original did not meet. A latin1 dictionary aborted the run. trimws() raises "invalid UTF-8" on those bytes before any tryCatch is reached, and #3 requires that no parser call can abort a harvest. The text is now converted to UTF-8 up front, and a file that is neither UTF-8 nor latin1 returns an error result rather than throwing. A multi-class variable_type, which washr wrote as the deparsed vector c("POSIXct", "POSIXt") before 1.1.0, passed through raw. It is normalized to its first class. owd_normalize_version() moves here from the retired tier policy, because #5 still stores the version with a leading v stripped. The parser keeps the DESCRIPTION field verbatim. Two fixtures added for the encoding cases, one UTF-8 and one latin1, both carrying umlauts and accents. The tests read fixtures as raw bytes so an encoding declaration cannot mask what the file holds. Not ported, dead under dev/decisions-2026-09.md: tier_policy.R, owd_refresh.R and their tests. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KniirkTyC9pRpXrCA1JeF3 --- R/parsers.R | 437 ++++++++++++++++++ tests/testthat/fixtures/CITATION-standard.cff | 104 +++++ .../fixtures/DESCRIPTION-malformed-version | 32 ++ tests/testthat/fixtures/DESCRIPTION-standard | 61 +++ tests/testthat/fixtures/data-docs-gdho.R | 50 ++ .../fixtures/dictionary-bom-two-column.csv | 17 + .../dictionary-double-double-quoted.csv | 243 ++++++++++ .../fixtures/dictionary-extra-columns.csv | 150 ++++++ tests/testthat/fixtures/dictionary-latin1.csv | 3 + .../dictionary-leading-unnamed-column.csv | 3 + .../fixtures/dictionary-lfs-pointer.csv | 3 + .../fixtures/dictionary-non-ascii.csv | 4 + .../fixtures/dictionary-quoted-header.csv | 10 + .../fixtures/dictionary-space-padded.csv | 20 + .../testthat/fixtures/dictionary-standard.csv | 27 ++ .../dictionary-trailing-empty-columns.csv | 46 ++ tests/testthat/test-parsers.R | 234 ++++++++++ 17 files changed, 1444 insertions(+) create mode 100644 R/parsers.R create mode 100644 tests/testthat/fixtures/CITATION-standard.cff create mode 100644 tests/testthat/fixtures/DESCRIPTION-malformed-version create mode 100644 tests/testthat/fixtures/DESCRIPTION-standard create mode 100644 tests/testthat/fixtures/data-docs-gdho.R create mode 100644 tests/testthat/fixtures/dictionary-bom-two-column.csv create mode 100644 tests/testthat/fixtures/dictionary-double-double-quoted.csv create mode 100644 tests/testthat/fixtures/dictionary-extra-columns.csv create mode 100644 tests/testthat/fixtures/dictionary-latin1.csv create mode 100644 tests/testthat/fixtures/dictionary-leading-unnamed-column.csv create mode 100644 tests/testthat/fixtures/dictionary-lfs-pointer.csv create mode 100644 tests/testthat/fixtures/dictionary-non-ascii.csv create mode 100644 tests/testthat/fixtures/dictionary-quoted-header.csv create mode 100644 tests/testthat/fixtures/dictionary-space-padded.csv create mode 100644 tests/testthat/fixtures/dictionary-standard.csv create mode 100644 tests/testthat/fixtures/dictionary-trailing-empty-columns.csv create mode 100644 tests/testthat/test-parsers.R diff --git a/R/parsers.R b/R/parsers.R new file mode 100644 index 0000000..5024065 --- /dev/null +++ b/R/parsers.R @@ -0,0 +1,437 @@ +# Hardened parsers for per-package metadata files. +# +# These functions parse text already fetched by a harvest backend +# (data-raw/harvest_helpers.R); they never touch the network or the +# filesystem themselves, which keeps them unit testable against the +# fixtures in tests/testthat/fixtures/. Every function is written so a +# malformed input degrades to NA fields or a flagged result instead of an +# error; the harvest treats failures as data, not exceptions. + +# --- DESCRIPTION ------------------------------------------------------------ + +#' Parse a DESCRIPTION file +#' +#' @param text Full contents of a DESCRIPTION file as a single string. +#' @return A list with fields package, title, description, version, +#' license, date (Date), url, maintainer, maintainer_orcid, authors. +#' Missing or unparseable fields are NA. +#' @keywords internal +#' @noRd +owd_parse_description <- function(text) { + out <- list( + package = NA_character_, title = NA_character_, + description = NA_character_, version = NA_character_, + license = NA_character_, date = as.Date(NA), url = NA_character_, + maintainer = NA_character_, maintainer_orcid = NA_character_, + authors = NA_character_ + ) + dcf <- tryCatch( + read.dcf(textConnection(text)), + error = function(e) NULL + ) + if (is.null(dcf) || nrow(dcf) == 0) { + return(out) + } + field <- function(name) { + if (name %in% colnames(dcf) && !is.na(dcf[1, name])) unname(dcf[1, name]) else NA_character_ + } + squash <- function(x) { + if (is.na(x)) NA_character_ else trimws(gsub("\\s+", " ", x)) + } + out$package <- squash(field("Package")) + out$title <- squash(field("Title")) + out$description <- squash(field("Description")) + out$version <- squash(field("Version")) + out$license <- squash(field("License")) + out$url <- squash(field("URL")) + + date_raw <- field("Date") + if (!is.na(date_raw)) { + out$date <- tryCatch(as.Date(trimws(date_raw)), error = function(e) as.Date(NA)) + } + + people <- owd_parse_authors(field("Authors@R")) + if (is.null(people)) { + # Old-style Maintainer: "Given Family " + maint <- field("Maintainer") + if (!is.na(maint)) { + out$maintainer <- squash(sub("<[^>]*>", "", maint)) + out$authors <- out$maintainer + } + return(out) + } + out$maintainer <- people$maintainer + out$maintainer_orcid <- people$maintainer_orcid + out$authors <- people$authors + out +} + +# Evaluate an Authors@R field and extract maintainer plus author list. +# Returns NULL when the field is absent or does not evaluate to persons. +owd_parse_authors <- function(authors_r) { + if (is.na(authors_r)) { + return(NULL) + } + persons <- tryCatch( + # utils::person() must be findable when the field is evaluated. + eval(parse(text = authors_r), envir = new.env(parent = asNamespace("utils"))), + error = function(e) NULL + ) + if (!inherits(persons, "person") || length(persons) == 0) { + return(NULL) + } + entries <- unclass(persons) + name_of <- function(p) { + trimws(paste( + paste(p$given %||% character(), collapse = " "), + paste(p$family %||% character(), collapse = " ") + )) + } + roles <- lapply(entries, function(p) p$role %||% character()) + is_cre <- vapply(roles, function(r) "cre" %in% r, logical(1)) + is_aut <- vapply(roles, function(r) any(c("aut", "cre") %in% r), logical(1)) + names_all <- vapply(entries, name_of, character(1)) + + maintainer <- NA_character_ + maintainer_orcid <- NA_character_ + if (any(is_cre)) { + cre <- entries[[which(is_cre)[1]]] + maintainer <- name_of(cre) + comment <- cre$comment + if (!is.null(comment) && "ORCID" %in% names(comment)) { + maintainer_orcid <- sub("^https?://orcid\\.org/", "", comment[["ORCID"]]) + } + } + authors <- if (any(is_aut)) { + paste(names_all[is_aut & nzchar(names_all)], collapse = "; ") + } else { + NA_character_ + } + list( + maintainer = maintainer, + maintainer_orcid = maintainer_orcid, + authors = authors + ) +} + +`%||%` <- function(x, y) if (is.null(x)) y else x + +#' Normalize a version string for the catalog +#' +#' The data model stores the version with any leading "v" stripped (#5). +#' One package in the org writes "v1.0.0" in DESCRIPTION. The parser keeps +#' the field verbatim; this is what the harvest writes to the table. +#' +#' @param version Character vector of raw version strings. +#' @return Character vector, leading v removed, empty strings as NA. +#' @keywords internal +#' @noRd +owd_normalize_version <- function(version) { + v <- trimws(as.character(version)) + v <- sub("^[vV]", "", v) + v[is.na(v) | !nzchar(v)] <- NA_character_ + v +} + +# --- dictionary.csv --------------------------------------------------------- + +owd_dictionary_columns <- function() { + c("directory", "file_name", "variable_name", "variable_type", "description") +} + +#' Parse a data-raw/dictionary.csv file +#' +#' Handles every pathology observed across the org (see +#' tests/testthat/fixtures/): fully quoted headers, double-double-quoted +#' headers, space-padded names, trailing empty columns, extra columns, +#' leading unnamed columns, a UTF-8 BOM, the deprecated two-column schema, +#' and git-lfs pointer files. +#' +#' @param text Full contents of the file as a single string. +#' @return A list with fields status ("ok", "lfs_pointer" or "error"), +#' schema ("standard" or "two_column"), data (tibble with the five +#' standard columns, NULL unless status is "ok") and notes (character +#' vector of normalizations applied). +#' @keywords internal +#' @noRd +owd_parse_dictionary <- function(text) { + res <- list(status = "error", schema = NA_character_, data = NULL, notes = character()) + if (is.null(text) || length(text) != 1 || is.na(text)) { + res$notes <- "empty or missing file" + return(res) + } + # Some dictionaries in the org are latin1. Every later call, trimws() + # included, raises "invalid UTF-8" on those bytes, and a parser may never + # abort a harvest run, so the conversion happens before anything reads the + # string. + if (!validUTF8(text)) { + converted <- iconv(text, from = "latin1", to = "UTF-8") + if (is.na(converted) || !validUTF8(converted)) { + res$notes <- "file is neither valid UTF-8 nor latin1" + return(res) + } + text <- converted + res$notes <- c(res$notes, "converted latin1 to UTF-8") + } + if (!nzchar(trimws(text))) { + res$notes <- c(res$notes, "empty or missing file") + return(res) + } + if (grepl("^version https://git-lfs", text)) { + res$status <- "lfs_pointer" + res$notes <- "git-lfs pointer file; content must be fetched from the media endpoint" + return(res) + } + txt <- sub("^\ufeff", "", text) + if (!identical(txt, text)) { + res$notes <- c(res$notes, "stripped UTF-8 BOM") + } + df <- tryCatch( + utils::read.csv( + text = txt, header = TRUE, colClasses = "character", + check.names = FALSE, na.strings = c("NA", ""), fill = TRUE, + stringsAsFactors = FALSE + ), + error = function(e) NULL + ) + if (is.null(df) || ncol(df) == 0) { + res$notes <- c(res$notes, "read.csv failed on file contents") + return(res) + } + + nm <- names(df) + nm_clean <- tolower(trimws(gsub('"', "", nm, fixed = TRUE))) + # Second line of defense: depending on the locale, a BOM can survive + # into the first header name instead of the raw text. + nm_clean <- sub("^\ufeff", "", nm_clean) + if (!identical(nm_clean, nm)) { + res$notes <- c(res$notes, "normalized header names") + } + names(df) <- nm_clean + + unnamed <- !nzchar(nm_clean) + if (any(unnamed)) { + df <- df[, !unnamed, drop = FALSE] + res$notes <- c(res$notes, sprintf("dropped %d unnamed column(s)", sum(unnamed))) + } + + std <- owd_dictionary_columns() + present <- intersect(std, names(df)) + + if (setequal(present, c("variable_name", "description"))) { + res$schema <- "two_column" + df <- df[, c("variable_name", "description"), drop = FALSE] + df$directory <- NA_character_ + df$file_name <- NA_character_ + df$variable_type <- NA_character_ + res$notes <- c(res$notes, "deprecated two-column schema") + } else if (all(c("file_name", "variable_name") %in% present)) { + res$schema <- "standard" + extra <- setdiff(names(df), std) + if (length(extra) > 0) { + res$notes <- c(res$notes, paste("ignored extra column(s):", paste(extra, collapse = ", "))) + } + for (col in setdiff(std, names(df))) { + df[[col]] <- NA_character_ + } + } else { + res$notes <- c(res$notes, paste( + "unrecognized schema; columns:", paste(names(df), collapse = ", ") + )) + return(res) + } + + df <- df[, std, drop = FALSE] + for (col in std) { + x <- trimws(df[[col]]) + x <- gsub('^"+|"+$', "", x) + x[!is.na(x) & !nzchar(x)] <- NA_character_ + df[[col]] <- x + } + df <- df[!is.na(df$variable_name), , drop = FALSE] + + # washr before 1.1.0 wrote a multi-class variable_type as a deparsed + # vector, for example c("POSIXct", "POSIXt"). Keep the first class only, + # so the column holds one class name whatever wrote it. + multi <- !is.na(df$variable_type) & grepl("^c\\(", df$variable_type) + if (any(multi)) { + df$variable_type[multi] <- sub( + '^c\\(\\s*[\\\\"\']*([^,\\\\"\')]+).*$', "\\1", df$variable_type[multi] + ) + df$variable_type[multi] <- trimws(df$variable_type[multi]) + res$notes <- c(res$notes, sprintf( + "normalized %d multi-class variable_type value(s) to the first class", + sum(multi) + )) + } + + res$status <- "ok" + res$data <- tibble::as_tibble(df) + res +} + +# --- CITATION.cff ----------------------------------------------------------- + +#' Extract doi and version from a CITATION.cff file +#' +#' Deliberately regex based rather than a full YAML parse: only two scalar +#' fields are needed and a broken YAML file must not abort the harvest. +#' Falls back to the identifiers block when no top-level doi exists. +#' +#' @param text Full contents of the file as a single string, or NA. +#' @return A list with fields doi and version, NA where absent. +#' @keywords internal +#' @noRd +owd_parse_cff <- function(text) { + out <- list(doi = NA_character_, version = NA_character_) + if (is.null(text) || length(text) != 1 || is.na(text)) { + return(out) + } + lines <- strsplit(text, "\r?\n")[[1]] + unquote <- function(x) gsub('^["\']|["\']$', "", trimws(x)) + + doi_line <- grep("^doi:", lines, value = TRUE) + if (length(doi_line) > 0) { + out$doi <- unquote(sub("^doi:", "", doi_line[1])) + } else { + # identifiers: + # - type: doi + # value: 10.5281/zenodo.123 + type_idx <- grep("^\\s*-\\s*type:\\s*doi\\s*$", lines) + for (i in type_idx) { + window <- lines[seq(i + 1, min(i + 2, length(lines)))] + val <- grep("^\\s*value:", window, value = TRUE) + if (length(val) > 0) { + out$doi <- unquote(sub("^\\s*value:", "", val[1])) + break + } + } + } + ver_line <- grep("^version:", lines, value = TRUE) + if (length(ver_line) > 0) { + out$version <- unquote(sub("^version:", "", ver_line[1])) + } + if (!is.na(out$doi)) { + out$doi <- sub("^https?://doi\\.org/", "", out$doi) + if (!nzchar(out$doi)) out$doi <- NA_character_ + } + if (!is.na(out$version) && !nzchar(out$version)) out$version <- NA_character_ + out +} + +# --- roxygen data docs ------------------------------------------------------ + +#' Parse dataset dimensions out of an @format line +#' +#' Tolerates every observed variant: "A tibble with N rows and M +#' variables", a trailing colon after the tag, "#'@format" without a +#' space, reversed order with a thousands separator ("10 columns and +#' 790,375 rows."). Anything unrecognized returns NA dimensions. +#' +#' @param text The text following the @format tag. +#' @return Integer vector c(n_rows, n_vars), NA where not found. +#' @keywords internal +#' @noRd +owd_parse_format_dims <- function(text) { + dims <- c(n_rows = NA_integer_, n_vars = NA_integer_) + if (is.null(text) || length(text) == 0 || all(is.na(text))) { + return(dims) + } + txt <- paste(text, collapse = " ") + grab <- function(pattern) { + m <- regmatches(txt, regexpr(pattern, txt, ignore.case = TRUE, perl = TRUE)) + if (length(m) == 0) { + return(NA_integer_) + } + num <- gsub("[^0-9]", "", sub("\\s.*$", "", m)) + as.integer(num) + } + dims["n_rows"] <- grab("[0-9][0-9,.']*\\s+(rows?|observations?|obs\\b)") + dims["n_vars"] <- grab("[0-9][0-9,.']*\\s+(variables?|columns?|vars?\\b|cols?\\b)") + dims +} + +#' Parse roxygen data documentation from an R source file +#' +#' Finds each roxygen block that documents a dataset (the block is +#' followed by a quoted dataset name, or carries an @name tag) and +#' extracts the dataset name, title, description and @format dimensions. +#' +#' @param text Full contents of an R file as a single string. +#' @return A tibble with columns dataset_name, title, description, +#' n_rows, n_vars. Zero rows when the file documents no dataset. +#' @keywords internal +#' @noRd +owd_parse_data_docs <- function(text) { + empty <- tibble::tibble( + dataset_name = character(), title = character(), + description = character(), n_rows = integer(), n_vars = integer() + ) + if (is.null(text) || length(text) != 1 || is.na(text)) { + return(empty) + } + lines <- strsplit(text, "\r?\n")[[1]] + is_roxy <- grepl("^\\s*#'", lines) + if (!any(is_roxy)) { + return(empty) + } + # Identify runs of consecutive roxygen lines. + runs <- rle(is_roxy) + ends <- cumsum(runs$lengths) + starts <- ends - runs$lengths + 1 + blocks <- which(runs$values) + + rows <- vector("list", length(blocks)) + for (k in seq_along(blocks)) { + b <- blocks[k] + content <- sub("^\\s*#'\\s?", "", lines[starts[b]:ends[b]]) + + # Dataset name: @name tag wins, else the next quoted string statement. + name <- NA_character_ + name_tag <- grep("^@name\\s+", content, value = TRUE) + if (length(name_tag) > 0) { + name <- trimws(sub("^@name\\s+", "", name_tag[1])) + } else { + after <- lines[seq(min(ends[b] + 1, length(lines)), min(ends[b] + 3, length(lines)))] + after <- after[nzchar(trimws(after))] + if (length(after) > 0) { + m <- regmatches(after[1], regexec("^\\s*[\"']([^\"']+)[\"']\\s*$", after[1]))[[1]] + if (length(m) == 2) name <- m[2] + } + } + if (is.na(name) || !nzchar(name)) next + + tag_idx <- grep("^@", content) + pre_tag <- if (length(tag_idx) > 0) content[seq_len(tag_idx[1] - 1)] else content + pre_tag <- trimws(pre_tag) + pre_tag <- pre_tag[nzchar(pre_tag)] + title <- if (length(pre_tag) > 0) pre_tag[1] else NA_character_ + description <- if (length(pre_tag) > 1) { + trimws(gsub("\\s+", " ", paste(pre_tag[-1], collapse = " "))) + } else { + NA_character_ + } + + fmt_idx <- grep("^@format:?", content) + dims <- c(n_rows = NA_integer_, n_vars = NA_integer_) + if (length(fmt_idx) > 0) { + i <- fmt_idx[1] + rest <- content[seq(i, length(content))] + stop_at <- grep("^@|^\\\\describe", rest[-1]) + fmt_text <- if (length(stop_at) > 0) rest[seq_len(stop_at[1])] else rest + fmt_text[1] <- sub("^@format:?\\s*", "", fmt_text[1]) + dims <- owd_parse_format_dims(fmt_text) + } + + rows[[k]] <- tibble::tibble( + dataset_name = name, title = title, description = description, + n_rows = dims[["n_rows"]], n_vars = dims[["n_vars"]] + ) + } + rows <- rows[!vapply(rows, is.null, logical(1))] + if (length(rows) == 0) { + return(empty) + } + out <- do.call(rbind, rows) + out[!duplicated(out$dataset_name), , drop = FALSE] +} diff --git a/tests/testthat/fixtures/CITATION-standard.cff b/tests/testthat/fixtures/CITATION-standard.cff new file mode 100644 index 0000000..9995109 --- /dev/null +++ b/tests/testthat/fixtures/CITATION-standard.cff @@ -0,0 +1,104 @@ +cff-version: 1.2.0 +message: "If you use this data, please cite it as below." +title: "washmalawi: WASH Household Level Survey Data 2018 - 2023" +version: 1.0.1 +date-released: 2025-07-03 +doi: 10.5281/zenodo.15799918 +authors: + - family-names: "Mhango" + given-names: "Emmanuel" + email: "emmanuellmhango@gmail.com" + orcid: "https://orcid.org/0000-0003-3197-6244" + - family-names: "Robertson" + given-names: "Donald" + - family-names: "Mandala" + given-names: "Chifundo" + - family-names: "Nzengo" + given-names: "M" + - family-names: "Nhlema" + given-names: "Muthi" + - family-names: "Banda" + given-names: "M." + - family-names: "Zinyongo" + given-names: "Khumbo" + - family-names: "Nedi" + given-names: "Christian" + - family-names: "Ngwena" + given-names: "Leman" + - family-names: "Kazembe" + given-names: "M" + - family-names: "Mthindi" + given-names: "Yankho" + - family-names: "Mofolo" + given-names: "E." + - family-names: "Bauleni" + given-names: "Jeffrey" + - family-names: "Malliot" + given-names: "Khallen" + - family-names: "Mtemangombe" + given-names: "Thandi" + - family-names: "Tembo" + given-names: "Tamandani" + - family-names: "Mlenga" + given-names: "Samuel" + - family-names: "Joshua" + given-names: "Dufter" + - family-names: "Mthunzi" + given-names: "Andrew" + - family-names: "Kafuwa" + given-names: "Martha" + - family-names: "Tembo" + given-names: "Takondwa" + - family-names: "Singogo" + given-names: "Peter" + - family-names: "Mkandawire" + given-names: "Goodwin" + - family-names: "Msiska" + given-names: "Monica" + - family-names: "Chilora" + given-names: "Lemekezani" + - family-names: "Jambo" + given-names: "Tendai" + - family-names: "Kanyinji" + given-names: "William" + - family-names: "Kanyinji" + given-names: "Chikondi" + - family-names: "Kamamkhudza" + given-names: "Madalitso" + - family-names: "Siliya" + given-names: "Sylvia" + - family-names: "Gadi" + given-names: "Edward K" + - family-names: "Echika" + given-names: "Buli" + - family-names: "Monjeza" + given-names: "Sunganani" + - family-names: "Macheke" + given-names: "Derick" + - family-names: "Chinawa" + given-names: "Fatsani" + - family-names: "Sunthika" + given-names: "Jonathan" + - family-names: "Phiri" + given-names: "Precious" + - family-names: "Mphero" + given-names: "Bright" + - family-names: "Kananji" + given-names: "Rodney" +type: dataset +keywords: + - WASH + - water + - sanitation + - hygiene + - Malawi + - household survey + - SDG +license: CC-BY-4.0 +repository-code: "https://github.com/openwashdata/washmalawi" +url: "https://github.com/openwashdata/washmalawi" +abstract: | + This dataset provides comprehensive Water, Sanitation, and Hygiene (WASH) + household-level survey data collected in Malawi between 2018 and 2023. + The data includes indicators for monitoring WASH-related Sustainable + Development Goals at the household level across different regions of Malawi. \ No newline at end of file diff --git a/tests/testthat/fixtures/DESCRIPTION-malformed-version b/tests/testthat/fixtures/DESCRIPTION-malformed-version new file mode 100644 index 0000000..dbaae20 --- /dev/null +++ b/tests/testthat/fixtures/DESCRIPTION-malformed-version @@ -0,0 +1,32 @@ +Package: waterpointstatus +Title: Water Point Functionality and Service Delivery Monitoring Dataset - 2023 +Version: v1.0.0 +Authors@R: c( + person("Emmanuel", "Mhango", , "emmanuellmhango@gmail.com", role = c("aut", "cre"), + comment = c(ORCID = "0000-0003-3197-6244")), + person("Emmanuel", "Kamanga", role = "ctb"), + person("Soldier", "Zammimba", role = "ctb"), + person("Lackson", "Ngasale", role = "ctb"), + person("Dickson", "Chitonya", role = "ctb"), + person("Joseph", "Chilembwe", role = "ctb"), + person("Phillip", "Kamanga", role = "ctb"), + person("Alex", "Makwinja", role = "ctb"), + person("Michael", "Kwenda", role = "ctb"), + person("Maureen", "Nyadani", role = "ctb"), + person("Dickson", "Daudi", role = "ctb"), + person("Emmanuel", "Nkhonjera", role = "ctb"), + person("Rodney", "Kananji", role = "ctb") + ) +Description: This dataset contains structured field survey responses collected from water point inspections and interviews with community members or water point committee representatives. Each record represents a single survey event linked to a specific water point, including GPS coordinates, enumerator metadata, timestamps, and detailed observations on infrastructure condition, functionality, water availability, maintenance practices, and governance arrangements. +License: CC BY 4.0 +Encoding: UTF-8 +Roxygen: list(markdown = TRUE) +RoxygenNote: 7.3.3 +Depends: + R (>= 3.5) +LazyData: true +Language: en-GB +Config/Needs/website: rmarkdown +Date: 2026-04-10 +URL: https://github.com/openwashdata/waterpointstatus +BugReports: https://github.com/openwashdata/waterpointstatus/issues diff --git a/tests/testthat/fixtures/DESCRIPTION-standard b/tests/testthat/fixtures/DESCRIPTION-standard new file mode 100644 index 0000000..31b1803 --- /dev/null +++ b/tests/testthat/fixtures/DESCRIPTION-standard @@ -0,0 +1,61 @@ +Package: washmalawi +Title: WASH Household Level Survey Data 2018 - 2023 +Version: 1.0.1 +Authors@R: c( + person("Emmanuel", "Mhango", , "emmanuellmhango@gmail.com", role = c("aut", "cre"), + comment = c(ORCID = "0000-0003-3197-6244")), + person("Donald", "Robertson", role = "aut"), + person("Chifundo", "Mandala", role = "aut"), + person("M", "Nzengo", role = "aut"), + person("Muthi", "Nhlema", role = "aut"), + person("M.", "Banda", role = "aut"), + person("Khumbo", "Zinyongo", role = "aut"), + person("Christian", "Nedi", role = "aut"), + person("Leman", "Ngwena", role = "aut"), + person("M", "Kazembe", role = "aut"), + person("Yankho", "Mthindi", role = "aut"), + person("E.", "Mofolo", role = "aut"), + person("Jeffrey", "Bauleni", role = "aut"), + person("Khallen", "Malliot", role = "aut"), + person("Thandi", "Mtemangombe", role = "aut"), + person("Tamandani", "Tembo", role = "aut"), + person("Samuel", "Mlenga", role = "aut"), + person("Dufter", "Joshua", role = "aut"), + person("Andrew", "Mthunzi", role = "aut"), + person("Martha", "Kafuwa", role = "aut"), + person("Takondwa", "Tembo", role = "aut"), + person("Peter", "Singogo", role = "aut"), + person("Goodwin", "Mkandawire", role = "aut"), + person("Monica", "Msiska", role = "aut"), + person("Lemekezani", "Chilora", role = "aut"), + person("Tendai", "Jambo", role = "aut"), + person("William", "Kanyinji", role = "aut"), + person("Chikondi", "Kanyinji", role = "aut"), + person("Madalitso", "Kamamkhudza", role = "aut"), + person("Sylvia", "Siliya", role = "aut"), + person("Edward", "K Gadi", role = "aut"), + person("Buli", "Echika", role = "aut"), + person("Sunganani", "Monjeza", role = "aut"), + person("Derick", "Macheke", role = "aut"), + person("Fatsani", "Chinawa", role = "aut"), + person("Jonathan", "Sunthika", role = "aut"), + person("Precious", "Phiri", role = "aut"), + person("Bright", "Mphero", role = "aut"), + person("Rodney", "Kananji", role = "aut") + ) +Description: This package provides access to Water, Sanitation, and Hygiene (WASH) household-level survey data collected in Malawi between 2018 and 2023. The dataset includes comprehensive indicators for monitoring WASH-related Sustainable Development Goals at the household level. +License: CC BY 4.0 +Encoding: UTF-8 +Roxygen: list(markdown = TRUE) +RoxygenNote: 7.3.2 +Depends: + R (>= 3.5) +LazyData: true +Language: en-GB +Config/Needs/website: rmarkdown +Date: 2025-04-30 +URL: https://github.com/openwashdata/washmalawi +BugReports: https://github.com/openwashdata/washmalawi/issues +Suggests: + testthat (>= 3.0.0) +Config/testthat/edition: 3 diff --git a/tests/testthat/fixtures/data-docs-gdho.R b/tests/testthat/fixtures/data-docs-gdho.R new file mode 100644 index 0000000..e37d9f4 --- /dev/null +++ b/tests/testthat/fixtures/data-docs-gdho.R @@ -0,0 +1,50 @@ +#' Global Database of Humanitarian Organization (short version) +#' +#' This dataset collected by Humanitarian Outcomes provides insights about humanitarian +#' organizations, such as name, website, headquarter information, and etc. This short version +#' excludes the information about how many operational units a humanitarian organization has +#' in each country, where you can find it in data gdho_full. +#' +#' @format A tibble with 4548 rows and 35 variables +#' +#' \describe{ +#' \item{id}{A unique Id for each organisation} +#' \item{year}{Latest year information is available for} +#' \item{name}{Full organisation name} +#' \item{abbreviated_name}{Organisation abbreviation or acronym} +#' \item{type}{National NGO (NNGO), International NGO (INGO), UN, Red Cross/Crescent classification} +#' \item{international_or_national}{Organisation’s reach} +#' \item{website}{Organisation page url} +#' \item{hq_location}{Country where HQ office is located} +#' \item{year_founded}{Year of establishment} +#' \item{year_closed}{Year closed or last year of visible activity} +#' \item{countries_of_operation_count}{Number of countries operational in} +#' \item{sector}{Children/youth, coordination, disabilities, education, environment, food security/agriculture, health, landmines, livelihoods, logistics/communications, nutrition, refugees, shelter, veterinary, water/sanitation, women} +#' \item{religious_or_secular}{Organisations religious affiliation} +#' \item{religion}{Specific religious affiliation (ex. Catholic, Islamic, Jewish)} +#' \item{red_cross_code_of_conduct_signatory}{Signatory status of the organisation} +#' \item{chs_member}{Signatory status to the Core Humanitarian Standard on Quality and Accountability } +#' \item{interaction_member}{Membership status} +#' \item{icva_member}{Membership status} +#' \item{staff}{Actual number of total staff} +#' \item{staff_imputed}{Imputed number of total staff} +#' \item{natl}{Actual number of national staff} +#' \item{natl_imputed}{Imputed number of national staff} +#' \item{intl}{Actual number of international staff} +#' \item{intl_imputed}{Imputed number of international staff} +#' \item{percent_intl}{Percent of total staff that are international} +#' \item{ope_approx_usd}{Actual approximate annual operational program expenditure in USD} +#' \item{ope_imputed}{Imputed approximate annual operational program expenditure in USD} +#' \item{ope/staff}{Percent of operational program expenditure per staff member} +#' \item{ope_inflation_adjusted}{Operational program expenditure adjusted for inflation} +#' \item{ope_original_currency}{Actual approximate operational program expenditure in original currency used by organisation} +#' \item{ope_original_amount}{Operational program expenditure amount in original currency} +#' \item{ope_original_currency_code}{Currency code for operational program expenditure} +#' \item{humexp_approx_usd}{Approximate humanitarian expenditure in USD} +#' \item{humexp_imputed}{Imputed approximate humanitarian expenditure in USD} +#' \item{humexp_inflation_adjusted}{Approximate humanitarian expenditure adjusted for inflation} +#' } +#' +#' @source Humanitarian Outcomes + +"gdho" diff --git a/tests/testthat/fixtures/dictionary-bom-two-column.csv b/tests/testthat/fixtures/dictionary-bom-two-column.csv new file mode 100644 index 0000000..ae728e8 --- /dev/null +++ b/tests/testthat/fixtures/dictionary-bom-two-column.csv @@ -0,0 +1,17 @@ +variable_name,description +table_id,ID number of the meta-data table +chapter,Name of the chapter of the experimentation +type,"Type of experimentation data, e.g., centrifugation" +place,Place of the experimentation +date,Date of the experimentation +publication,Publication citation associated with the experiment +link,Data source web links where the experiment raw data is stored +faecal_type,Type of faecal material +collect_loc,Location of collection +age,Age before collection +moisture,Moisture content +tot_solids,Total solids content +volatile_solids,Volatile solids content +ash,Ash content +trash_presence,Whether trash is present or not +pretreatment,Pre-treatment \ No newline at end of file diff --git a/tests/testthat/fixtures/dictionary-double-double-quoted.csv b/tests/testthat/fixtures/dictionary-double-double-quoted.csv new file mode 100644 index 0000000..14218d3 --- /dev/null +++ b/tests/testthat/fixtures/dictionary-double-double-quoted.csv @@ -0,0 +1,243 @@ +"""directory""","""file_name""",variable_name,variable_type,description +directory,file_name,wkt_geom,character,A sentence to explain the variable +directory,file_name,StrtTm,character,Start time +directory,file_name,EndTm,character,A sentence to explain the variable +directory,file_name,Date,character,A sentence to explain the variable +directory,file_name,Enumr,character,A sentence to explain the variable +directory,file_name,Date2,character,A sentence to explain the variable +directory,file_name,Prov,character,A sentence to explain the variable +directory,file_name,Dist,character,A sentence to explain the variable +directory,file_name,Comm,character,A sentence to explain the variable +directory,file_name,Vill,character,A sentence to explain the variable +directory,file_name,VillID,double,A sentence to explain the variable +directory,file_name,DCEbook,character,A sentence to explain the variable +directory,file_name,GPSX,double,A sentence to explain the variable +directory,file_name,GPSY,double,A sentence to explain the variable +directory,file_name,GPSerror,character,A sentence to explain the variable +directory,file_name,CustRecID,character,A sentence to explain the variable +directory,file_name,CustLoc,character,A sentence to explain the variable +directory,file_name,NearWtrFld,character,A sentence to explain the variable +directory,file_name,AnswSurv,character,A sentence to explain the variable +directory,file_name,DM,character,A sentence to explain the variable +directory,file_name,LatAcc,character,A sentence to explain the variable +directory,file_name,WhyNoLatAc,logical,A sentence to explain the variable +directory,file_name,LatAtWrk,character,A sentence to explain the variable +directory,file_name,Gndr,character,A sentence to explain the variable +directory,file_name,Age,double,A sentence to explain the variable +directory,file_name,IDPoor,character,A sentence to explain the variable +directory,file_name,Educ,character,A sentence to explain the variable +directory,file_name,ShwLat,character,A sentence to explain the variable +directory,file_name,FirstLat,character,A sentence to explain the variable +directory,file_name,LatYrs,double,A sentence to explain the variable +directory,file_name,NumPits,double,A sentence to explain the variable +directory,file_name,PTyp,character,A sentence to explain the variable +directory,file_name,PSer,character,A sentence to explain the variable +directory,file_name,PAlt,character,A sentence to explain the variable +directory,file_name,PPrc,character,A sentence to explain the variable +directory,file_name,PDifAcc,character,A sentence to explain the variable +directory,file_name,NumRngsP1,double,A sentence to explain the variable +directory,file_name,NumRngsP2,double,A sentence to explain the variable +directory,file_name,NumRngsP3,double,A sentence to explain the variable +directory,file_name,P2x2spac,character,A sentence to explain the variable +directory,file_name,PNoFuncRai,character,A sentence to explain the variable +directory,file_name,NumAdlts,double,A sentence to explain the variable +directory,file_name,NumChld,double,A sentence to explain the variable +directory,file_name,NumInfs,double,A sentence to explain the variable +directory,file_name,HHSize,double,A sentence to explain the variable +directory,file_name,NumPFild,character,A sentence to explain the variable +directory,file_name,PFulNw,character,A sentence to explain the variable +directory,file_name,PracPFulLs,character,A sentence to explain the variable +directory,file_name,PracPFul_1,character,A sentence to explain the variable +directory,file_name,PFul_Exp,double,A sentence to explain the variable +directory,file_name,PFul_Tim,double,A sentence to explain the variable +directory,file_name,PFul_Eff,double,A sentence to explain the variable +directory,file_name,PFul_Cost,double,A sentence to explain the variable +directory,file_name,PSerKnwDat,character,A sentence to explain the variable +directory,file_name,PSerDat,character,A sentence to explain the variable +directory,file_name,PSerLrn,character,A sentence to explain the variable +directory,file_name,PSerLrnOtr,character,A sentence to explain the variable +directory,file_name,PSerWhSld,character,A sentence to explain the variable +directory,file_name,PSerWhSldO,character,A sentence to explain the variable +directory,file_name,PSerWhInst,character,A sentence to explain the variable +directory,file_name,PSerWhIn_1,character,A sentence to explain the variable +directory,file_name,POvrflwRn,character,A sentence to explain the variable +directory,file_name,PAltKnwDat,character,A sentence to explain the variable +directory,file_name,PAltDat,character,A sentence to explain the variable +directory,file_name,PAltLrn,character,A sentence to explain the variable +directory,file_name,PAltLrnOtr,character,A sentence to explain the variable +directory,file_name,PAltWhSld,character,A sentence to explain the variable +directory,file_name,PAltWhSldO,character,A sentence to explain the variable +directory,file_name,PAltWhInst,character,A sentence to explain the variable +directory,file_name,PAltWhIn_1,logical,A sentence to explain the variable +directory,file_name,PPrcKnwDat,character,A sentence to explain the variable +directory,file_name,PPrcDat,character,A sentence to explain the variable +directory,file_name,PPrcLrn,character,A sentence to explain the variable +directory,file_name,PPrcLrnOtr,character,A sentence to explain the variable +directory,file_name,PPrcWhPrc,character,A sentence to explain the variable +directory,file_name,PPrcWhPrcO,character,A sentence to explain the variable +directory,file_name,EmptWh,character,A sentence to explain the variable +directory,file_name,EmptWhOtr,character,A sentence to explain the variable +directory,file_name,EmptEqup,character,A sentence to explain the variable +directory,file_name,EmptEqupOt,character,A sentence to explain the variable +directory,file_name,EmptMnth,double,A sentence to explain the variable +directory,file_name,EmptPrbs,character,A sentence to explain the variable +directory,file_name,EmptSchd,character,A sentence to explain the variable +directory,file_name,EmptCost,double,A sentence to explain the variable +directory,file_name,EmptPAdd,character,A sentence to explain the variable +directory,file_name,EmptPAddOt,character,A sentence to explain the variable +directory,file_name,DispLoc,character,A sentence to explain the variable +directory,file_name,EmptDIYapp,double,A sentence to explain the variable +directory,file_name,SrvcLrn,character,A sentence to explain the variable +directory,file_name,SrvcLrnOtr,character,A sentence to explain the variable +directory,file_name,SrvcCntct,character,A sentence to explain the variable +directory,file_name,SrvcCntctO,logical,A sentence to explain the variable +directory,file_name,SrvcDely,character,A sentence to explain the variable +directory,file_name,SrvcSat_Ov,double,A sentence to explain the variable +directory,file_name,SrvcSat_Co,double,A sentence to explain the variable +directory,file_name,SrvcSat_Sa,double,A sentence to explain the variable +directory,file_name,SrvcSat_Ea,double,A sentence to explain the variable +directory,file_name,SrvcSat__1,double,A sentence to explain the variable +directory,file_name,SrvcRec,character,A sentence to explain the variable +directory,file_name,KnwEmptPrc,character,A sentence to explain the variable +directory,file_name,KnwEmptP_1,character,A sentence to explain the variable +directory,file_name,KnwClthYN,character,A sentence to explain the variable +directory,file_name,KnwClth,character,A sentence to explain the variable +directory,file_name,KnwClthOtr,character,A sentence to explain the variable +directory,file_name,KnwADP,character,A sentence to explain the variable +directory,file_name,KnwADPOtr,character,A sentence to explain the variable +directory,file_name,KnwHhelthF,character,A sentence to explain the variable +directory,file_name,KnwMrukFS,character,A sentence to explain the variable +directory,file_name,KnwFSwtrSa,character,A sentence to explain the variable +directory,file_name,KnwFSfldSa,character,A sentence to explain the variable +directory,file_name,KnwPwatSaf,character,A sentence to explain the variable +directory,file_name,KnwLiqFSSa,character,A sentence to explain the variable +directory,file_name,KnwTimSeld,character,A sentence to explain the variable +directory,file_name,AttKilMruk,character,A sentence to explain the variable +directory,file_name,AttSafMstI,character,A sentence to explain the variable +directory,file_name,SNmNeiOpns,character,A sentence to explain the variable +directory,file_name,SNmSlfEmpt,character,A sentence to explain the variable +directory,file_name,SNmFlodOut,character,A sentence to explain the variable +directory,file_name,SNmHirSrvc,character,A sentence to explain the variable +directory,file_name,SNmInstNwP,character,A sentence to explain the variable +directory,file_name,SNmUseADP,character,A sentence to explain the variable +directory,file_name,SNmPrcP,character,A sentence to explain the variable +directory,file_name,SNmResmOD,character,A sentence to explain the variable +directory,file_name,PCntlAblEm,character,A sentence to explain the variable +directory,file_name,PCntlAbl_1,character,A sentence to explain the variable +directory,file_name,IntSlfEmpt,character,A sentence to explain the variable +directory,file_name,IntHirSrvc,character,A sentence to explain the variable +directory,file_name,IntInstNwP,character,A sentence to explain the variable +directory,file_name,IntUseNeiL,character,A sentence to explain the variable +directory,file_name,IntResmOD,character,A sentence to explain the variable +directory,file_name,IntDK,character,A sentence to explain the variable +directory,file_name,SrvcAvail,character,A sentence to explain the variable +directory,file_name,SrvcTooExp,character,A sentence to explain the variable +directory,file_name,SrvcTooFew,character,A sentence to explain the variable +directory,file_name,UsedFSag,character,A sentence to explain the variable +directory,file_name,IntPFulNoS,character,A sentence to explain the variable +directory,file_name,IntPFulN_1,character,A sentence to explain the variable +directory,file_name,DCEbook2,character,A sentence to explain the variable +directory,file_name,DCEq1,character,A sentence to explain the variable +directory,file_name,DCEq1Ans,character,A sentence to explain the variable +directory,file_name,DCEq1Ver,character,A sentence to explain the variable +directory,file_name,DCEq2,character,A sentence to explain the variable +directory,file_name,DCEq2Ans,character,A sentence to explain the variable +directory,file_name,DCEq2Ver,character,A sentence to explain the variable +directory,file_name,DCEq3,character,A sentence to explain the variable +directory,file_name,DCEq3Ans,character,A sentence to explain the variable +directory,file_name,DCEq3Ver,character,A sentence to explain the variable +directory,file_name,DCEq4,character,A sentence to explain the variable +directory,file_name,DCEq4Ans,character,A sentence to explain the variable +directory,file_name,DCEq4Ver,character,A sentence to explain the variable +directory,file_name,DCEq5,character,A sentence to explain the variable +directory,file_name,DCEq5Ans,character,A sentence to explain the variable +directory,file_name,DCEq5Ver,character,A sentence to explain the variable +directory,file_name,DCEbookVer,character,A sentence to explain the variable +directory,file_name,RespQ,character,A sentence to explain the variable +directory,file_name,HHid,double,A sentence to explain the variable +directory,file_name,NearStatcW,character,A sentence to explain the variable +directory,file_name,NearMoving,character,A sentence to explain the variable +directory,file_name,NearCropFl,character,A sentence to explain the variable +directory,file_name,DMresp,character,A sentence to explain the variable +directory,file_name,DMhusb,character,A sentence to explain the variable +directory,file_name,DMwife,character,A sentence to explain the variable +directory,file_name,DMfath,character,A sentence to explain the variable +directory,file_name,DMmoth,character,A sentence to explain the variable +directory,file_name,DMgrpa,character,A sentence to explain the variable +directory,file_name,DMgrma,character,A sentence to explain the variable +directory,file_name,DMfamM,character,A sentence to explain the variable +directory,file_name,DMfamF,character,A sentence to explain the variable +directory,file_name,DMotr,character,A sentence to explain the variable +directory,file_name,DMmale,character,A sentence to explain the variable +directory,file_name,DMfemale,character,A sentence to explain the variable +directory,file_name,IDPoorYN,character,A sentence to explain the variable +directory,file_name,PPFL_StlDF,character,A sentence to explain the variable +directory,file_name,PPFL_otr,character,A sentence to explain the variable +directory,file_name,PPFL_pser,character,A sentence to explain the variable +directory,file_name,PPFL_nwlat,character,A sentence to explain the variable +directory,file_name,PPFL_palt,character,A sentence to explain the variable +directory,file_name,PPFL_fldou,character,A sentence to explain the variable +directory,file_name,PPFL_rvrtO,character,A sentence to explain the variable +directory,file_name,PPFL_neifa,character,A sentence to explain the variable +directory,file_name,PPFL_emptd,character,A sentence to explain the variable +directory,file_name,EmptEqup_p,character,A sentence to explain the variable +directory,file_name,EmptEqup_f,character,A sentence to explain the variable +directory,file_name,EmptEqup_v,character,A sentence to explain the variable +directory,file_name,EmptEqup_o,character,A sentence to explain the variable +directory,file_name,EmptEqup_b,character,A sentence to explain the variable +directory,file_name,EmptPrbs_d,character,A sentence to explain the variable +directory,file_name,EmptPrbs_s,character,A sentence to explain the variable +directory,file_name,EmptPrbs_n,character,A sentence to explain the variable +directory,file_name,EmptPrbs_b,character,A sentence to explain the variable +directory,file_name,EmptPrbs_p,character,A sentence to explain the variable +directory,file_name,EmptPrbs_t,character,A sentence to explain the variable +directory,file_name,EmptPrbs_1,character,A sentence to explain the variable +directory,file_name,EmptPrbs_2,character,A sentence to explain the variable +directory,file_name,EmptPAdd_c,character,A sentence to explain the variable +directory,file_name,EmptPAdd_o,character,A sentence to explain the variable +directory,file_name,EmptPAdd_k,character,A sentence to explain the variable +directory,file_name,EmptPAdd_f,character,A sentence to explain the variable +directory,file_name,EmptPAdd_d,character,A sentence to explain the variable +directory,file_name,EmptPAdd_n,character,A sentence to explain the variable +directory,file_name,EmptPAdd_g,character,A sentence to explain the variable +directory,file_name,EmptPAdd_r,character,A sentence to explain the variable +directory,file_name,KnwEmptP_2,character,A sentence to explain the variable +directory,file_name,KnwEmptP_3,character,A sentence to explain the variable +directory,file_name,KnwEmptP_4,character,A sentence to explain the variable +directory,file_name,KnwEmptP_5,character,A sentence to explain the variable +directory,file_name,KnwEmptP_6,character,A sentence to explain the variable +directory,file_name,KnwEmptP_7,character,A sentence to explain the variable +directory,file_name,KnwEmptP_8,character,A sentence to explain the variable +directory,file_name,KnwClth_pa,character,A sentence to explain the variable +directory,file_name,KnwClth_ma,character,A sentence to explain the variable +directory,file_name,KnwClth_ot,character,A sentence to explain the variable +directory,file_name,KnwClth_sh,character,A sentence to explain the variable +directory,file_name,KnwClth_ey,character,A sentence to explain the variable +directory,file_name,KnwClth_dk,character,A sentence to explain the variable +directory,file_name,KnwClth_gl,character,A sentence to explain the variable +directory,file_name,KnwADP_alt,character,A sentence to explain the variable +directory,file_name,KnwADP_dbl,character,A sentence to explain the variable +directory,file_name,KnwADP_mak,character,A sentence to explain the variable +directory,file_name,KnwADP_con,character,A sentence to explain the variable +directory,file_name,KnwADP_saf,character,A sentence to explain the variable +directory,file_name,KnwADP_oth,character,A sentence to explain the variable +directory,file_name,KnwADP_dk,character,A sentence to explain the variable +directory,file_name,KnwADP_2pi,character,A sentence to explain the variable +directory,file_name,Flood_Pron_2011_1kmbuffer,double,A sentence to explain the variable +directory,file_name,PPrc_m,double,A sentence to explain the variable +directory,file_name,NumRngsP1_greater3_m,double,A sentence to explain the variable +directory,file_name,NumPits_greater1_m,double,A sentence to explain the variable +directory,file_name,PNoFuncRai_m,double,A sentence to explain the variable +directory,file_name,PNoFuncRai_MstRnSeasn_m,double,A sentence to explain the variable +directory,file_name,NumPFild_greaterorequal1_m,double,A sentence to explain the variable +directory,file_name,PracPFulLs_m,double,A sentence to explain the variable +directory,file_name,LatYrs_lessorequal3_m,double,A sentence to explain the variable +directory,file_name,HHSize_lessorequal5_m,double,A sentence to explain the variable +directory,file_name,NumPFild_isequal0_m,double,A sentence to explain the variable +directory,file_name,KnwEmptPrc_Flood out_m,double,A sentence to explain the variable +directory,file_name,KnwEmptPrc_PP_m,double,A sentence to explain the variable +directory,file_name,KnwEmptPrc_Flood out&PP_m,double,A sentence to explain the variable +directory,file_name,Flood_Pron_2011_nobuffer,double,A sentence to explain the variable +directory,file_name,Flood_Pron_2011_0.5kmbuffer,double,A sentence to explain the variable +directory,file_name,Flood_Pron_2013_nobuffer,double,A sentence to explain the variable +directory,file_name,GPS_Coord,double,A sentence to explain the variable \ No newline at end of file diff --git a/tests/testthat/fixtures/dictionary-extra-columns.csv b/tests/testthat/fixtures/dictionary-extra-columns.csv new file mode 100644 index 0000000..e3d372f --- /dev/null +++ b/tests/testthat/fixtures/dictionary-extra-columns.csv @@ -0,0 +1,150 @@ +directory,file_name,variable_name,variable_type,description,unit_type,error +data/,water_samples.rda,localization,character,Name of the localization where the sample was taken.,NA,NA +data/,water_samples.rda,geology,character,Composition of the ground.,NA,NA +data/,water_samples.rda,utm_x,character,Geospatial data of the water sampling locations. The geographic coordinate system 'Arc 1960 / UTM zone 37S' (EPSG:21037) which is used for the areas of Kenya and Tanzania - south of equator and east of 36°E.,Arc 1960,NA +data/,water_samples.rda,utm_y,character,Geospatial data of the water sampling locations. The geographic coordinate system 'Arc 1960 / UTM zone 37S' (EPSG:21037) which is used for the areas of Kenya and Tanzania - south of equator and east of 36°E.,Arc 1960,NA +data/,water_samples.rda,date,dttm,Date the sample was taken.,NA,NA +data/,water_samples.rda,conductivity,double,Conductivity of the sample in (µS/cm),(µS/cm),NA +data/,water_samples.rda,T_avg,double,Average ambient temperature at the time of the sampling,°C,NA +data/,water_samples.rda,pH,double,Acidity/basicity of the sample using the pH value.,NA,NA +data/,water_samples.rda,TOC,double,Total organic carbon (TOC) is an analytical parameter representing the concentration of organic carbon in a sample.,(mg/L),NA +data/,water_samples.rda,alkalinity,double,Alkalinity of the sample as mg of bicarbonate (HCO3) per liter (mg_HCO3/L).,as mg/L HCO3,NA +data/,water_samples.rda,DO,double,Dissolved oxygen (DO) levels in environmental water depend on the physiochemical and biochemical activities in water body and it is an important useful in pollution and waste treatment process control.,(mg/L),NA +data/,water_samples.rda,ORP,double,Oxidation reduction potential (ORP) in (mV).,mV,NA +data/,water_samples.rda,eH,double,Redox potential (eH) in (mV).,mV,NA +data/,water_samples.rda,NH4,double,Ammonium concentration in (mg/L).,(mg/L),NA +data/,water_samples.rda,Cl,double,Chlorine concentration in (mg/L),(mg/L),0.042 mg/L +data/,water_samples.rda,SO4,double,Sulfate concentration in (mg/L),(mg/L),0.026mg/L +data/,water_samples.rda,NO3,double,Nitrate concentration in (mg/L),(mg/L),0.005mg/L +data/,water_samples.rda,PO4,double,Phosphate concentration in (mg/L),(mg/L),"0,008 mg/L" +data/,water_samples.rda,Br,double,Bromine concentration in (mg/L),(mg/L),0.004mg/L +data/,water_samples.rda,F,double,Fluorine concentration in (mg/L),(mg/L),0.024mg/L +data/,water_samples.rda,Ca,double,Calcium concentration in (mg/L),(mg/L),0.05 mg/L +data/,water_samples.rda,Mg,double,Magnesium concentration in (mg/L),(mg/L),0.05 mg/L +data/,water_samples.rda,Na,double,Sodium concentration in (mg/L),(mg/L),0.1 mg/L +data/,water_samples.rda,K,double,Potassium concentration in (mg/L),(mg/L),0.1 mg/L +data/,water_samples.rda,Fe,double,Iron concentration in (mg/L),(mg/L),0.05 mg/L +data/,water_samples.rda,Si,double,Silicon concentration in (mg/L),(mg/L),0.02 mg/L +data/,water_samples.rda,Al,double,Aluminum concentration in (mg/L),(mg/L),0.05 mg/L +data/,water_samples.rda,S,double,Sulfur concentration in (mg/L),(mg/L),0.05 mg/L +data/,water_samples.rda,P,double,Phosphorus concentration in (mg/L),(mg/L),0.1 mg/L +data/,water_samples.rda,Li,double,Lithium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Be,double,Beryllium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,B,double,Boron concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Sc,double,Scandium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Ti,double,Titanium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,V,double,Vanadium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Cr,double,Chromium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Mn,double,Manganese concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Co,double,Cobalt concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Ni,double,Nickel concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Cu,double,Copper concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Zn,double,Zinc concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Ga,double,Gallium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Ge,double,Germanium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,As,double,Arsenic concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Se,double,Selenium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Rb,double,Rubidium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Sr,double,Strontium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Y,double,Yttrium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Zr,double,Zirconium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Nb,double,Niobium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Mo,double,Molybdenum concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Cd,double,Cadmium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Sn,double,Tin concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Sb,double,Antimony concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Cs,double,Cesium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Ba,double,Barium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,La,double,Lanthanum concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Ce,double,Cerium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Pr,double,Praseodymium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Nd,double,Neodymium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Sm,double,Samarium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Eu,double,Europium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Gd,double,Gadolinium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Tb,double,Terbium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Dy,double,Dysprosium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Ho,double,Holmium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Er,double,Erbium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Tm,double,Thulium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Yb,double,Ytterbium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Lu,double,Lutetium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Hf,double,Hafnium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Ta,double,Tantalum concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,W,double,Wolfram concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Tl,double,Thallium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Pb,double,Lead concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Bi,double,Bismuth concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,Th,double,Thorium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,U,double,Uranium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,water_samples.rda,delta_O_18,double,The ratio of stable isotopes oxygen-18 (18O) and oxygen-16 (16O) as a measure of groundwater/mineral interactions.,NA,NA +data/,water_samples.rda,delta_H_2,double,"δ2H, or delta deuterium, is a measure of the relative abundance of deuterium (a stable isotope of hydrogen) in a sample, often used in hydrology and environmental science to trace the origin and movement of water.",NA,NA +data/,selected_samples.rda,code,character,,NA,LOD +data/,selected_samples.rda,date,dttm,Date the sample was taken.,NA,NA +data/,selected_samples.rda,conductivity,double,Conductivity of the sample in (µS/cm),(µS/cm),NA +data/,selected_samples.rda,T_avg,double,Average ambient temperature at the time of the sampling,°C,NA +data/,selected_samples.rda,pH,double,Acidity/basicity of the sample using the pH value.,NA,NA +data/,selected_samples.rda,Cl,double,Chlorine concentration in (mg/L),(mg/L),0.042 mg/L +data/,selected_samples.rda,SO4,double,Sulfate concentration in (mg/L),(mg/L),0.026mg/L +data/,selected_samples.rda,NO3,double,Nitrate concentration in (mg/L),(mg/L),0.005mg/L +data/,selected_samples.rda,PO4,double,Phosphate concentration in (mg/L),(mg/L),"0,008 mg/L" +data/,selected_samples.rda,Br,double,Bromine concentration in (mg/L),(mg/L),0.019mg/L +data/,selected_samples.rda,F,double,Fluorine concentration in (mg/L),(mg/L),0.024mg/L +data/,selected_samples.rda,Ca,double,Calcium concentration in (mg/L),(mg/L),0.05 mg/L +data/,selected_samples.rda,Mg,double,Magnesium concentration in (mg/L),(mg/L),0.05 mg/L +data/,selected_samples.rda,Na,double,Sodium concentration in (mg/L),(mg/L),0.1 mg/L +data/,selected_samples.rda,K,double,Potassium concentration in (mg/L),(mg/L),0.1 mg/L +data/,selected_samples.rda,Fe,double,Iron concentration in (mg/L),(mg/L),0.05 mg/L +data/,selected_samples.rda,Si,double,Silicon concentration in (mg/L),(mg/L),0.02 mg/L +data/,selected_samples.rda,Al,double,Aluminum concentration in (mg/L),(mg/L),0.05 mg/L +data/,selected_samples.rda,S,double,Sulfur concentration in (mg/L),(mg/L),0.05 mg/L +data/,selected_samples.rda,P,double,Phosphorus concentration in (mg/L),(mg/L),0.1 mg/L +data/,selected_samples.rda,Li,double,Lithium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Be,double,Beryllium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,B,double,Boron concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Sc,double,Scandium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Ti,double,Titanium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,V,double,Vanadium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Cr,double,Chromium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Mn,double,Manganese concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Co,double,Cobalt concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Ni,double,Nickel concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Cu,double,Copper concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Zn,double,Zinc concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Ga,double,Gallium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Ge,double,Germanium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,As,double,Arsenic concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Se,double,Selenium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Rb,double,Rubidium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Sr,double,Strontium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Y,double,Yttrium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Zr,double,Zirconium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Nb,double,Niobium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Mo,double,Molybdenum concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Cd,double,Cadmium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Sn,double,Tin concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Sb,double,Antimony concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Cs,double,Cesium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Ba,double,Barium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,La,double,Lanthanum concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Ce,double,Cerium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Pr,double,Praseodymium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Nd,double,Neodymium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Sm,double,Samarium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Eu,double,Europium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Gd,double,Gadolinium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Tb,double,Terbium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Dy,double,Dysprosium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Ho,double,Holmium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Er,double,Erbium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Tm,double,Thulium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Yb,double,Ytterbium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Lu,double,Lutetium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Hf,double,Hafnium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Ta,double,Tantalum concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,W,double,Wolfram concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Tl,double,Thallium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Pb,double,Lead concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Bi,double,Bismuth concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,Th,double,Thorium concentration in parts per billion (ppb).,ppb,0.08 ppb +data/,selected_samples.rda,U,double,Uranium concentration in parts per billion (ppb).,ppb,0.08 ppb diff --git a/tests/testthat/fixtures/dictionary-latin1.csv b/tests/testthat/fixtures/dictionary-latin1.csv new file mode 100644 index 0000000..019a22e --- /dev/null +++ b/tests/testthat/fixtures/dictionary-latin1.csv @@ -0,0 +1,3 @@ +directory,file_name,variable_name,variable_type,description +data,d.rda,ort,character,Ort der Messung in Zürich +data,d.rda,qualite,character,Qualité de l eau diff --git a/tests/testthat/fixtures/dictionary-leading-unnamed-column.csv b/tests/testthat/fixtures/dictionary-leading-unnamed-column.csv new file mode 100644 index 0000000..7a44880 --- /dev/null +++ b/tests/testthat/fixtures/dictionary-leading-unnamed-column.csv @@ -0,0 +1,3 @@ +,directory,file_name,variable_name,variable_type,description +1,data/,demo.rda,id,integer,Row identifier. +2,data/,demo.rda,name,character,Name of the site. diff --git a/tests/testthat/fixtures/dictionary-lfs-pointer.csv b/tests/testthat/fixtures/dictionary-lfs-pointer.csv new file mode 100644 index 0000000..1195af6 --- /dev/null +++ b/tests/testthat/fixtures/dictionary-lfs-pointer.csv @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:0efd8de65d166a205e0668fc0982be69d4316578884aafcb496cb1f35a1b02bf +size 3084 diff --git a/tests/testthat/fixtures/dictionary-non-ascii.csv b/tests/testthat/fixtures/dictionary-non-ascii.csv new file mode 100644 index 0000000..39304ff --- /dev/null +++ b/tests/testthat/fixtures/dictionary-non-ascii.csv @@ -0,0 +1,4 @@ +directory,file_name,variable_name,variable_type,description +data,d.rda,ort,character,Ort der Messung in Zürich +data,d.rda,qualite,character,Qualité de l eau +data,d.rda,when,"c(""POSIXct"", ""POSIXt"")",Zeitpunkt der Messung diff --git a/tests/testthat/fixtures/dictionary-quoted-header.csv b/tests/testthat/fixtures/dictionary-quoted-header.csv new file mode 100644 index 0000000..805de9e --- /dev/null +++ b/tests/testthat/fixtures/dictionary-quoted-header.csv @@ -0,0 +1,10 @@ +"directory","file_name","variable_name","variable_type","description" +"data","trips.rda","fid","integer", "Running ID for each recorded GPS location of a truck." +"data","trips.rda","numberplate","character", "Numberplate of the truck, can be joined with `trucks` resource." +"data","trips.rda","date","Date", "Date of the record in ISO 8601 format." +"data","trips.rda","time","c(""hms"", ""difftime"")", "Time of the record in hours, minutes, seconds." +"data","trips.rda","lat","numeric", "Latitude of the record." +"data","trips.rda","lon","numeric", "Longitude of the record." +"data","trips.rda","plant","character", "Treatment plant that the truck delivered faecal sludge to." +"data","trucks.rda","numberplate","character", "Numberplate of the truck, can be joined with `trips` resource." +"data","trucks.rda","volume","numeric", "Volume of the truck in cubic meters." diff --git a/tests/testthat/fixtures/dictionary-space-padded.csv b/tests/testthat/fixtures/dictionary-space-padded.csv new file mode 100644 index 0000000..69fca5d --- /dev/null +++ b/tests/testthat/fixtures/dictionary-space-padded.csv @@ -0,0 +1,20 @@ +directory, file_name, variable_name, variable_type, description +data, basisghana.rda, no, integer, A running id for unique for each region. +data, basisghana.rda, region, character, First level of subnational government administration within the Republic of Ghana. +data, basisghana.rda, district, character, Second level administrative subdivision below region. +data, basisghana.rda, area_council, character, Third level administrative unit below district level. +data, basisghana.rda, community, character, Open defecation free (ODF) community. The community is the smallest level of local administration in Ghana (also called unit committees). +data, basisghana.rda, partner, character, Implementing partner of the CLTS (Community-Led Total Sanitation) program in the respective community. +data, basisghana.rda, population, double, Population size of the respective community. +data, basisghana.rda, households, double, Number of households in the respective community. +data, basisghana.rda, toilets, double, Number of toilets in the respective community. +data, basisghana.rda, hwf, double, Number of handwashing facilities in the respective community. +data, ghanapop.rda, country_en, character, The English name denoting the country where the data was gathered (Ghana). +data, ghanapop.rda, country_pcode, character,The ISO2 code representing Ghana (country of data collection). +data, ghanapop.rda, region_en, character, The English designation specifying the region within Ghana. (Ghana comprises 16 distinct regions.) +data, ghanapop.rda, region_pcode, character, The postal code linked to the specific region. +data, ghanapop.rda, district_en, character,The English name identifying the district in Ghana. (There are 261 districts in Ghana.) +data, ghanapop.rda, district_pcode, character, The postal code specific to the district. +data, ghanapop.rda, female_pop, double, Total female population within the corresponding District. +data, ghanapop.rda, male_pop, double, Total male population within the corresponding District. +data, ghanapop.rda, total_pop, double, Total population within the corresponding District. diff --git a/tests/testthat/fixtures/dictionary-standard.csv b/tests/testthat/fixtures/dictionary-standard.csv new file mode 100644 index 0000000..c7de228 --- /dev/null +++ b/tests/testthat/fixtures/dictionary-standard.csv @@ -0,0 +1,27 @@ +directory,file_name,variable_name,variable_type,description +data/,washmalawi.rda,date_submitted,character,The date on which the household survey form was submitted. +data/,washmalawi.rda,latitude,numeric,The geographic latitude coordinate of the household location. +data/,washmalawi.rda,longitude,numeric,The geographic longitude coordinate of the household location. +data/,washmalawi.rda,water_point_identification_method,character,Method used to identify the water point +data/,washmalawi.rda,traditional_authority,character,The name of the Traditional Authority where the household is located. +data/,washmalawi.rda,district,character,The name of the district where the household is located. +data/,washmalawi.rda,water_source_type,character,Type of water source used by the household +data/,washmalawi.rda,water_source_location,character,Location of the water source relative to the household +data/,washmalawi.rda,water_collection_time_mins,numeric,"Estimated round-trip time in minutes to collect water, including waiting time." +data/,washmalawi.rda,time_not_known,logical,TRUE if respondent does not know or cannot estimate the water collection time. +data/,washmalawi.rda,water_insufficiency_30days,character,Whether the household experienced water insufficiency in the past 30 days +data/,washmalawi.rda,water_quality_tested,character,Whether the water quality at the source has been tested. +data/,washmalawi.rda,bacteriological_test_done_at_location,character,Indicates whether a bacteriological test was performed on-site at the household or source. +data/,washmalawi.rda,parameters_tested_methods,character,List or description of water quality parameters tested and methods used. +data/,washmalawi.rda,chemical_quality_tested,character,Indicates whether chemical tests were performed on the water. +data/,washmalawi.rda,arsenic_tested_water,character,Indicates whether the water was tested for arsenic contamination. +data/,washmalawi.rda,fluoride_tested_water,character,Indicates whether the water was tested for fluoride levels. +data/,washmalawi.rda,toilet_facility_type,character,The type of toilet facility used by the household +data/,washmalawi.rda,toilet_facility_shared,character,Indicates whether the toilet facility is shared with other households. +data/,washmalawi.rda,waste_removed,character,Indicates whether household waste is regularly removed +data/,washmalawi.rda,waste_treated,character,Whether the waste is treated +data/,washmalawi.rda,waste_disposal,character,Method used for waste disposal +data/,washmalawi.rda,handwash_available,character,Whether the household has a designated place for handwashing. +data/,washmalawi.rda,handwashing_water_presence,character,Whether water was present at the handwashing location at the time of visit. +data/,washmalawi.rda,handwashing_soap_presence,character,Whether soap or detergent was present at the handwashing place at the time of visit. +data/,washmalawi.rda,handwashing_supplies_available,character,Overall availability of both soap and water for handwashing. diff --git a/tests/testthat/fixtures/dictionary-trailing-empty-columns.csv b/tests/testthat/fixtures/dictionary-trailing-empty-columns.csv new file mode 100644 index 0000000..ffea19c --- /dev/null +++ b/tests/testthat/fixtures/dictionary-trailing-empty-columns.csv @@ -0,0 +1,46 @@ +directory,file_name,variable_name,variable_type,description,,,,, +data/,floodresponsemw.rda,submitted_on,character,Date when the water point assessment form was submitted.,,,,, +data/,floodresponsemw.rda,water_point_name,character,Name or identifier of the water point site.,,,,, +data/,floodresponsemw.rda,latitude,numeric,Latitude coordinate of the water point location.,,,,, +data/,floodresponsemw.rda,longitude,numeric,Longitude coordinate of the water point location.,,,,, +data/,floodresponsemw.rda,total_users_of_water_point,numeric,Number of people currently using the water point.,,,,, +data/,floodresponsemw.rda,water_point_photos,character,Photos taken to show the current condition of the water point.,,,,, +data/,floodresponsemw.rda,likely_submerged_during_flood,character,Whether the water point was likely submerged during recent flooding (Yes or No).,,,,, +data/,floodresponsemw.rda,evidence_submerged,character,Evidence observed that the water point was submerged.,,,,, +data/,floodresponsemw.rda,evidence_not_submerged,character,Evidence observed that the water point was not submerged.,,,,, +data/,floodresponsemw.rda,functional_status,character,Current operational status of the water point.,,,,, +data/,floodresponsemw.rda,pumpable_at_visit,character,Whether water could be pumped during the visit (Yes or No).,,,,, +data/,floodresponsemw.rda,reported_problems,character,"List of problems reported or observed (e.g., broken parts, contamination).",,,,, +data/,floodresponsemw.rda,reported_problems_other,character,Additional problem descriptions not in the predefined list.,,,,, +data/,floodresponsemw.rda,water_quality_problems,character,"Specific issues related to water quality (e.g., bad smell, taste, turbidity).",,,,, +data/,floodresponsemw.rda,civil_works_problems,character,Structural or construction related issues affecting the water point.,,,,, +data/,floodresponsemw.rda,civil_works_photo,character,Photo documenting the civil works issue.,,,,, +data/,floodresponsemw.rda,pump_problems,character,"Mechanical issues related to the pump (e.g., broken handle).",,,,, +data/,floodresponsemw.rda,pump_problems_other,character,Additional pump issues not listed in predefined options.,,,,, +data/,floodresponsemw.rda,pump_problems_photo,character,Photo documenting the pump issue.,,,,, +data/,floodresponsemw.rda,pump_operational_feel,character,Assessors impression of the pumps functionality during operation.,,,,, +data/,floodresponsemw.rda,time_to_pump_20l,numeric,Time taken to pump 20 liters of water (in seconds).,,,,, +data/,floodresponsemw.rda,strokes_to_yield_water,numeric,Number of strokes required to start yielding water.,,,,, +data/,floodresponsemw.rda,sediment_presence,character,Whether visible sediment was present in the water.,,,,, +data/,floodresponsemw.rda,electrical_conductivity_magnitude,numeric,Measured electrical conductivity value of the water.,,,,, +data/,floodresponsemw.rda,electrical_conductivity_units,character,"Units used to measure electrical conductivity (e.g., uS/cm).",,,,, +data/,floodresponsemw.rda,total_dissolved_solids_ppt,numeric,Total dissolved solids in parts per thousand (ppt).,,,,, +data/,floodresponsemw.rda,ph,numeric,pH level of the water sample.,,,,, +data/,floodresponsemw.rda,fluoride_ppm,numeric,Fluoride concentration in parts per million (ppm).,,,,, +data/,floodresponsemw.rda,ammonia_mg_per_l,numeric,Ammonia concentration in milligrams per liter (mg/L).,,,,, +data/,floodresponsemw.rda,nitrate_mg_per_l,numeric,Nitrate concentration in milligrams per liter (mg/L).,,,,, +data/,floodresponsemw.rda,free_chlorine_mg_per_l,numeric,Free chlorine concentration in milligrams per liter (mg/L).,,,,, +data/,floodresponsemw.rda,arsenic_magnitude,numeric,Measured value of arsenic in the water.,,,,, +data/,floodresponsemw.rda,arsenic_units,character,Units used to measure arsenic concentration.,,,,, +data/,floodresponsemw.rda,turbidity_magnitude,numeric,Turbidity level measured using a turbidity tube.,,,,, +data/,floodresponsemw.rda,turbidity_units,character,"Units used for turbidity measurement (e.g., NTU).",,,,, +data/,floodresponsemw.rda,temperature_magnitude,numeric,Temperature of the water sample (numeric value).,,,,, +data/,floodresponsemw.rda,temperature_units,character,"Units used for temperature (e.g., degree Celcius).",,,,, +data/,floodresponsemw.rda,temperature_time,character,Time the temperature was recorded.,,,,, +data/,floodresponsemw.rda,comments,character,Additional remarks or observations by the enumerator.,,,,, +data/,floodresponsemw.rda,sample_type,character,"Type of water sample collected (e.g., raw, treated).",,,,, +data/,floodresponsemw.rda,sample_date,character,Date the water sample was taken.,,,,, +data/,floodresponsemw.rda,mpn_100ml,numeric,Most probable number (MPN) of bacteria per 100 ml of water.,,,,, +data/,floodresponsemw.rda,upper_95_ci_100ml,numeric,Upper 95 percentage confidence interval of MPN per 100 ml.,,,,, +data/,floodresponsemw.rda,health_risk_category,character,"Risk classification based on MPN results (e.g., low, medium, high).",,,,, +data/,floodresponsemw.rda,color_change_image,character,Image showing color change in test compartments used for bacterial analysis.,,,,, diff --git a/tests/testthat/test-parsers.R b/tests/testthat/test-parsers.R new file mode 100644 index 0000000..ebf5aaf --- /dev/null +++ b/tests/testthat/test-parsers.R @@ -0,0 +1,234 @@ +read_fixture <- function(name) { + paste( + readLines(test_path("fixtures", name), warn = FALSE, encoding = "UTF-8"), + collapse = "\n" + ) +} + +# --- dictionary.csv fixtures (real files from org repos) -------------------- + +std_cols <- c("directory", "file_name", "variable_name", "variable_type", "description") + +expect_standard_dictionary <- function(fixture) { + res <- owd_parse_dictionary(read_fixture(fixture)) + expect_equal(res$status, "ok", info = fixture) + expect_equal(res$schema, "standard", info = fixture) + expect_equal(names(res$data), std_cols, info = fixture) + expect_gt(nrow(res$data), 0) + expect_false(any(is.na(res$data$variable_name))) + expect_false(any(grepl('"', names(res$data)))) + res +} + +test_that("clean standard dictionary parses", { + res <- expect_standard_dictionary("dictionary-standard.csv") + expect_true(all(grepl("\\.rda$", res$data$file_name))) +}) + +test_that("space-padded column names are trimmed", { + expect_standard_dictionary("dictionary-space-padded.csv") +}) + +test_that("fully quoted headers are normalized", { + expect_standard_dictionary("dictionary-quoted-header.csv") +}) + +test_that("double-double-quoted headers are normalized", { + res <- expect_standard_dictionary("dictionary-double-double-quoted.csv") + expect_false(any(grepl('^"', res$data$directory), na.rm = TRUE)) +}) + +test_that("trailing empty columns are dropped", { + res <- expect_standard_dictionary("dictionary-trailing-empty-columns.csv") + expect_true(any(grepl("dropped|unnamed", res$notes))) +}) + +test_that("extra columns are ignored but the five standard ones survive", { + res <- expect_standard_dictionary("dictionary-extra-columns.csv") + expect_true(any(grepl("extra column", res$notes))) +}) + +test_that("a leading unnamed column is dropped", { + expect_standard_dictionary("dictionary-leading-unnamed-column.csv") +}) + +test_that("deprecated two-column schema with BOM maps to the standard shape", { + res <- owd_parse_dictionary(read_fixture("dictionary-bom-two-column.csv")) + expect_equal(res$status, "ok") + expect_equal(res$schema, "two_column") + expect_equal(names(res$data), std_cols) + expect_gt(nrow(res$data), 0) + expect_true(all(is.na(res$data$file_name))) + # The BOM must not contaminate the first variable name. Whether the + # BOM is consumed at read time or by the parser is locale dependent, + # so only the outcome is asserted, not the notes. + expect_false(any(grepl("\ufeff", res$data$variable_name))) +}) + +test_that("git-lfs pointer files are detected, not parsed", { + res <- owd_parse_dictionary(read_fixture("dictionary-lfs-pointer.csv")) + expect_equal(res$status, "lfs_pointer") + expect_null(res$data) +}) + +# Read the fixture as raw bytes, the way a harvest backend hands the text +# over, so an encoding declaration cannot paper over the file's contents. +read_fixture_raw <- function(name) { + path <- test_path("fixtures", name) + rawToChar(readBin(path, "raw", file.size(path))) +} + +test_that("non-ASCII characters survive as themselves, never as escapes", { + res <- owd_parse_dictionary(read_fixture_raw("dictionary-non-ascii.csv")) + expect_equal(res$status, "ok") + expect_true(all(validUTF8(res$data$description))) + expect_false(any(grepl(" Date: Wed, 9 Sep 2026 10:28:28 +0200 Subject: [PATCH 2/6] feat: harvest orchestrator, data model and exported functions (#4, #5, #6) Ported from the parts bin on the closed PR #15 branch and adapted to dev/decisions-2026-09.md, which replaced the version tiers after that code was written. Tiers are gone. A package is published when its CITATION.cff carries a Zenodo DOI, so the tier and legacy columns become published and reviewed, reviewed staying NA until the pkgreview check is worth wiring. The override file and its policy layer are not ported. Dataset and variable detail is harvested for published packages only. The packages table gains the columns #5 specifies but the old code did not collect: keywords, spatial_coverage and temporal_coverage from the schema.org fields washr 1.1.0 writes into DESCRIPTION, with GitHub topics as the keywords fallback. It also gains the tooling provenance columns of #18, so the question the 2026-09-06 dependency scan had to answer by hand is now a column: brand_ref, pkgreview_standard, has_r_cmd_check, has_pkgdown_workflow, has_jsonld. washr_version stays NA until washr #81 ships the Config/washr fields. Value-level gates run in the harvest and again in test-schema.R, because a schema test cannot see the difference between NA and mojibake: no escapes anywhere, no DOI shared by two packages, no duplicate package name. Verified by poisoning a copy of the real table. The version bump compares the freshly built tables against the committed CSVs, so a run that changes nothing leaves DESCRIPTION alone. Verified by running the harvest twice. owd_gh_token() falls back to the gh CLI keyring, so a maintainer's local run is authenticated rather than anonymous at 60 requests per hour. Not ported, dead under the decisions: owd_refresh and the user cache, the xlsx writers, catalog.json, the r-universe sync step and the harvest-failure issue automation. Generated data is not in this commit; it follows from a full org harvest. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KniirkTyC9pRpXrCA1JeF3 --- DESCRIPTION | 4 +- NAMESPACE | 5 + R/catalog.R | 83 ++++++ R/owd_accessors.R | 105 ++++++++ R/owd_install.R | 61 +++++ R/owd_search.R | 41 +++ R/zzz.R | 22 ++ data-raw/README.md | 79 ++++++ data-raw/exclude_repos.csv | 13 + data-raw/harvest.R | 490 +++++++++++++++++++++++++++++++++++ data-raw/harvest_helpers.R | 207 +++++++++++++++ man/owd_datasets.Rd | 25 ++ man/owd_install.Rd | 30 +++ man/owd_packages.Rd | 39 +++ man/owd_search.Rd | 36 +++ man/owd_variables.Rd | 27 ++ tests/testthat/test-api.R | 90 +++++++ tests/testthat/test-schema.R | 82 ++++++ 18 files changed, 1437 insertions(+), 2 deletions(-) create mode 100644 R/catalog.R create mode 100644 R/owd_accessors.R create mode 100644 R/owd_install.R create mode 100644 R/owd_search.R create mode 100644 R/zzz.R create mode 100644 data-raw/README.md create mode 100644 data-raw/exclude_repos.csv create mode 100644 data-raw/harvest.R create mode 100644 data-raw/harvest_helpers.R create mode 100644 man/owd_datasets.Rd create mode 100644 man/owd_install.Rd create mode 100644 man/owd_packages.Rd create mode 100644 man/owd_search.Rd create mode 100644 man/owd_variables.Rd create mode 100644 tests/testthat/test-api.R create mode 100644 tests/testthat/test-schema.R diff --git a/DESCRIPTION b/DESCRIPTION index 3fb48cf..326f5fa 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: owdata Title: Index of openwashdata R Data Packages -Version: 0.0.0.9000 +Version: 0.0.0.9001 Authors@R: c( person("Lars", "Schöbitz", , "lschoebitz@ethz.ch", role = c("aut", "cre"), comment = c(ORCID = "0000-0003-2196-5015")), @@ -27,5 +27,5 @@ Imports: Language: en-GB LazyData: true Config/Needs/website: rmarkdown, brand.yml -Date: 2026-09-04 +Date: 2026-09-09 BugReports: https://github.com/openwashdata/owdata/issues diff --git a/NAMESPACE b/NAMESPACE index 976cc4c..ede2528 100644 --- a/NAMESPACE +++ b/NAMESPACE @@ -1,4 +1,9 @@ # Generated by roxygen2: do not edit by hand +export(owd_datasets) +export(owd_install) +export(owd_packages) +export(owd_search) +export(owd_variables) importFrom(tibble,tibble) importFrom(utils,install.packages) diff --git a/R/catalog.R b/R/catalog.R new file mode 100644 index 0000000..f05aa52 --- /dev/null +++ b/R/catalog.R @@ -0,0 +1,83 @@ +# The catalog object and the one place it is read from. +# +# The harvest writes owd_catalog into R/sysdata.rda. Every accessor reads +# it through owd_active_catalog(), so the tables can only come from one +# place (#6). There is no refresh function and no user cache: the harvest +# date in the startup message is the whole staleness signal +# (dev/decisions-2026-09.md, section 2). + +.owd_env <- new.env(parent = emptyenv()) + +#' Is this object a well formed catalog? +#' +#' @param x Any object. +#' @return TRUE when x carries the five catalog elements. +#' @keywords internal +#' @noRd +owd_is_catalog <- function(x) { + is.list(x) && + all(c("meta", "packages", "datasets", "variables", "index") %in% names(x)) && + is.list(x$meta) && + inherits(x$meta$harvest_date, "Date") && + is.data.frame(x$packages) && nrow(x$packages) > 0 && + is.data.frame(x$datasets) && + is.data.frame(x$variables) && + is.data.frame(x$index) +} + +#' The catalog every accessor reads +#' +#' Memoized per session. The object ships inside the package, so this +#' never touches the network or the filesystem beyond the installed +#' sysdata. +#' +#' @return The catalog list (meta, packages, datasets, variables, index). +#' @keywords internal +#' @noRd +owd_active_catalog <- function() { + hit <- .owd_env$catalog + if (!is.null(hit)) { + return(hit) + } + if (!owd_is_catalog(owd_catalog)) { + stop("The installed owdata catalog is malformed; reinstall the package.", call. = FALSE) + } + .owd_env$catalog <- owd_catalog + owd_catalog +} + +# --- search index ----------------------------------------------------------- + +#' Build the flat search index from the three catalog tables +#' +#' One row per searchable text field. Built once at harvest, so +#' owd_search() is a single vectorized grepl at query time. +#' +#' @param packages,datasets,variables The three catalog tables. +#' @return A tibble with columns pkg_name, match_type, dataset_name, +#' field, text. +#' @keywords internal +#' @noRd +owd_build_index <- function(packages, datasets, variables) { + piece <- function(pkg_name, match_type, dataset_name, field, text) { + keep <- !is.na(text) & nzchar(text) + tibble::tibble( + pkg_name = pkg_name[keep], + match_type = match_type, + dataset_name = dataset_name[keep], + field = field, + text = text[keep] + ) + } + na <- function(n) rep(NA_character_, n) + rbind( + piece(packages$pkg_name, "package", na(nrow(packages)), "pkg_name", packages$pkg_name), + piece(packages$pkg_name, "package", na(nrow(packages)), "title", packages$title), + piece(packages$pkg_name, "package", na(nrow(packages)), "description", packages$description), + piece(datasets$pkg_name, "dataset", datasets$dataset_name, "dataset_name", datasets$dataset_name), + piece(datasets$pkg_name, "dataset", datasets$dataset_name, "title", datasets$title), + piece(datasets$pkg_name, "dataset", datasets$dataset_name, "description", datasets$description), + piece(variables$pkg_name, "variable", variables$dataset_name, "variable_name", variables$variable_name), + piece(variables$pkg_name, "variable", variables$dataset_name, "description", variables$description) + ) +} diff --git a/R/owd_accessors.R b/R/owd_accessors.R new file mode 100644 index 0000000..d732ef0 --- /dev/null +++ b/R/owd_accessors.R @@ -0,0 +1,105 @@ +#' List the openwashdata packages in the catalog +#' +#' Returns the harvested package table. Every detected package is listed, +#' whether or not it has been published; use `published` to restrict the +#' result. +#' +#' A package counts as published when its `CITATION.cff` carries a Zenodo +#' DOI. There are no version tiers, so a version number says nothing +#' about whether a package is published. +#' +#' @param published Optional logical. `TRUE` keeps published packages, +#' `FALSE` keeps the rest, `NULL` (the default) returns all rows. +#' +#' @returns A tibble with one row per package and these columns: +#' `pkg_name`, `title`, `description`, `version` (leading v stripped), +#' `published`, `reviewed` (NA until the pkgreview check is wired), +#' `maintainer`, `maintainer_orcid`, `authors`, `license`, `date`, +#' `keywords`, `spatial_coverage`, `temporal_coverage`, `doi`, +#' `cff_version`, `url_github`, `url_docs`, `n_datasets`, +#' `latest_release`, `default_branch`, `created_at`, `last_commit`, +#' `topics`, `has_dictionary`, `has_extdata`, and the tooling +#' provenance columns `washr_version`, `brand_ref`, +#' `pkgreview_standard`, `has_r_cmd_check`, `has_pkgdown_workflow` +#' and `has_jsonld`. +#' +#' @export +#' @examples +#' owd_packages() +#' owd_packages(published = TRUE) +owd_packages <- function(published = NULL) { + out <- owd_active_catalog()$packages + if (!is.null(published)) { + if (!is.logical(published) || length(published) != 1 || is.na(published)) { + stop("`published` must be TRUE, FALSE or NULL.", call. = FALSE) + } + out <- out[out$published == published, , drop = FALSE] + } + out +} + +#' List the datasets shipped by published packages +#' +#' Dataset detail is harvested for published packages only; an +#' unpublished package appears in [owd_packages()] but not here. +#' +#' @param pkg Optional character vector of package names to keep. NULL +#' (the default) returns all rows. +#' @returns A tibble with one row per dataset, with columns `pkg_name`, +#' `dataset_name`, `title`, `description`, `n_rows`, `n_vars`, +#' `n_vars_dictionary`, `csv_url` and `xlsx_url`. +#' @export +#' @examples +#' owd_datasets() +#' owd_datasets(pkg = "washmalawi") +owd_datasets <- function(pkg = NULL) { + out <- owd_active_catalog()$datasets + if (!is.null(pkg)) { + owd_check_pkg_names(pkg) + out <- out[out$pkg_name %in% pkg, , drop = FALSE] + } + out +} + +#' List the documented variables across the catalog +#' +#' The cross-package variable dictionary, harvested from each package's +#' `data-raw/dictionary.csv`. Published packages only, as in +#' [owd_datasets()]. +#' +#' @param pkg Optional character vector of package names to keep. +#' @param dataset Optional character vector of dataset names to keep. +#' @returns A tibble with one row per documented variable, with columns +#' `pkg_name`, `dataset_name`, `variable_name`, `variable_type` (first +#' class only) and `description`. +#' @export +#' @examples +#' owd_variables(pkg = "washmalawi") +#' head(owd_variables()) +owd_variables <- function(pkg = NULL, dataset = NULL) { + out <- owd_active_catalog()$variables + if (!is.null(pkg)) { + owd_check_pkg_names(pkg) + out <- out[out$pkg_name %in% pkg, , drop = FALSE] + } + if (!is.null(dataset)) { + out <- out[out$dataset_name %in% dataset, , drop = FALSE] + } + out +} + +# Stop with a helpful message when a requested package is not in the +# catalog at all. +owd_check_pkg_names <- function(pkg) { + known <- owd_active_catalog()$packages$pkg_name + unknown <- setdiff(pkg, known) + if (length(unknown) > 0) { + stop( + "Not in the openwashdata catalog: ", + paste(unknown, collapse = ", "), + ". See owd_packages() for the full list.", + call. = FALSE + ) + } + invisible(TRUE) +} diff --git a/R/owd_install.R b/R/owd_install.R new file mode 100644 index 0000000..d96c678 --- /dev/null +++ b/R/owd_install.R @@ -0,0 +1,61 @@ +#' Install openwashdata packages from the openwashdata R-universe +#' +#' A thin wrapper around [utils::install.packages()] that points at +#' (with CRAN as fallback for +#' dependencies). +#' +#' @param pkg Character vector of package names to install. NULL (the +#' default) installs every published package after an interactive +#' confirmation showing the count; in non-interactive sessions NULL is +#' an error, so scripts must name packages explicitly. +#' @param ... Passed on to [utils::install.packages()]. +#' @returns Invisibly, the character vector of package names requested. +#' @export +#' @examples +#' \dontrun{ +#' owd_install("washmalawi") +#' owd_install() +#' } +owd_install <- function(pkg = NULL, ...) { + repos <- c( + openwashdata = "https://openwashdata.r-universe.dev", + CRAN = "https://cloud.r-project.org" + ) + if (is.null(pkg)) { + published <- owd_packages(published = TRUE)$pkg_name + if (length(published) == 0) { + stop("The catalog lists no published packages yet.", call. = FALSE) + } + if (!interactive()) { + stop( + "pkg = NULL would install all ", length(published), + " published packages. Name packages explicitly in scripts.", + call. = FALSE + ) + } + answer <- utils::askYesNo( + sprintf("Install all %d published openwashdata packages?", length(published)), + default = FALSE + ) + if (!isTRUE(answer)) { + message("Cancelled.") + return(invisible(character())) + } + pkg <- published + } else { + if (!is.character(pkg) || length(pkg) == 0) { + stop("`pkg` must be a character vector of package names.", call. = FALSE) + } + known <- owd_packages()$pkg_name + unknown <- setdiff(pkg, c(known, "owdata", "washr")) + if (length(unknown) > 0) { + stop( + "Not in the openwashdata catalog: ", paste(unknown, collapse = ", "), + ". See owd_packages() or owd_search().", + call. = FALSE + ) + } + } + utils::install.packages(pkg, repos = repos, ...) + invisible(pkg) +} diff --git a/R/owd_search.R b/R/owd_search.R new file mode 100644 index 0000000..c5fb5d8 --- /dev/null +++ b/R/owd_search.R @@ -0,0 +1,41 @@ +#' Search the openwashdata catalog +#' +#' Runs a case-insensitive regular expression over package, dataset and +#' variable metadata, so `owd_search("groundwater")` answers "which +#' package has data about groundwater". The search runs against a +#' prebuilt flat index, so it is a single vectorized match regardless of +#' catalog size. +#' +#' @param query A single regular expression (case-insensitive). Plain +#' words work as-is. +#' @param fields Character vector of fields to search. Any of "title", +#' "description", "variable_name", "dataset_name", "pkg_name". The +#' default covers titles, descriptions, variable names and dataset +#' names. +#' @return A tibble of hits with columns pkg_name, match_type ("package", +#' "dataset" or "variable"), dataset_name, field and text (the matched +#' text). Zero rows when nothing matches. +#' @export +#' @examples +#' owd_search("sanitation") +#' owd_search("water", fields = "variable_name") +owd_search <- function(query, + fields = c("title", "description", "variable_name", "dataset_name")) { + if (!is.character(query) || length(query) != 1 || is.na(query) || !nzchar(query)) { + stop("`query` must be a single non-empty string.", call. = FALSE) + } + fields <- match.arg( + fields, + c("title", "description", "variable_name", "dataset_name", "pkg_name"), + several.ok = TRUE + ) + index <- owd_active_catalog()$index + index <- index[index$field %in% fields, , drop = FALSE] + bad_regex <- function(c) stop("Invalid regular expression: ", query, call. = FALSE) + hit <- tryCatch( + grepl(query, index$text, ignore.case = TRUE, perl = TRUE), + error = bad_regex, + warning = bad_regex + ) + index[hit, , drop = FALSE] +} diff --git a/R/zzz.R b/R/zzz.R new file mode 100644 index 0000000..732129b --- /dev/null +++ b/R/zzz.R @@ -0,0 +1,22 @@ +# Attach behaviour. owdata never attaches or installs the packages it +# indexes; it prints one line naming the catalog and its harvest date. +# That date is the whole staleness signal: there is no refresh function +# and no cache (dev/decisions-2026-09.md, section 2). + +owd_startup_message <- function() { + cat <- owd_active_catalog() + sprintf( + "owdata catalog: %d published packages, %d datasets, %d variables (harvested %s). Try owd_search(), owd_packages(), owd_install().", + sum(cat$packages$published, na.rm = TRUE), + nrow(cat$datasets), + nrow(cat$variables), + format(cat$meta$harvest_date) + ) +} + +.onAttach <- function(libname, pkgname) { + msg <- tryCatch(owd_startup_message(), error = function(e) NULL) + if (!is.null(msg)) { + packageStartupMessage(msg) + } +} diff --git a/data-raw/README.md b/data-raw/README.md new file mode 100644 index 0000000..974b3c8 --- /dev/null +++ b/data-raw/README.md @@ -0,0 +1,79 @@ +# Harvest architecture and design notes + +This directory holds the harvest orchestration. The pure parsing and +policy functions it uses live in `R/` (see below for why). + +## Files + +- `harvest.R`: orchestrator. Enumerate repos, detect data packages, + parse metadata, set the published flag, assemble the catalog, run + gates, write all outputs. +- `harvest_helpers.R`: the two interchangeable backends (local clones + and GitHub API plus raw fetches) behind one source interface. +- `exclude_repos.csv`: denylist backstop for non-package repos. The + positive detection rule (root DESCRIPTION with a Package field plus at + least one `data/*.rda`) already excludes these; the file is a backstop. +- `dictionary.csv`: owdata's own variable dictionary, describing the + three exported tables (the washr convention, dogfooded). +- `packages.json`: generated draft of the r-universe registry. + Regenerated on every harvest so the two artifacts cannot drift; washr + and owdata are hard-coded into the generation and asserted by a unit + test, because the custom registry supersedes the auto-generated one + and must never drop washr. +- `harvest_report.md`: generated run report with problems and deltas + against the previous committed run. + +## Running a harvest + +```sh +# Full harvest from the GitHub organization (used by the weekly workflow; +# needs GITHUB_TOKEN or GITHUB_PAT for the API budget): +OWD_HARVEST_BACKEND=github Rscript data-raw/harvest.R + +# Identical parsing against local clones (offline development and the +# initial seed; GitHub-API-only columns come back NA): +OWD_HARVEST_BACKEND=local OWD_LOCAL_ROOT=~/path/to/clones Rscript data-raw/harvest.R +``` + +After a harvest, regenerate docs and run the gate: + +```sh +Rscript -e 'roxygen2::roxygenise()' +Rscript -e 'testthat::test_local(stop_on_failure = TRUE)' +``` + +## Error tolerance and gates + +Per-repo failures never abort the run; they accumulate in a problems +table written to `harvest_report.md`. The run exits non-zero only when a +shipped table would be empty or more than 10 percent of detected +packages failed to parse. On top of the schema tests, the report lists +deltas against the previous committed run (NA-rate increases in key +columns, published-flag changes, dropped packages) so silent +degradation shows up +as a diff, not as silence. + +## Deviations from the original plan issues + +Two deliberate deviations from the issue specs, both forced by making +`devtools::check()` pass: + +1. The plan named both data objects `owd_packages` and accessor + functions `owd_packages()`. A lazy-data object and an exported + function cannot share a name in one package, so the tables ship as + one internal object (`R/sysdata.rda`) and the accessors are the only + API. +2. The plan placed the parsers in `data-raw/`, but their unit tests must + run during `R CMD check` of the built tarball, which does not contain + `data-raw/`. The pure functions therefore live in `R/parsers.R` and + `R/catalog.R` (internal, tested), while everything that touches the + network or filesystem stays here. + +## Seed harvest + +The initial catalog was produced with the local backend over shallow +clones of the public repositories listed in the organization +spreadsheet (54 repos; three further repos are private and will enter +the catalog with the first workflow harvest, which enumerates the org +via the API). Columns only the GitHub API can supply (created_at, +topics, latest_release) are NA until that first automated run. diff --git a/data-raw/exclude_repos.csv b/data-raw/exclude_repos.csv new file mode 100644 index 0000000..701e688 --- /dev/null +++ b/data-raw/exclude_repos.csv @@ -0,0 +1,13 @@ +repo_name,reason +data,not an R package +jmpinput,not an R package +joshwaterjobs,not an R package +analytics,not an R package +test,not an R package +positcloud,not an R package +owdata,this package indexes the others +washr,publication toolkit not a data package +fairenough,publication toolkit not a data package +pkgreview,review process repo not a data package +website,org website not a data package +openwashdata.r-universe.dev,r-universe registry not a data package diff --git a/data-raw/harvest.R b/data-raw/harvest.R new file mode 100644 index 0000000..eb64c85 --- /dev/null +++ b/data-raw/harvest.R @@ -0,0 +1,490 @@ +# Harvest orchestrator: build the openwashdata catalog. +# +# Usage: +# OWD_HARVEST_BACKEND=github Rscript data-raw/harvest.R +# OWD_HARVEST_BACKEND=local OWD_LOCAL_ROOT=~/clones Rscript data-raw/harvest.R +# +# Backends are interchangeable (data-raw/harvest_helpers.R); columns only +# the GitHub API can supply come back NA from the local backend. Per-repo +# failures never abort the run: they accumulate in a problems table, +# printed at the end and written to data-raw/harvest_report.md. The run +# fails (non-zero exit) only if a shipped table would be empty or more +# than 10 percent of detected packages failed to parse. +# +# Outputs: +# R/sysdata.rda internal catalog snapshot +# inst/extdata/owd_{packages,datasets,variables}.csv +# data-raw/packages.json r-universe registry draft +# data-raw/harvest_report.md run report incl. problems and deltas + +source("R/parsers.R") +source("R/catalog.R") +source("data-raw/harvest_helpers.R") + +org <- "openwashdata" + +# --- per-repo harvest ------------------------------------------------------- + +# Returns NULL when the repo is not a data package, otherwise a list with +# package_row, datasets, variables, problems (data.frame rows). +harvest_repo <- function(src) { + problems <- list() + note <- function(stage, reason) { + problems[[length(problems) + 1]] <<- data.frame( + repo = src$repo, stage = stage, reason = reason + ) + } + + desc_text <- src$read_file("DESCRIPTION") + if (is.na(desc_text)) { + return(NULL) + } + desc <- owd_parse_description(desc_text) + if (is.na(desc$package)) { + note("fatal", "DESCRIPTION present but unparseable") + return(list(problems = do.call(rbind, problems))) + } + + data_files <- src$list_files("data") + rda <- grep("\\.rda$", data_files, value = TRUE, ignore.case = TRUE) + if (length(rda) == 0) { + return(NULL) + } + + cff <- owd_parse_cff(src$read_file("CITATION.cff")) + version_norm <- owd_normalize_version(desc$version) + if (!is.na(desc$version) && !identical(desc$version, version_norm)) { + note("warn", paste0("normalized malformed version '", desc$version, "'")) + } + # A package is published when CITATION.cff carries a Zenodo DOI. There + # are no version tiers (dev/decisions-2026-09.md, section 1). + published <- !is.na(cff$doi) && grepl("^10\\.5281/zenodo\\.", cff$doi) + if (!is.na(cff$version) && !is.na(version_norm) && + !identical(owd_normalize_version(cff$version), version_norm)) { + note("warn", sprintf( + "version drift: DESCRIPTION %s vs CITATION.cff %s", version_norm, cff$version + )) + } + + url_github <- paste0("https://github.com/", org, "/", src$repo) + if (!is.na(desc$url) && !grepl(url_github, desc$url, fixed = TRUE)) { + note("warn", paste0("DESCRIPTION URL does not mention ", url_github)) + } + + dict_text <- src$read_file("data-raw/dictionary.csv") + extdata <- src$list_files("inst/extdata") + + # schema.org fields washr 1.1.0 writes into DESCRIPTION (#5). + dcf <- tryCatch(read.dcf(textConnection(desc_text)), error = function(e) NULL) + desc_field <- function(name) { + if (!is.null(dcf) && name %in% colnames(dcf) && !is.na(dcf[1, name])) { + trimws(gsub("\\s+", " ", unname(dcf[1, name]))) + } else { + NA_character_ + } + } + keywords <- desc_field("X-schema.org-keywords") + if (is.na(keywords)) keywords <- src$meta$topics + + # Tooling provenance (#18). washr_version stays NA until washr #81 + # ships the Config/washr fields. + workflows <- src$list_files(".github/workflows") + claude_md <- src$read_file("CLAUDE.md") + pkgreview_standard <- NA_character_ + if (!is.na(claude_md)) { + # Split first: a character class cannot carry the newline escapes, + # so matching against the whole file would run past the line end. + stamp <- grep("Standard version:", strsplit(claude_md, "\r?\n")[[1]], value = TRUE) + if (length(stamp) > 0) { + pkgreview_standard <- trimws(sub("^.*Standard version:\\s*", "", stamp[1])) + } + } + brand_ref <- if (!is.na(desc_field("Config/washr/brand"))) { + desc_field("Config/washr/brand") + } else if (!is.na(src$read_file("_brand.yml"))) { + "main" + } else { + NA_character_ + } + + package_row <- tibble::tibble( + pkg_name = desc$package, + title = desc$title, + description = desc$description, + version = version_norm, + published = published, + reviewed = NA, + maintainer = desc$maintainer, + maintainer_orcid = desc$maintainer_orcid, + authors = desc$authors, + license = desc$license, + date = desc$date, + keywords = keywords, + spatial_coverage = desc_field("X-schema.org-spatialCoverage"), + temporal_coverage = desc_field("X-schema.org-temporalCoverage"), + doi = cff$doi, + cff_version = cff$version, + url_github = url_github, + url_docs = paste0("https://openwashdata.github.io/", desc$package, "/"), + n_datasets = length(rda), + latest_release = src$meta$latest_release, + default_branch = src$meta$default_branch, + created_at = as.Date(src$meta$created_at), + last_commit = as.Date(src$meta$pushed_at), + topics = src$meta$topics, + has_dictionary = !is.na(dict_text), + has_extdata = length(extdata) > 0, + washr_version = desc_field("Config/washr/version"), + brand_ref = brand_ref, + pkgreview_standard = pkgreview_standard, + has_r_cmd_check = "R-CMD-check.yaml" %in% workflows, + has_pkgdown_workflow = "pkgdown.yaml" %in% workflows, + has_jsonld = !is.na(src$read_file("pkgdown/templates/in-header.html")) + ) + + datasets <- NULL + variables <- NULL + if (published) { + detail <- harvest_detail(src, desc$package, rda, dict_text, extdata, note) + datasets <- detail$datasets + variables <- detail$variables + } + + list( + package_row = package_row, + datasets = datasets, + variables = variables, + problems = if (length(problems) > 0) do.call(rbind, problems) else NULL + ) +} + +# Dataset- and variable-level detail, harvested only for candidate and +# catalogued packages. +harvest_detail <- function(src, pkg_name, rda, dict_text, extdata, note) { + ds_names <- sub("\\.rda$", "", rda, ignore.case = TRUE) + + # Roxygen data docs from every R source file. + r_files <- grep("\\.[Rr]$", src$list_files("R"), value = TRUE) + docs <- lapply(r_files, function(f) { + owd_parse_data_docs(src$read_file(file.path("R", f))) + }) + docs <- do.call(rbind, c(docs, list(owd_parse_data_docs(NA_character_)))) + docs <- docs[!duplicated(docs$dataset_name), , drop = FALSE] + + # Dictionary, with git-lfs refetch through the media endpoint. + dict <- owd_parse_dictionary(dict_text) + if (identical(dict$status, "lfs_pointer")) { + dict <- owd_parse_dictionary(src$read_file_media("data-raw/dictionary.csv")) + if (!identical(dict$status, "ok")) { + note("warn", "dictionary.csv is a git-lfs pointer and the media fetch failed") + } + } + dict_rows <- NULL + if (identical(dict$status, "ok")) { + dict_rows <- dict$data + dict_rows$dataset_name <- sub("\\.rda$", "", dict_rows$file_name, ignore.case = TRUE) + if (identical(dict$schema, "two_column")) { + if (length(ds_names) == 1) { + dict_rows$dataset_name <- ds_names + } else { + note("warn", "two-column dictionary in a multi-dataset package; variables not attributed") + dict_rows$dataset_name <- NA_character_ + } + } + unknown <- setdiff(stats::na.omit(unique(dict_rows$dataset_name)), ds_names) + if (length(unknown) > 0) { + note("warn", paste( + "dictionary references file_name(s) with no matching data/*.rda:", + paste(unknown, collapse = ", ") + )) + } + } else if (!is.na(dict_text) && length(dict$notes) > 0) { + note("warn", paste("dictionary.csv:", paste(dict$notes, collapse = "; "))) + } + + n_vars_dict <- if (!is.null(dict_rows)) table(dict_rows$dataset_name) else table(character()) + doc_idx <- match(ds_names, docs$dataset_name) + branch <- src$meta$default_branch + file_url <- function(name, ext) { + file <- paste0(name, ext) + ifelse( + file %in% extdata & !is.na(branch), + paste0( + "https://raw.githubusercontent.com/", org, "/", src$repo, "/", + branch, "/inst/extdata/", file + ), + NA_character_ + ) + } + + datasets <- tibble::tibble( + pkg_name = pkg_name, + dataset_name = ds_names, + title = docs$title[doc_idx], + description = docs$description[doc_idx], + n_rows = docs$n_rows[doc_idx], + n_vars = docs$n_vars[doc_idx], + n_vars_dictionary = as.integer(ifelse( + ds_names %in% names(n_vars_dict), n_vars_dict[ds_names], NA_integer_ + )), + csv_url = file_url(ds_names, ".csv"), + xlsx_url = file_url(ds_names, ".xlsx") + ) + + variables <- NULL + if (!is.null(dict_rows) && nrow(dict_rows) > 0) { + variables <- tibble::tibble( + pkg_name = pkg_name, + dataset_name = dict_rows$dataset_name, + variable_name = dict_rows$variable_name, + variable_type = dict_rows$variable_type, + description = dict_rows$description + ) + } + list(datasets = datasets, variables = variables) +} + +# --- run -------------------------------------------------------------------- + +backend <- Sys.getenv("OWD_HARVEST_BACKEND", unset = "github") +message("Harvest backend: ", backend) + +exclude <- utils::read.csv("data-raw/exclude_repos.csv", colClasses = "character") + +if (backend == "local") { + root <- Sys.getenv("OWD_LOCAL_ROOT") + stopifnot(nzchar(root), dir.exists(root)) + paths <- owd_local_repos(root) + paths <- paths[!basename(paths) %in% exclude$repo_name] + sources <- paths + make_source <- owd_local_source +} else { + listing <- owd_github_repos(org) + message(length(listing$active), " active repos, ", length(listing$archived), " archived (skipped)") + sources <- setdiff(listing$active, exclude$repo_name) + make_source <- function(repo) owd_github_source(repo, org) +} + +results <- vector("list", length(sources)) +problems <- list() +for (i in seq_along(sources)) { + id <- basename(sources[[i]]) + results[[i]] <- tryCatch( + harvest_repo(make_source(sources[[i]])), + error = function(e) { + list(problems = data.frame(repo = id, stage = "fatal", reason = conditionMessage(e))) + } + ) +} + +pick <- function(field) { + parts <- lapply(results, function(r) r[[field]]) + parts <- parts[!vapply(parts, is.null, logical(1))] + if (length(parts) == 0) NULL else do.call(rbind, parts) +} + +packages <- pick("package_row") +datasets <- pick("datasets") +variables <- pick("variables") +problems <- pick("problems") +if (is.null(problems)) { + problems <- data.frame(repo = character(), stage = character(), reason = character()) +} + +stopifnot(!is.null(packages)) +packages <- packages[order(packages$pkg_name), , drop = FALSE] +if (!is.null(datasets)) datasets <- datasets[order(datasets$pkg_name, datasets$dataset_name), , drop = FALSE] +if (!is.null(variables)) variables <- variables[order(variables$pkg_name, variables$dataset_name), , drop = FALSE] + +# --- gates ------------------------------------------------------------------ + +n_detected <- nrow(packages) + length(unique(problems$repo[problems$stage == "fatal"])) +n_fatal <- length(unique(problems$repo[problems$stage == "fatal"])) +message(sprintf( + "Detected %d data packages (%d fatal failures), %d datasets, %d variables", + n_detected, n_fatal, + if (is.null(datasets)) 0 else nrow(datasets), + if (is.null(variables)) 0 else nrow(variables) +)) +if (nrow(packages) == 0) { + stop("A shipped table would be empty; refusing to write the catalog.") +} +if (any(packages$published) && + (is.null(datasets) || is.null(variables) || + nrow(datasets) == 0 || nrow(variables) == 0)) { + stop("Published packages exist but the detail tables are empty; refusing to write the catalog.") +} +if (is.null(datasets)) { + datasets <- tibble::tibble( + pkg_name = character(), dataset_name = character(), title = character(), + description = character(), n_rows = integer(), n_vars = integer(), + n_vars_dictionary = integer(), csv_url = character(), xlsx_url = character() + ) +} +if (is.null(variables)) { + variables <- tibble::tibble( + pkg_name = character(), dataset_name = character(), variable_name = character(), + variable_type = character(), description = character() + ) +} + +# --- value-level gates (#4) ------------------------------------------------- +# These catch defects the schema tests cannot see, because NA and a +# mojibake string are both structurally valid. + +escaped <- unlist(lapply(list(packages, datasets, variables), function(df) { + chr <- vapply(df, is.character, logical(1)) + unlist(lapply(df[chr], function(x) x[!is.na(x) & grepl(" 0) { + stop(sprintf( + "Found %d value(s) carrying escapes; the run needs a UTF-8 locale. First: %s", + length(escaped), escaped[1] + )) +} +dup_doi <- packages$doi[!is.na(packages$doi) & duplicated(packages$doi)] +if (length(dup_doi) > 0) { + stop("DOI shared by more than one package: ", paste(unique(dup_doi), collapse = ", ")) +} +dup_pkg <- packages$pkg_name[duplicated(packages$pkg_name)] +if (length(dup_pkg) > 0) { + stop("Duplicated package name(s): ", paste(unique(dup_pkg), collapse = ", ")) +} +if (n_fatal / n_detected > 0.10) { + stop(sprintf( + "%d of %d detected packages failed to parse (over 10 percent); refusing to write the catalog.", + n_fatal, n_detected + )) +} + +# --- deltas against the previous committed run ------------------------------ + +deltas <- character() +prev_path <- "inst/extdata/owd_packages.csv" +if (file.exists(prev_path)) { + prev <- utils::read.csv(prev_path, colClasses = "character") + na_rate <- function(df, col) { + if (is.null(df[[col]])) 1 else mean(is.na(df[[col]]) | df[[col]] == "") + } + for (col in c("doi", "description", "title", "maintainer")) { + old_rate <- na_rate(prev, col) + new_rate <- mean(is.na(packages[[col]])) + if (new_rate > old_rate + 0.01) { + deltas <- c(deltas, sprintf( + "NA rate for %s rose from %.0f%% to %.0f%%", col, 100 * old_rate, 100 * new_rate + )) + } + } + both <- intersect(prev$pkg_name, packages$pkg_name) + old_pub <- toupper(prev$published[match(both, prev$pkg_name)]) + new_pub <- toupper(as.character(packages$published[match(both, packages$pkg_name)])) + moved <- both[!is.na(old_pub) & old_pub != new_pub] + for (p in moved) { + deltas <- c(deltas, sprintf( + "published change: %s %s -> %s", p, + old_pub[match(p, both)], new_pub[match(p, both)] + )) + } + gone <- setdiff(prev$pkg_name, packages$pkg_name) + if (length(gone) > 0) { + deltas <- c(deltas, paste("packages dropped from catalog:", paste(gone, collapse = ", "))) + } +} + +# --- assemble and write ----------------------------------------------------- + +meta <- list( + harvested_at = format(Sys.time(), "%Y-%m-%dT%H:%M:%SZ", tz = "UTC"), + harvest_date = Sys.Date(), + backend = backend, + org = org, + n_repos_scanned = length(sources), + n_problems = nrow(problems) +) +owd_catalog <- list( + meta = meta, + packages = tibble::as_tibble(packages), + datasets = tibble::as_tibble(datasets), + variables = tibble::as_tibble(variables), + index = owd_build_index(packages, datasets, variables) +) +stopifnot(owd_is_catalog(owd_catalog)) + +save(owd_catalog, file = "R/sysdata.rda", compress = "xz", version = 2) + +dir.create("inst/extdata", recursive = TRUE, showWarnings = FALSE) +tables <- list( + owd_packages = owd_catalog$packages, + owd_datasets = owd_catalog$datasets, + owd_variables = owd_catalog$variables +) +# Read the committed CSVs before overwriting them, so the version bump +# below can tell a real change from a no-op run. +previous_csv <- lapply(names(tables), function(name) { + path <- file.path("inst/extdata", paste0(name, ".csv")) + if (file.exists(path)) readLines(path, warn = FALSE) else NULL +}) +names(previous_csv) <- names(tables) +for (name in names(tables)) { + utils::write.csv( + tables[[name]], file.path("inst/extdata", paste0(name, ".csv")), + row.names = FALSE, na = "", fileEncoding = "UTF-8" + ) +} + +# r-universe registry draft. washr and owdata are hard-coded on purpose: +# the custom registry supersedes the auto-generated CRAN registry, so a +# generated file that ever omitted washr would silently drop it from +# https://openwashdata.r-universe.dev (openwashdata/owdata#8). +registry <- unique(c(packages$pkg_name[packages$published], "washr", "owdata")) +registry <- sort(registry) +packages_json <- data.frame( + package = registry, + url = paste0("https://github.com/", org, "/", registry) +) +writeLines( + jsonlite::toJSON(packages_json, pretty = TRUE), + "data-raw/packages.json" +) + +# --- version bump (#4) ------------------------------------------------------ +# Any change to the shipped tables bumps the fourth component and sets +# Date, so r-universe rebuilds and update.packages() sees a new version. + +changed <- vapply(names(tables), function(name) { + path <- file.path("inst/extdata", paste0(name, ".csv")) + !identical(previous_csv[[name]], if (file.exists(path)) readLines(path, warn = FALSE) else NULL) +}, logical(1)) +if (any(changed)) { + desc::desc_bump_version("dev", file = "DESCRIPTION") + desc::desc_set("Date", as.character(meta$harvest_date), file = "DESCRIPTION") + message("Version bumped to ", desc::desc_get_version(file = "DESCRIPTION")) +} else { + message("Tables unchanged; version left as it is.") +} + +# --- report ----------------------------------------------------------------- + +report <- c( + "# Harvest report", "", + paste0("Run: ", meta$harvested_at, " (backend: ", backend, ")"), "", + sprintf( + "Packages: %d (%d published). Datasets: %d. Variables: %d.", + nrow(packages), sum(packages$published), nrow(datasets), nrow(variables) + ), "", + "## Deltas since previous committed run", "", + if (length(deltas) > 0) paste0("- ", deltas) else "None.", "", + "## Problems", "", + if (nrow(problems) > 0) { + sprintf("- %s [%s]: %s", problems$repo, problems$stage, problems$reason) + } else { + "None." + } +) +writeLines(report, "data-raw/harvest_report.md") + +message(paste(report, collapse = "\n")) +if (length(deltas) > 0) { + message("DELTA WARNINGS PRESENT: review data-raw/harvest_report.md before trusting this run.") +} +message("Harvest complete.") diff --git a/data-raw/harvest_helpers.R b/data-raw/harvest_helpers.R new file mode 100644 index 0000000..8b10738 --- /dev/null +++ b/data-raw/harvest_helpers.R @@ -0,0 +1,207 @@ +# Harvest backends: interchangeable sources of repository files. +# +# A source is a plain list with fields: +# repo repository name +# read_file(path) file contents as one string, NA_character_ if absent +# read_file_media(path) like read_file but resolves git-lfs content +# (GitHub backend only; local backend returns the +# pointer unchanged) +# list_files(dir) file names inside dir, character(0) if absent +# meta list: default_branch, created_at, pushed_at, topics, +# latest_release, archived. Fields a backend cannot +# know are NA. +# +# The GitHub backend budget is 4 API requests plus a handful of raw +# fetches per repo (raw.githubusercontent.com is not rate limited), so a +# full org harvest stays far below the 5000/hour API limit. + +# A few org repos ship latin1-encoded files (for example the +# undpcomposite dictionary); normalize everything to valid UTF-8 before +# it reaches the parsers. +owd_as_utf8 <- function(x) { + if (is.na(x) || all(validUTF8(x))) { + return(x) + } + converted <- iconv(x, from = "latin1", to = "UTF-8") + if (is.na(converted)) iconv(x, to = "UTF-8", sub = "byte") else converted +} + +# --- local backend ---------------------------------------------------------- + +owd_local_source <- function(path) { + stopifnot(dir.exists(path)) + read_file <- function(rel) { + f <- file.path(path, rel) + if (!file.exists(f)) { + return(NA_character_) + } + owd_as_utf8(paste(readLines(f, warn = FALSE, encoding = "UTF-8"), collapse = "\n")) + } + list_files <- function(rel) { + d <- file.path(path, rel) + if (!dir.exists(d)) { + return(character()) + } + list.files(d) + } + git <- function(...) { + out <- suppressWarnings(tryCatch( + system2("git", c("-C", path, ...), stdout = TRUE, stderr = FALSE), + error = function(e) character() + )) + if (length(out) == 0 || !nzchar(out[1])) NA_character_ else out[1] + } + list( + repo = basename(path), + read_file = read_file, + read_file_media = read_file, + list_files = list_files, + meta = list( + default_branch = git("rev-parse", "--abbrev-ref", "HEAD"), + created_at = NA_character_, + pushed_at = git("log", "-1", "--format=%cs"), + topics = NA_character_, + latest_release = NA_character_, + archived = FALSE + ) + ) +} + +# All immediate subdirectories of root that look like git repos or plain +# package checkouts. +owd_local_repos <- function(root) { + dirs <- list.dirs(root, recursive = FALSE) + dirs[!startsWith(basename(dirs), ".")] +} + +# --- GitHub backend --------------------------------------------------------- + +owd_gh_token <- function() { + for (var in c("GITHUB_PAT", "GITHUB_TOKEN", "GH_TOKEN")) { + tok <- Sys.getenv(var, unset = "") + if (nzchar(tok)) { + return(tok) + } + } + # In Actions the token arrives as an environment variable. On a + # maintainer's machine it usually lives in the gh CLI keyring instead, + # where an unauthenticated run would otherwise hit the 60 requests per + # hour limit for anonymous callers. + tok <- suppressWarnings(tryCatch( + system2("gh", c("auth", "token"), stdout = TRUE, stderr = FALSE), + error = function(e) character() + )) + if (length(tok) > 0 && nzchar(tok[1])) { + return(trimws(tok[1])) + } + "" +} + +# GET a URL to a temp file with one retry; returns the path or NULL. +owd_http_fetch <- function(url, headers = character(), tries = 3) { + for (i in seq_len(tries)) { + dest <- tempfile() + ok <- tryCatch( + { + suppressWarnings(utils::download.file( + url, dest, + quiet = TRUE, mode = "wb", headers = headers + )) + TRUE + }, + error = function(e) FALSE + ) + if (ok) { + return(dest) + } + unlink(dest) + if (i < tries) Sys.sleep(2^i) + } + NULL +} + +owd_gh_api <- function(path, org = "openwashdata") { + headers <- c(Accept = "application/vnd.github+json") + tok <- owd_gh_token() + if (nzchar(tok)) { + headers <- c(headers, Authorization = paste("Bearer", tok)) + } + f <- owd_http_fetch(paste0("https://api.github.com", path), headers, tries = 2) + if (is.null(f)) { + return(NULL) + } + on.exit(unlink(f)) + tryCatch(jsonlite::fromJSON(f, simplifyVector = TRUE), error = function(e) NULL) +} + +# One paginated listing of all non-archived org repos. +owd_github_repos <- function(org = "openwashdata") { + repos <- character() + archived <- character() + page <- 1 + repeat { + batch <- owd_gh_api(sprintf("/orgs/%s/repos?per_page=100&page=%d", org, page)) + if (is.null(batch) || length(batch) == 0 || is.null(batch$name)) break + repos <- c(repos, batch$name[!batch$archived]) + archived <- c(archived, batch$name[batch$archived]) + if (nrow(batch) < 100) break + page <- page + 1 + } + if (length(repos) == 0) { + stop("Could not list repositories for org ", org) + } + list(active = repos, archived = archived) +} + +owd_github_source <- function(repo, org = "openwashdata") { + info <- owd_gh_api(paste0("/repos/", org, "/", repo)) + if (is.null(info) || is.null(info$default_branch)) { + stop("repos API request failed for ", repo) + } + branch <- info$default_branch + release <- owd_gh_api(paste0("/repos/", org, "/", repo, "/releases/latest")) + + fetch_text <- function(base, rel) { + url <- paste0(base, "/", org, "/", repo, "/", branch, "/", utils::URLencode(rel)) + f <- owd_http_fetch(url, tries = 2) + if (is.null(f)) { + return(NA_character_) + } + on.exit(unlink(f)) + owd_as_utf8(paste(readLines(f, warn = FALSE, encoding = "UTF-8"), collapse = "\n")) + } + read_file <- function(rel) { + fetch_text("https://raw.githubusercontent.com", rel) + } + # media.githubusercontent.com serves the stored object for git-lfs + # pointers, which raw.githubusercontent.com does not resolve. + read_file_media <- function(rel) { + fetch_text("https://media.githubusercontent.com/media", rel) + } + list_files <- function(rel) { + listing <- owd_gh_api(paste0( + "/repos/", org, "/", repo, "/contents/", utils::URLencode(rel), "?ref=", branch + )) + if (is.null(listing) || is.null(listing$name)) { + return(character()) + } + listing$name + } + as_date_chr <- function(x) { + if (is.null(x) || is.na(x)) NA_character_ else substr(x, 1, 10) + } + list( + repo = repo, + read_file = read_file, + read_file_media = read_file_media, + list_files = list_files, + meta = list( + default_branch = branch, + created_at = as_date_chr(info$created_at), + pushed_at = as_date_chr(info$pushed_at), + topics = if (length(info$topics) > 0) paste(info$topics, collapse = ", ") else NA_character_, + latest_release = if (!is.null(release$tag_name)) release$tag_name else NA_character_, + archived = isTRUE(info$archived) + ) + ) +} diff --git a/man/owd_datasets.Rd b/man/owd_datasets.Rd new file mode 100644 index 0000000..f120ffa --- /dev/null +++ b/man/owd_datasets.Rd @@ -0,0 +1,25 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/owd_accessors.R +\name{owd_datasets} +\alias{owd_datasets} +\title{List the datasets shipped by published packages} +\usage{ +owd_datasets(pkg = NULL) +} +\arguments{ +\item{pkg}{Optional character vector of package names to keep. NULL +(the default) returns all rows.} +} +\value{ +A tibble with one row per dataset, with columns \code{pkg_name}, +\code{dataset_name}, \code{title}, \code{description}, \code{n_rows}, \code{n_vars}, +\code{n_vars_dictionary}, \code{csv_url} and \code{xlsx_url}. +} +\description{ +Dataset detail is harvested for published packages only; an +unpublished package appears in \code{\link[=owd_packages]{owd_packages()}} but not here. +} +\examples{ +owd_datasets() +owd_datasets(pkg = "washmalawi") +} diff --git a/man/owd_install.Rd b/man/owd_install.Rd new file mode 100644 index 0000000..d492ce4 --- /dev/null +++ b/man/owd_install.Rd @@ -0,0 +1,30 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/owd_install.R +\name{owd_install} +\alias{owd_install} +\title{Install openwashdata packages from the openwashdata R-universe} +\usage{ +owd_install(pkg = NULL, ...) +} +\arguments{ +\item{pkg}{Character vector of package names to install. NULL (the +default) installs every published package after an interactive +confirmation showing the count; in non-interactive sessions NULL is +an error, so scripts must name packages explicitly.} + +\item{...}{Passed on to \code{\link[utils:install.packages]{utils::install.packages()}}.} +} +\value{ +Invisibly, the character vector of package names requested. +} +\description{ +A thin wrapper around \code{\link[utils:install.packages]{utils::install.packages()}} that points at +\url{https://openwashdata.r-universe.dev} (with CRAN as fallback for +dependencies). +} +\examples{ +\dontrun{ +owd_install("washmalawi") +owd_install() +} +} diff --git a/man/owd_packages.Rd b/man/owd_packages.Rd new file mode 100644 index 0000000..6d327b9 --- /dev/null +++ b/man/owd_packages.Rd @@ -0,0 +1,39 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/owd_accessors.R +\name{owd_packages} +\alias{owd_packages} +\title{List the openwashdata packages in the catalog} +\usage{ +owd_packages(published = NULL) +} +\arguments{ +\item{published}{Optional logical. \code{TRUE} keeps published packages, +\code{FALSE} keeps the rest, \code{NULL} (the default) returns all rows.} +} +\value{ +A tibble with one row per package and these columns: +\code{pkg_name}, \code{title}, \code{description}, \code{version} (leading v stripped), +\code{published}, \code{reviewed} (NA until the pkgreview check is wired), +\code{maintainer}, \code{maintainer_orcid}, \code{authors}, \code{license}, \code{date}, +\code{keywords}, \code{spatial_coverage}, \code{temporal_coverage}, \code{doi}, +\code{cff_version}, \code{url_github}, \code{url_docs}, \code{n_datasets}, +\code{latest_release}, \code{default_branch}, \code{created_at}, \code{last_commit}, +\code{topics}, \code{has_dictionary}, \code{has_extdata}, and the tooling +provenance columns \code{washr_version}, \code{brand_ref}, +\code{pkgreview_standard}, \code{has_r_cmd_check}, \code{has_pkgdown_workflow} +and \code{has_jsonld}. +} +\description{ +Returns the harvested package table. Every detected package is listed, +whether or not it has been published; use \code{published} to restrict the +result. +} +\details{ +A package counts as published when its \code{CITATION.cff} carries a Zenodo +DOI. There are no version tiers, so a version number says nothing +about whether a package is published. +} +\examples{ +owd_packages() +owd_packages(published = TRUE) +} diff --git a/man/owd_search.Rd b/man/owd_search.Rd new file mode 100644 index 0000000..fcfb42a --- /dev/null +++ b/man/owd_search.Rd @@ -0,0 +1,36 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/owd_search.R +\name{owd_search} +\alias{owd_search} +\title{Search the openwashdata catalog} +\usage{ +owd_search( + query, + fields = c("title", "description", "variable_name", "dataset_name") +) +} +\arguments{ +\item{query}{A single regular expression (case-insensitive). Plain +words work as-is.} + +\item{fields}{Character vector of fields to search. Any of "title", +"description", "variable_name", "dataset_name", "pkg_name". The +default covers titles, descriptions, variable names and dataset +names.} +} +\value{ +A tibble of hits with columns pkg_name, match_type ("package", +"dataset" or "variable"), dataset_name, field and text (the matched +text). Zero rows when nothing matches. +} +\description{ +Runs a case-insensitive regular expression over package, dataset and +variable metadata, so \code{owd_search("groundwater")} answers "which +package has data about groundwater". The search runs against a +prebuilt flat index, so it is a single vectorized match regardless of +catalog size. +} +\examples{ +owd_search("sanitation") +owd_search("water", fields = "variable_name") +} diff --git a/man/owd_variables.Rd b/man/owd_variables.Rd new file mode 100644 index 0000000..04beb5e --- /dev/null +++ b/man/owd_variables.Rd @@ -0,0 +1,27 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/owd_accessors.R +\name{owd_variables} +\alias{owd_variables} +\title{List the documented variables across the catalog} +\usage{ +owd_variables(pkg = NULL, dataset = NULL) +} +\arguments{ +\item{pkg}{Optional character vector of package names to keep.} + +\item{dataset}{Optional character vector of dataset names to keep.} +} +\value{ +A tibble with one row per documented variable, with columns +\code{pkg_name}, \code{dataset_name}, \code{variable_name}, \code{variable_type} (first +class only) and \code{description}. +} +\description{ +The cross-package variable dictionary, harvested from each package's +\code{data-raw/dictionary.csv}. Published packages only, as in +\code{\link[=owd_datasets]{owd_datasets()}}. +} +\examples{ +owd_variables(pkg = "washmalawi") +head(owd_variables()) +} diff --git a/tests/testthat/test-api.R b/tests/testthat/test-api.R new file mode 100644 index 0000000..c8cf5fb --- /dev/null +++ b/tests/testthat/test-api.R @@ -0,0 +1,90 @@ +# One behavioural test per export. Every expect_error() names its +# message, as CLAUDE.md requires. + +test_that("owd_packages filters on the published flag", { + all_pkgs <- owd_packages() + pub <- owd_packages(published = TRUE) + unpub <- owd_packages(published = FALSE) + expect_gt(nrow(all_pkgs), 0) + expect_equal(nrow(pub) + nrow(unpub), nrow(all_pkgs)) + expect_true(all(pub$published)) + expect_false(any(unpub$published)) +}) + +test_that("owd_packages rejects a non-logical published argument", { + expect_error(owd_packages(published = "yes"), "must be TRUE, FALSE or NULL") + expect_error(owd_packages(published = NA), "must be TRUE, FALSE or NULL") + expect_error(owd_packages(published = c(TRUE, FALSE)), "must be TRUE, FALSE or NULL") +}) + +test_that("owd_datasets filters by package", { + d <- owd_datasets() + skip_if(nrow(d) == 0, "no published packages in this catalog") + one <- d$pkg_name[1] + expect_true(all(owd_datasets(pkg = one)$pkg_name == one)) +}) + +test_that("owd_datasets rejects an unknown package", { + expect_error(owd_datasets(pkg = "not-a-package"), "Not in the openwashdata catalog") +}) + +test_that("owd_variables filters by package and dataset", { + v <- owd_variables() + skip_if(nrow(v) == 0, "no published packages in this catalog") + one <- v$pkg_name[1] + sub <- owd_variables(pkg = one) + expect_true(all(sub$pkg_name == one)) + ds <- sub$dataset_name[!is.na(sub$dataset_name)][1] + skip_if(is.na(ds), "no attributed dataset name") + expect_true(all(owd_variables(pkg = one, dataset = ds)$dataset_name == ds)) +}) + +test_that("owd_variables rejects an unknown package", { + expect_error(owd_variables(pkg = "not-a-package"), "Not in the openwashdata catalog") +}) + +test_that("owd_search finds hits for the terms the catalog is built for", { + for (query in c("groundwater", "sanitation")) { + hits <- owd_search(query) + expect_gt(nrow(hits), 0) + expect_true(all(hits$match_type %in% c("package", "dataset", "variable"))) + expect_true(all(grepl(query, hits$text, ignore.case = TRUE))) + } +}) + +test_that("owd_search is case insensitive and honours the fields argument", { + expect_equal(nrow(owd_search("WATER")), nrow(owd_search("water"))) + hits <- owd_search("water", fields = "variable_name") + expect_true(all(hits$field == "variable_name")) +}) + +test_that("owd_search returns zero rows rather than failing on no match", { + hits <- owd_search("zzzznotpresentanywhere") + expect_s3_class(hits, "tbl_df") + expect_equal(nrow(hits), 0) +}) + +test_that("owd_search rejects an empty or malformed query", { + expect_error(owd_search(""), "must be a single non-empty string") + expect_error(owd_search(NA_character_), "must be a single non-empty string") + expect_error(owd_search(c("a", "b")), "must be a single non-empty string") + expect_error(owd_search("("), "Invalid regular expression") +}) + +test_that("owd_install refuses an unknown package and never installs in tests", { + expect_error(owd_install("not-a-package"), "Not in the openwashdata catalog") + expect_error(owd_install(character()), "must be a character vector") +}) + +test_that("owd_install refuses pkg = NULL in a non-interactive session", { + skip_if(interactive(), "interactive session would prompt") + expect_error(owd_install(), "Name packages explicitly in scripts") +}) + +test_that("the startup message names the counts and the harvest date", { + msg <- owd_startup_message() + cat <- owd_active_catalog() + expect_match(msg, "^owdata catalog: ") + expect_match(msg, format(cat$meta$harvest_date), fixed = TRUE) + expect_match(msg, "owd_search\\(\\)") +}) diff --git a/tests/testthat/test-schema.R b/tests/testthat/test-schema.R new file mode 100644 index 0000000..65e2cc8 --- /dev/null +++ b/tests/testthat/test-schema.R @@ -0,0 +1,82 @@ +# The gate the harvest must pass. Column names and types, non-empty +# tables, and the value-level checks a schema test alone cannot make: +# NA and a mojibake string are both structurally valid (#4, #5). + +catalog <- owd_active_catalog() + +test_that("the catalog carries its five elements", { + expect_true(owd_is_catalog(catalog)) + expect_s3_class(catalog$meta$harvest_date, "Date") + expect_true(nzchar(catalog$meta$org)) + expect_true(catalog$meta$backend %in% c("local", "github")) +}) + +test_that("owd_packages has the documented columns and types", { + p <- catalog$packages + expect_named(p, c( + "pkg_name", "title", "description", "version", "published", "reviewed", + "maintainer", "maintainer_orcid", "authors", "license", "date", + "keywords", "spatial_coverage", "temporal_coverage", "doi", + "cff_version", "url_github", "url_docs", "n_datasets", + "latest_release", "default_branch", "created_at", "last_commit", + "topics", "has_dictionary", "has_extdata", + "washr_version", "brand_ref", "pkgreview_standard", + "has_r_cmd_check", "has_pkgdown_workflow", "has_jsonld" + )) + expect_gt(nrow(p), 0) + expect_type(p$pkg_name, "character") + expect_type(p$published, "logical") + expect_type(p$n_datasets, "integer") + expect_s3_class(p$date, "Date") + expect_false(any(is.na(p$pkg_name))) +}) + +test_that("owd_datasets and owd_variables have the documented columns", { + expect_named(catalog$datasets, c( + "pkg_name", "dataset_name", "title", "description", + "n_rows", "n_vars", "n_vars_dictionary", "csv_url", "xlsx_url" + )) + expect_named(catalog$variables, c( + "pkg_name", "dataset_name", "variable_name", "variable_type", "description" + )) + expect_named(catalog$index, c( + "pkg_name", "match_type", "dataset_name", "field", "text" + )) +}) + +test_that("no value carries a unicode escape", { + # The defect that put into 37 places of the first seed data: + # a harvest run outside a UTF-8 locale. + escaped <- unlist(lapply( + list(catalog$packages, catalog$datasets, catalog$variables), + function(df) { + chr <- vapply(df, is.character, logical(1)) + unlist(lapply(df[chr], function(x) x[!is.na(x) & grepl(" Date: Wed, 9 Sep 2026 10:29:22 +0200 Subject: [PATCH 3/6] ci: weekly harvest that opens a pull request (#9) Ported from workflows-pending on the closed PR #15 branch, rewritten around the pull request flow the September decisions chose. The original pushed generated data straight to main, synced the r-universe registry with an org PAT, and opened a harvest-failure issue. All three are gone: the harvest opens or updates one pull request on a fixed harvest branch and the maintainer merges it, the registry is hand-committed (#8), and a failed run is simply red in the Actions tab. The gate runs inside the job because a pull request opened with the built-in token triggers no pull_request workflows. That is also why R-CMD-check must not become a required status on main, which the header comment records. LANG is C.UTF-8 for the whole job, since the content gate fails on escapes and those appear when the harvest runs outside a UTF-8 locale. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KniirkTyC9pRpXrCA1JeF3 --- .github/workflows/harvest.yaml | 74 ++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 .github/workflows/harvest.yaml diff --git a/.github/workflows/harvest.yaml b/.github/workflows/harvest.yaml new file mode 100644 index 0000000..279aac6 --- /dev/null +++ b/.github/workflows/harvest.yaml @@ -0,0 +1,74 @@ +# Weekly catalog harvest. Regenerates the catalog from the openwashdata +# GitHub organisation, runs the schema and content gates, and opens or +# updates one pull request with the generated files. The maintainer +# merges it; the harvest never pushes to main. +# +# A pull request opened with the built-in GITHUB_TOKEN triggers no +# pull_request workflows, so the gate runs inside this job. R-CMD-check +# and pkgdown run on main after the merge, which is a normal push by a +# person. Do not make R-CMD-check a required status on main, or this +# pull request can never merge. +# +# A failed run is red in the Actions tab and opens no pull request. +# There is no failure-issue automation. + +name: harvest + +on: + schedule: + - cron: '0 3 * * 1' + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + +jobs: + harvest: + runs-on: ubuntu-latest + env: + GITHUB_PAT: ${{ secrets.GITHUB_TOKEN }} + LANG: C.UTF-8 + steps: + - uses: actions/checkout@v4 + with: + ref: main + + - uses: r-lib/actions/setup-r@v2 + with: + use-public-rspm: true + + - uses: r-lib/actions/setup-r-dependencies@v2 + with: + extra-packages: any::roxygen2, any::pkgload, any::testthat + needs: harvest + + # The gate below fails on escapes, so the locale matters. + - name: Run harvest + env: + OWD_HARVEST_BACKEND: github + run: Rscript data-raw/harvest.R + + - name: Regenerate documentation + run: Rscript -e 'roxygen2::roxygenise()' + + - name: Schema and content gate + run: Rscript -e 'testthat::test_local(stop_on_failure = TRUE)' + + - name: Open or update the harvest pull request + uses: peter-evans/create-pull-request@v6 + with: + branch: harvest + base: main + add-paths: | + R/sysdata.rda + inst/extdata + data-raw/packages.json + data-raw/harvest_report.md + man + NAMESPACE + DESCRIPTION + commit-message: "chore: weekly catalog harvest" + title: "Weekly catalog harvest" + body-path: data-raw/harvest_report.md + delete-branch: false From d1b8323c1fd51f5e3b835a2df94bd5687b488e33 Mon Sep 17 00:00:00 2001 From: larnsce Date: Wed, 9 Sep 2026 11:39:17 +0200 Subject: [PATCH 4/6] fix: the deposit decides who owns a contested DOI (#4, #8) The first full-organisation harvest stopped on a real defect: two packages claimed 10.5281/zenodo.6470427. A hard stop lets one bad CITATION.cff block the whole catalog until somebody notices, so the run now continues. The first attempt dropped the DOI from every claimant, which demoted wasteskipsblantyre, the package that had done nothing wrong, and silently removed it from the r-universe registry. Zenodo is the authority instead. owd_zenodo_owner() reads the record and returns the claimant it names; only the others lose the DOI and fall back to unpublished. The match is on alphanumeric letters, because deposits made before the organisation move name repositories such as Global-Health-Engineering/data-public-waste-skips-blantyre rather than openwashdata/wasteskipsblantyre. NA when the record cannot be read or names none or several claimants, in which case every claimant loses it. test-packages-json.R covers the registry invariants: washr and owdata are always listed, entries are unique, sorted and well formed org URLs, and no unpublished package is registered. A custom registry supersedes the auto-generated one, so a generated file that ever omitted washr would remove it from the universe with no error. The universe today lists washr alone, from that auto-generated registry. DESCRIPTION gains Config/Needs/harvest, which the harvest workflow already referenced but nothing defined, and jsonlite in Suggests for the new test. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KniirkTyC9pRpXrCA1JeF3 --- DESCRIPTION | 4 ++- data-raw/harvest.R | 38 ++++++++++++++++++++++++++-- data-raw/harvest_helpers.R | 36 ++++++++++++++++++++++++++ tests/testthat/test-packages-json.R | 39 +++++++++++++++++++++++++++++ 4 files changed, 114 insertions(+), 3 deletions(-) create mode 100644 tests/testthat/test-packages-json.R diff --git a/DESCRIPTION b/DESCRIPTION index 326f5fa..b56c376 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: owdata Title: Index of openwashdata R Data Packages -Version: 0.0.0.9001 +Version: 0.0.0.9003 Authors@R: c( person("Lars", "Schöbitz", , "lschoebitz@ethz.ch", role = c("aut", "cre"), comment = c(ORCID = "0000-0003-2196-5015")), @@ -19,6 +19,7 @@ Encoding: UTF-8 Roxygen: list(markdown = TRUE) RoxygenNote: 8.0.0 Suggests: + jsonlite, testthat (>= 3.0.0) Config/testthat/edition: 3 Imports: @@ -29,3 +30,4 @@ LazyData: true Config/Needs/website: rmarkdown, brand.yml Date: 2026-09-09 BugReports: https://github.com/openwashdata/owdata/issues +Config/Needs/harvest: desc, cffr, gh, jsonlite diff --git a/data-raw/harvest.R b/data-raw/harvest.R index eb64c85..ef447b7 100644 --- a/data-raw/harvest.R +++ b/data-raw/harvest.R @@ -342,9 +342,43 @@ if (length(escaped) > 0) { length(escaped), escaped[1] )) } -dup_doi <- packages$doi[!is.na(packages$doi) & duplicated(packages$doi)] +# A DOI claimed by two packages is an upstream defect: one CITATION.cff +# carries another dataset's record. Shipping it either way would send +# readers to the wrong deposit, so the deposit itself decides. Zenodo +# records the source repository, and the package it names keeps the DOI +# while the others lose it and fall back to unpublished. Punishing every +# claimant would demote the package that did nothing wrong, and stopping +# the run would let one bad citation file block the whole catalog until +# somebody noticed. +dup_doi <- unique(packages$doi[!is.na(packages$doi) & duplicated(packages$doi)]) +for (d in dup_doi) { + claimants <- packages$pkg_name[!is.na(packages$doi) & packages$doi == d] + owner <- owd_zenodo_owner(d, claimants) + losers <- setdiff(claimants, owner) + reason <- if (is.na(owner)) { + sprintf( + "DOI %s is claimed by %s and Zenodo names none of them; dropped from all", + d, paste(claimants, collapse = ", ") + ) + } else { + sprintf( + "DOI %s is claimed by %s; Zenodo names %s, so it is dropped from %s", + d, paste(claimants, collapse = ", "), owner, paste(losers, collapse = ", ") + ) + } + problems <- rbind(problems, data.frame( + repo = claimants, stage = "warn", reason = reason + )) + drop <- packages$pkg_name %in% losers + packages$doi[drop] <- NA_character_ + packages$published[drop] <- FALSE +} if (length(dup_doi) > 0) { - stop("DOI shared by more than one package: ", paste(unique(dup_doi), collapse = ", ")) + # Detail was harvested while the demoted packages still counted as + # published. + still <- packages$pkg_name[packages$published] + datasets <- datasets[datasets$pkg_name %in% still, , drop = FALSE] + variables <- variables[variables$pkg_name %in% still, , drop = FALSE] } dup_pkg <- packages$pkg_name[duplicated(packages$pkg_name)] if (length(dup_pkg) > 0) { diff --git a/data-raw/harvest_helpers.R b/data-raw/harvest_helpers.R index 8b10738..93b4ac8 100644 --- a/data-raw/harvest_helpers.R +++ b/data-raw/harvest_helpers.R @@ -205,3 +205,39 @@ owd_github_source <- function(repo, org = "openwashdata") { ) ) } + +# --- Zenodo ----------------------------------------------------------------- + +# Which of the claimant packages does a contested DOI actually belong to? +# +# The deposit is the authority. Its metadata names a source repository and +# a title, though not always under the package name: openwashdata deposits +# predating the org move point at Global-Health-Engineering and at hyphenated +# repository names, so the match is made on the alphanumeric letters of the +# package name against the whole record. The claimant the record names owns +# the DOI; the others carry it by mistake. Returns NA when the record cannot +# be read, or names none or several of them, in which case the caller drops +# the DOI from every claimant. +owd_zenodo_owner <- function(doi, claimants) { + id <- sub("^10\\.5281/zenodo\\.", "", doi) + if (identical(id, doi) || !nzchar(id)) { + return(NA_character_) + } + f <- owd_http_fetch(paste0("https://zenodo.org/api/records/", id), tries = 2) + if (is.null(f)) { + return(NA_character_) + } + on.exit(unlink(f)) + rec <- tryCatch(jsonlite::fromJSON(f, simplifyVector = FALSE), error = function(e) NULL) + if (is.null(rec)) { + return(NA_character_) + } + # Reduce both sides to letters and digits, so "wasteskipsblantyre" + # matches "data-public-waste-skips-blantyre". + squash <- function(x) gsub("[^a-z0-9]", "", tolower(x)) + hay <- squash(paste(unlist(rec), collapse = " ")) + named <- claimants[vapply(claimants, function(p) { + grepl(squash(p), hay, fixed = TRUE) + }, logical(1))] + if (length(named) == 1) named else NA_character_ +} diff --git a/tests/testthat/test-packages-json.R b/tests/testthat/test-packages-json.R new file mode 100644 index 0000000..77978fd --- /dev/null +++ b/tests/testthat/test-packages-json.R @@ -0,0 +1,39 @@ +# The r-universe registry draft (#8). +# +# A custom registry supersedes the auto-generated CRAN one, so the moment +# openwashdata.r-universe.dev holds a packages.json, that file is the +# whole universe. washr appears there today only because of the +# auto-generated registry, so a generated file that ever omitted it would +# silently drop washr from the universe. Hence the hard-coding, and hence +# this test. + +registry_path <- testthat::test_path("..", "..", "data-raw", "packages.json") + +test_that("the registry draft names washr and owdata", { + skip_if_not(file.exists(registry_path), "packages.json not generated yet") + registry <- jsonlite::fromJSON(registry_path, simplifyDataFrame = FALSE) + names <- vapply(registry, function(e) e$package, character(1)) + expect_true("washr" %in% names) + expect_true("owdata" %in% names) +}) + +test_that("every registry entry is a well formed org URL, listed once, sorted", { + skip_if_not(file.exists(registry_path), "packages.json not generated yet") + registry <- jsonlite::fromJSON(registry_path, simplifyDataFrame = FALSE) + names <- vapply(registry, function(e) e$package, character(1)) + urls <- vapply(registry, function(e) e$url, character(1)) + expect_equal(urls, paste0("https://github.com/openwashdata/", names)) + expect_false(any(duplicated(names))) + expect_equal(names, sort(names)) +}) + +test_that("the registry lists published packages, and no unpublished one", { + skip_if_not(file.exists(registry_path), "packages.json not generated yet") + registry <- jsonlite::fromJSON(registry_path, simplifyDataFrame = FALSE) + names <- vapply(registry, function(e) e$package, character(1)) + pkgs <- owd_active_catalog()$packages + expect_true(all(pkgs$pkg_name[pkgs$published] %in% names)) + # The two tools are in the registry without being catalog entries. + unpublished <- setdiff(names, c("washr", "owdata")) + expect_false(any(pkgs$pkg_name[!pkgs$published] %in% unpublished)) +}) From 5db5e99ce675babe41b51135664be25fced9d0be Mon Sep 17 00:00:00 2001 From: larnsce Date: Wed, 9 Sep 2026 13:39:08 +0200 Subject: [PATCH 5/6] feat: first full organisation harvest (#4, #5, #8) 64 data packages detected across 96 repositories, 0 fatal failures, 32 published, 53 datasets, 2798 variables. Version 0.1.0. This is the run that answers the count question in #12. The issues said about 70 and the July harvest of local clones found 54; a harvest that enumerates the organisation through the API finds 64. The gap to 54 was clones missing from the local checkout, not private repositories. The registry draft lists those 32 plus washr and owdata, 34 entries. Four upstream problems are recorded in the report rather than fixed here: version drift between DESCRIPTION and CITATION.cff in grdwtrsmpkwale and portawaterperu, a DESCRIPTION URL that does not name its own repository in hydrogeologicalghana, and the malformed version v1.0.0 in waterpointstatus, which the parser normalises. The duplicate DOI that stopped the first run is gone: biogasoutcomesmalawi now carries its own concept DOI and moves to published. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KniirkTyC9pRpXrCA1JeF3 --- DESCRIPTION | 2 +- R/sysdata.rda | Bin 0 -> 55092 bytes data-raw/harvest.R | 14 +- data-raw/harvest_report.md | 16 + data-raw/packages.json | 138 ++ inst/extdata/owd_datasets.csv | 54 + inst/extdata/owd_packages.csv | 65 + inst/extdata/owd_variables.csv | 2799 +++++++++++++++++++++++++++ tests/testthat/test-packages-json.R | 15 +- 9 files changed, 3092 insertions(+), 11 deletions(-) create mode 100644 R/sysdata.rda create mode 100644 data-raw/harvest_report.md create mode 100644 data-raw/packages.json create mode 100644 inst/extdata/owd_datasets.csv create mode 100644 inst/extdata/owd_packages.csv create mode 100644 inst/extdata/owd_variables.csv diff --git a/DESCRIPTION b/DESCRIPTION index b56c376..443874f 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -1,6 +1,6 @@ Package: owdata Title: Index of openwashdata R Data Packages -Version: 0.0.0.9003 +Version: 0.1.0 Authors@R: c( person("Lars", "Schöbitz", , "lschoebitz@ethz.ch", role = c("aut", "cre"), comment = c(ORCID = "0000-0003-2196-5015")), diff --git a/R/sysdata.rda b/R/sysdata.rda new file mode 100644 index 0000000000000000000000000000000000000000..8427059e61e17dc334e9702fccbaed02afce02c8 GIT binary patch literal 55092 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

bF}{e0&ti-bv7rn*ekh0E;QV2YQkRh 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 literal 0 HcmV?d00001 diff --git a/data-raw/harvest.R b/data-raw/harvest.R index ef447b7..0ec7f69 100644 --- a/data-raw/harvest.R +++ b/data-raw/harvest.R @@ -466,10 +466,16 @@ for (name in names(tables)) { ) } -# r-universe registry draft. washr and owdata are hard-coded on purpose: -# the custom registry supersedes the auto-generated CRAN registry, so a -# generated file that ever omitted washr would silently drop it from -# https://openwashdata.r-universe.dev (openwashdata/owdata#8). +# r-universe registry draft: the published data packages plus the two +# tools, hard-coded so a generated file can never omit them (#8). +# +# owdata has to be here, because it is not on CRAN and owd_install() +# points at this repository. washr is on CRAN and installable from there +# regardless; it is listed so the universe also carries a development +# build. Neither can be dropped silently: a custom registry takes +# precedence over the auto-generated one r-universe builds by scanning +# CRAN for GitHub links, so this file is the whole universe once it +# exists. registry <- unique(c(packages$pkg_name[packages$published], "washr", "owdata")) registry <- sort(registry) packages_json <- data.frame( diff --git a/data-raw/harvest_report.md b/data-raw/harvest_report.md new file mode 100644 index 0000000..5beb86d --- /dev/null +++ b/data-raw/harvest_report.md @@ -0,0 +1,16 @@ +# Harvest report + +Run: 2026-09-09T09:54:56Z (backend: github) + +Packages: 64 (32 published). Datasets: 53. Variables: 2798. + +## Deltas since previous committed run + +- published change: biogasoutcomesmalawi FALSE -> TRUE + +## Problems + +- grdwtrsmpkwale [warn]: version drift: DESCRIPTION 0.0.1 vs CITATION.cff 0.0.0.9000 +- portawaterperu [warn]: version drift: DESCRIPTION 0.0.1 vs CITATION.cff 0.0.0.9000 +- hydrogeologicalghana [warn]: DESCRIPTION URL does not mention https://github.com/openwashdata/hydrogeologicalghana +- waterpointstatus [warn]: normalized malformed version 'v1.0.0' diff --git a/data-raw/packages.json b/data-raw/packages.json new file mode 100644 index 0000000..96cabde --- /dev/null +++ b/data-raw/packages.json @@ -0,0 +1,138 @@ +[ + { + "package": "artesianwells", + "url": "https://github.com/openwashdata/artesianwells" + }, + { + "package": "biogasoutcomesmalawi", + "url": "https://github.com/openwashdata/biogasoutcomesmalawi" + }, + { + "package": "boreholeforensicspumpingtest", + "url": "https://github.com/openwashdata/boreholeforensicspumpingtest" + }, + { + "package": "boreholefuncmwi", + "url": "https://github.com/openwashdata/boreholefuncmwi" + }, + { + "package": "breathablepitlat", + "url": "https://github.com/openwashdata/breathablepitlat" + }, + { + "package": "cbssuitabilityhaiti", + "url": "https://github.com/openwashdata/cbssuitabilityhaiti" + }, + { + "package": "choleramalawi", + "url": "https://github.com/openwashdata/choleramalawi" + }, + { + "package": "ds4owdanalytics", + "url": "https://github.com/openwashdata/ds4owdanalytics" + }, + { + "package": "fecalcanuga", + "url": "https://github.com/openwashdata/fecalcanuga" + }, + { + "package": "floodchlorinationsurvey", + "url": "https://github.com/openwashdata/floodchlorinationsurvey" + }, + { + "package": "fslogisticskampala", + "url": "https://github.com/openwashdata/fslogisticskampala" + }, + { + "package": "fsmglobal", + "url": "https://github.com/openwashdata/fsmglobal" + }, + { + "package": "gdho", + "url": "https://github.com/openwashdata/gdho" + }, + { + "package": "glossarywho", + "url": "https://github.com/openwashdata/glossarywho" + }, + { + "package": "hydrogeologicalghana", + "url": "https://github.com/openwashdata/hydrogeologicalghana" + }, + { + "package": "owdata", + "url": "https://github.com/openwashdata/owdata" + }, + { + "package": "planetaryhdi", + "url": "https://github.com/openwashdata/planetaryhdi" + }, + { + "package": "ploswater", + "url": "https://github.com/openwashdata/ploswater" + }, + { + "package": "postfloodintervention", + "url": "https://github.com/openwashdata/postfloodintervention" + }, + { + "package": "rwpfunctionality", + "url": "https://github.com/openwashdata/rwpfunctionality" + }, + { + "package": "saniabidjan", + "url": "https://github.com/openwashdata/saniabidjan" + }, + { + "package": "solidwastekampala", + "url": "https://github.com/openwashdata/solidwastekampala" + }, + { + "package": "ugabore", + "url": "https://github.com/openwashdata/ugabore" + }, + { + "package": "undpcomposite", + "url": "https://github.com/openwashdata/undpcomposite" + }, + { + "package": "unhcrwash", + "url": "https://github.com/openwashdata/unhcrwash" + }, + { + "package": "waschoolpiracema", + "url": "https://github.com/openwashdata/waschoolpiracema" + }, + { + "package": "washinvestments", + "url": "https://github.com/openwashdata/washinvestments" + }, + { + "package": "washmalawi", + "url": "https://github.com/openwashdata/washmalawi" + }, + { + "package": "washopenresearch", + "url": "https://github.com/openwashdata/washopenresearch" + }, + { + "package": "washr", + "url": "https://github.com/openwashdata/washr" + }, + { + "package": "wasteskipsblantyre", + "url": "https://github.com/openwashdata/wasteskipsblantyre" + }, + { + "package": "watercostaccra", + "url": "https://github.com/openwashdata/watercostaccra" + }, + { + "package": "waterpumpkwale", + "url": "https://github.com/openwashdata/waterpumpkwale" + }, + { + "package": "worldhdi", + "url": "https://github.com/openwashdata/worldhdi" + } +] diff --git a/inst/extdata/owd_datasets.csv b/inst/extdata/owd_datasets.csv new file mode 100644 index 0000000..3a42a7b --- /dev/null +++ b/inst/extdata/owd_datasets.csv @@ -0,0 +1,54 @@ +"pkg_name","dataset_name","title","description","n_rows","n_vars","n_vars_dictionary","csv_url","xlsx_url" +"artesianwells","artesianwells","artesianwells: Artesian Well Site Assessment Data","A dataset capturing geospatial, structural, usage, and management characteristics of artesian well sites",44,29,29,"https://raw.githubusercontent.com/openwashdata/artesianwells/main/inst/extdata/artesianwells.csv","https://raw.githubusercontent.com/openwashdata/artesianwells/main/inst/extdata/artesianwells.xlsx" +"biogasoutcomesmalawi","biogasoutcomesmalawi","Qualitative interviews about the outcomes of biogas reactors in Malawi","This dataset consists of 61 semi-structured interviews with biogas owners in the Southern Region of Malawi. Interviews were conducted over multiple visits to sites over the course of a two-year period between June 2021 and October 2022.",259,5,5,"https://raw.githubusercontent.com/openwashdata/biogasoutcomesmalawi/main/inst/extdata/biogasoutcomesmalawi.csv","https://raw.githubusercontent.com/openwashdata/biogasoutcomesmalawi/main/inst/extdata/biogasoutcomesmalawi.xlsx" +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","boreholeforensicspumpingtest: Borehole Forensics 4 - Pumping Test","This dataset contains borehole forensic pumping test data, capturing key parameters related to groundwater extraction, borehole performance, and water quality assessments. It includes information on the test conditions, water levels, pumping rates, flow measurement methods, and water quality indicators such as pH, turbidity, and electrical conductivity. The dataset also documents permissions granted for testing, equipment used, and observations on borehole performance, such as whether the water level stabilized during pumping and whether the borehole passed the test.",445,38,44,"https://raw.githubusercontent.com/openwashdata/boreholeforensicspumpingtest/main/inst/extdata/boreholeforensicspumpingtest.csv","https://raw.githubusercontent.com/openwashdata/boreholeforensicspumpingtest/main/inst/extdata/boreholeforensicspumpingtest.xlsx" +"boreholefuncmwi","boreholefuncmwi","boreholefuncmwi: Analysis of boreholes' functionality in Northern Malawi","The data is obtained from a survey conducted in Wasambo in Karonga district (Northen Malawi). This data is about boreholes and handpumps that people mostly rely on for drinking water, secondary to wells and rivers. The data were collected in June 2013.",108,17,17,"https://raw.githubusercontent.com/openwashdata/boreholefuncmwi/main/inst/extdata/boreholefuncmwi.csv","https://raw.githubusercontent.com/openwashdata/boreholefuncmwi/main/inst/extdata/boreholefuncmwi.xlsx" +"breathablepitlat","breathablepitlat",,,6,8,8,"https://raw.githubusercontent.com/openwashdata/breathablepitlat/main/inst/extdata/breathablepitlat.csv","https://raw.githubusercontent.com/openwashdata/breathablepitlat/main/inst/extdata/breathablepitlat.xlsx" +"cbssuitabilityhaiti","mwater","Location of different water points in Cap Haitien, Haiti","This data includes water point data from the mWater platform. Water points are for the city Cap Haitien, Haiti in 2022. The data collection and characterization was done between 2016 and 2022.",1849,7,7,"https://raw.githubusercontent.com/openwashdata/cbssuitabilityhaiti/main/inst/extdata/mwater.csv","https://raw.githubusercontent.com/openwashdata/cbssuitabilityhaiti/main/inst/extdata/mwater.xlsx" +"cbssuitabilityhaiti","okap","Sanitation zoning assessment data","This data includes data from a sanitation zoning report done for the city of Cap Haitien, Haiti in 2022. Additionally, it contains spatial data about the neighborhoods of 5 different Haitien cities.",198,21,13,"https://raw.githubusercontent.com/openwashdata/cbssuitabilityhaiti/main/inst/extdata/okap.csv","https://raw.githubusercontent.com/openwashdata/cbssuitabilityhaiti/main/inst/extdata/okap.xlsx" +"choleramalawi","choleramalawi","Title: Cholera Epidemic in Malawi","Description: Course of the cholera epidemic in Malawi. The data is resolved at a weekly level and contains information on the number of cases and deaths recorded in each district.",1886,8,8,"https://raw.githubusercontent.com/openwashdata/choleramalawi/main/inst/extdata/choleramalawi.csv","https://raw.githubusercontent.com/openwashdata/choleramalawi/main/inst/extdata/choleramalawi.xlsx" +"ds4owdanalytics","course_participation","course_participation: Participation in the Course","Sessions attended and participated in, for the course (anonymized)",734,5,5,"https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/course_participation.csv","https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/course_participation.xlsx" +"ds4owdanalytics","ds4owd_browser","ds4owd_browser: Data on visits to the DS4OWD website by browser","This dataset contains information on visits to the DS4OWD website by browser used.",17,6,6,"https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/ds4owd_browser.csv","https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/ds4owd_browser.xlsx" +"ds4owdanalytics","ds4owd_country","ds4owd_country: Data on visits to the DS4OWD website by country","Visits to the DS4OWD website by country",88,6,6,"https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/ds4owd_country.csv","https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/ds4owd_country.xlsx" +"ds4owdanalytics","ds4owd_source","ds4owd_source: Data on source of website visits","Data on source of website visits",27,6,6,"https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/ds4owd_source.csv","https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/ds4owd_source.xlsx" +"ds4owdanalytics","ds4owd_timeseries","ds4owd_timeseries: Timeseries data on website traffic","Timeseries data on website traffic to the DS4OWD website",468,6,6,"https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/ds4owd_timeseries.csv","https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/ds4owd_timeseries.xlsx" +"ds4owdanalytics","locations","locations: Location of the course participants","Location by country (and city) of the course participants. This is anonymized",212,3,3,"https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/locations.csv","https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/locations.xlsx" +"ds4owdanalytics","postsurvey","postsurvey: Postsurvey responses","Data from the postsurvey responses of the course participants in DS4OWD",25,18,18,"https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/postsurvey.csv","https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/postsurvey.xlsx" +"ds4owdanalytics","presurvey","presurvey: Responses from the pre-course survey","Data from the pre-course survey, including previous programming experience, ease of programming, data format, current level of LLM usage, organisation type, and barriers to learning.",212,15,15,"https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/presurvey.csv","https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/presurvey.xlsx" +"ds4owdanalytics","publishing_metadata","publishing_metadata: Publishing Metadata","Metadata on packages published directly as a result of DS4OWD.",34,14,14,"https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/publishing_metadata.csv","https://raw.githubusercontent.com/openwashdata/ds4owdanalytics/main/inst/extdata/publishing_metadata.xlsx" +"fecalcanuga","containment","containment: Technical Data for each Non-Sewered Sanitation Containment","This data set contains the technical data (containment size, volume, fecal sludge depth, etc.) for each non-sewered sanitation system containment that was sampled as a part of this field work.",41,10,10,"https://raw.githubusercontent.com/openwashdata/fecalcanuga/main/inst/extdata/containment.csv", +"fecalcanuga","ghg","ghg: Greenhouse Gas Mass Flux Rates for each Non-Sewered Sanitation Containment","This data set contains the calculated mass flux rates from the measured point-source in situ GHG measurments and the observed person equivalents for each containment for the three key greenhouse gases (CH4, CO2 and N2O).",41,7,,"https://raw.githubusercontent.com/openwashdata/fecalcanuga/main/inst/extdata/ghg.csv", +"fecalcanuga","household_survey","household_survey: Demographic, Environmental and Technical Household / Institutional Data for each Non-Sewered Sanitation Containment","This data set contains the collected household / institutional survey data for each location where a non-sewered sanitation containment was sampled. This includes demographic information, operational and maintenance information and some technical and environmental parameters.",41,39,39,"https://raw.githubusercontent.com/openwashdata/fecalcanuga/main/inst/extdata/household_survey.csv", +"fecalcanuga","phys_chem_parameter","phys_chem_parameter: Physio-Chemical Parameter Data for each Non-sewered Sanitation Containment","This data set contains the measured in situ and analyzed in laboratory physical, chemical and biological parameters pertaining to each containment sampled as well as at different vertical locations in each containment (i.e., Top of containment, middle and bottom).",119,29,29,"https://raw.githubusercontent.com/openwashdata/fecalcanuga/main/inst/extdata/phys_chem_parameter.csv", +"floodchlorinationsurvey","floodchlorinationsurvey","USAID Flood Response Rehabilitation and Chlorination Survey","This dataset is from the USAID Flood Response Rehabilitation and Chlorination Survey, conducted between 2019 - 2020, to assess and rehabilitate flood-affected boreholes in Malawi. Using the mWater, data collectors captured detailed information on the condition of handpumps, their components, water safety risks, and the impact of chlorination and repairs. The survey was part of an emergency response initiative to restore access to safe drinking water following flood events.",328,118,118,"https://raw.githubusercontent.com/openwashdata/floodchlorinationsurvey/master/inst/extdata/floodchlorinationsurvey.csv","https://raw.githubusercontent.com/openwashdata/floodchlorinationsurvey/master/inst/extdata/floodchlorinationsurvey.xlsx" +"fslogisticskampala","trips","trips: Trips of faecal sludge trucks","This dataset contains the GPS locations of faecal sludge trucks collecting sludge from pit latrines and septic tanks in Kampala, Uganda. Each trip is recorded with a unique identifier, the numberplate of the truck, the date and time of the record. Data was collected from 30th March 2015 until 25th June 2015.",5653,7,7,"https://raw.githubusercontent.com/openwashdata/fslogisticskampala/main/inst/extdata/trips.csv","https://raw.githubusercontent.com/openwashdata/fslogisticskampala/main/inst/extdata/trips.xlsx" +"fslogisticskampala","trucks","trucks: Faecal sludge emptying trucks","Additional information on the volume of each truck used in the dataset `trips`.",33,2,2,"https://raw.githubusercontent.com/openwashdata/fslogisticskampala/main/inst/extdata/trucks.csv","https://raw.githubusercontent.com/openwashdata/fslogisticskampala/main/inst/extdata/trucks.xlsx" +"fsmglobal","fsmglobal","fsmglobal","Populations of 175 countries requiring faecal sludge emptying services.",700,9,9,"https://raw.githubusercontent.com/openwashdata/fsmglobal/main/inst/extdata/fsmglobal.csv","https://raw.githubusercontent.com/openwashdata/fsmglobal/main/inst/extdata/fsmglobal.xlsx" +"gdho","gdho","Global Database of Humanitarian Organization (short version)","This dataset collected by Humanitarian Outcomes provides insights about humanitarian organizations, such as name, website, headquarter information, and etc. This short version excludes the information about how many operational units a humanitarian organization has in each country, where you can find it in data gdho_full.",4548,35,35,"https://raw.githubusercontent.com/openwashdata/gdho/main/inst/extdata/gdho.csv","https://raw.githubusercontent.com/openwashdata/gdho/main/inst/extdata/gdho.xlsx" +"gdho","gdho_full","Global Database of Humanitarian Organization (full version)","This dataset collected by Humanitarian Outcomes provides insights about humanitarian organizations, such as name, website, headquarter information, and etc. This full version includes the information about how many operational units a humanitarian organization has in each country, which is represented as one column per country resulting in 275 variables compared with the short version ""gdho"" (35 variables).",4548,275,275,"https://raw.githubusercontent.com/openwashdata/gdho/main/inst/extdata/gdho_full.csv","https://raw.githubusercontent.com/openwashdata/gdho/main/inst/extdata/gdho_full.xlsx" +"glossarywho","definitions","definitions: Definitions of terms in the WHO Glossary (https://www.who.int/publications/i/item/9789240105485)","This datasets contains all terms and their definitions as defined in the WHO Glossary.",207,2,2,"https://raw.githubusercontent.com/openwashdata/glossarywho/main/inst/extdata/definitions.csv","https://raw.githubusercontent.com/openwashdata/glossarywho/main/inst/extdata/definitions.xlsx" +"glossarywho","themes","themes: Table of Thematic Areas from https://www.who.int/publications/i/item/9789240105485","A table that assigns thematic areas to definitions included in the WHO Glossary (https://www.who.int/publications/i/item/9789240105485)",217,2,2,"https://raw.githubusercontent.com/openwashdata/glossarywho/main/inst/extdata/themes.csv","https://raw.githubusercontent.com/openwashdata/glossarywho/main/inst/extdata/themes.xlsx" +"hydrogeologicalghana","hydrogeologicalghana","hydrogeologicalghana: Hydrogeological dynamics in the greater Accra and Ashanti regions of Ghana","This dataset contains measurements of pumping tests that were systematically conducted at each borehole to assess crucial hydrogeological parameters, specifically focusing on pumping rates and drawdown.",12,10,10,"https://raw.githubusercontent.com/openwashdata/hydrogeologicalghana/main/inst/extdata/hydrogeologicalghana.csv","https://raw.githubusercontent.com/openwashdata/hydrogeologicalghana/main/inst/extdata/hydrogeologicalghana.xlsx" +"planetaryhdi","planetaryhdi","planetaryhdi: Planetary Pressures Adjusted HDI Index for all countries","Planetary Pressures adjusted HDI Index for all countries. PHDI is HDI adjusted for production-based carbon dioxide emissions and material footprint per capita. The dataset also includes information on percentage difference in HDI after adjusting for planetary pressures and change in rank when the HDI is corrected for these pressures.",210,11,12,"https://raw.githubusercontent.com/openwashdata/planetaryhdi/main/inst/extdata/planetaryhdi.csv","https://raw.githubusercontent.com/openwashdata/planetaryhdi/main/inst/extdata/planetaryhdi.xlsx" +"ploswater","ploswater","ploswater: A dataset of papers from PLOS Water journal","This dataset includes data on papers published in the PLOS Water journal. All raw data is obtained using the OpenAlex API. The data includes details on the publication, references, authorship, and institutions.",240,1506,1506,"https://raw.githubusercontent.com/openwashdata/ploswater/main/inst/extdata/ploswater.csv","https://raw.githubusercontent.com/openwashdata/ploswater/main/inst/extdata/ploswater.xlsx" +"postfloodintervention","postfloodintervention","USAID Flood Response - Post Intervention Survey 2019-2020","This dataset represents the USAID Flood Response Post Intervention Survey conducted in Mulanje during 2019-2020 using the mWater platform. It contains comprehensive water quality assessments and operational data from various water points affected by flooding.",308,30,30,"https://raw.githubusercontent.com/openwashdata/postfloodintervention/master/inst/extdata/postfloodintervention.csv","https://raw.githubusercontent.com/openwashdata/postfloodintervention/master/inst/extdata/postfloodintervention.xlsx" +"rwpfunctionality","rwpfunctionality","Water point functionality assessment in nine sub-Saharan Africa and South","Asia countries Water point monitoring data associated with the paper ""[Rural water point functionality estimates and associations: evidence from nine countries in sub-Saharan Africa and South Asia](https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023WR034679)"" (Murray, Anna L et al., 2024).",1793,52,51,"https://raw.githubusercontent.com/openwashdata/rwpfunctionality/main/inst/extdata/rwpfunctionality.csv","https://raw.githubusercontent.com/openwashdata/rwpfunctionality/main/inst/extdata/rwpfunctionality.xlsx" +"saniabidjan","saniabidjan","saniabidjan: Data About Behavior and Practices of Managing Sanitation Facilties in Abidjan, Cote d’Ivoire","Household survey data collected from Yopougon and Abobo in Abidjan, Cote d'Ivoire. The survey is about practices related to the management of sanitation facilities, specifically, latrines and tanks.",207,25,25,"https://raw.githubusercontent.com/openwashdata/saniabidjan/main/inst/extdata/saniabidjan.csv","https://raw.githubusercontent.com/openwashdata/saniabidjan/main/inst/extdata/saniabidjan.xlsx" +"solidwastekampala","solidwastekampala","solidwastekampala: Quantity and Composition of Domestic Solid Waste in Kampala City","Household-level results of a seven-day domestic solid waste characterisation in three parishes of Kampala City, Uganda (Bwaise I = low income, Bukoto I = middle income, Ggaba = high income). For each of the 103 analyzed households the data record socio-economic characteristics, the measured mass of ten waste categories, and the derived per-household metrics (total, per-day, per-capita, volume, and density).",103,37,37,"https://raw.githubusercontent.com/openwashdata/solidwastekampala/main/inst/extdata/solidwastekampala.csv","https://raw.githubusercontent.com/openwashdata/solidwastekampala/main/inst/extdata/solidwastekampala.xlsx" +"ugabore","ugabore","Borehole repair data from central Uganda","Data set about borehole repair records from the borehole operation and maintenance company operating in central Uganda. Population data is picked as an interview from a representative of the Local Water User Committees (LWUCs). The data on the technical specifications about the borehole is picked from the borehole records file from the company.",173,10,10,"https://raw.githubusercontent.com/openwashdata/ugabore/main/inst/extdata/ugabore.csv","https://raw.githubusercontent.com/openwashdata/ugabore/main/inst/extdata/ugabore.xlsx" +"undpcomposite","undpcomposite","undpcomposite: Composite data from UNDP","Composite Data from UNDP on all indices in the form of a timeseries.",6798,45,45,"https://raw.githubusercontent.com/openwashdata/undpcomposite/main/inst/extdata/undpcomposite.csv","https://raw.githubusercontent.com/openwashdata/undpcomposite/main/inst/extdata/undpcomposite.xlsx" +"unhcrwash","unhcrwash","unhcrwash: Refugee Camp WASH indicators data from the United Nations High Commissioner for Refugees","This is a dataset on WASH indicators in refugee camps and settlements. The data was collected from the UNHCR Information Management System (IRIS) and was available on the UNHCR WASH dashboard. This dataset includes data from 227 sites and 36 countries. The source dashboard has since been retired, so this dataset is a fixed historical snapshot (2013 to 2024) that can no longer be regenerated. See the package README for details.",6425,27,27,"https://raw.githubusercontent.com/openwashdata/unhcrwash/main/inst/extdata/unhcrwash.csv","https://raw.githubusercontent.com/openwashdata/unhcrwash/main/inst/extdata/unhcrwash.xlsx" +"waschoolpiracema","waschoolpiracema","waschoolpiracema: Brazilian National School Census","Since 2014 INEP (Instituto National de Estudos e Pesquisas Educacionais Anísio Teixeira), the Brazilian government entity responsible for the surveillance of schools, has been collecting and releasing information on an annual basis on the infrastructure of all basic education institutions in the country, regardless of the level of education, locality (rural vs urban) and management model (private or public) (INEP, 2021). Every year, the school's principals, headteachers, or the person in charge must reply to a self-reported survey sent by the INEP. The questionnaire contains 62 questions and should be filled out between June and August, considering the last Wednesday of May as the reference date for data collection (INEP, 2021). The final results are released at the end of January and the beginning of February from the following year. For the year 2020, due to the extraordinary situation of the COVID-19 pandemic, the reference date for collecting the data was postponed to March 11 2020, one day before the national closure of schools was established. Hence, the 2020 BNSC dataset describes the state of schools' infrastructure in Brazil right before they were closed. For 2021 and 2022, the reference date for data collection returned to the original standard (last Wednesday of May of 2021 and 2022). Thus, the 2021 BNSC, which were released on February 18 2022 reflect the impacts of the pandemic and the school closure on the state of schools' infrastructure in Brazil, while the 2022 BNSC released on and February 08 2023 indicates the situation of schools at the end of the pandemic. We adopted the word ""pre"" to designate the state of schools before the beginning of the pandemic  (2020 BNSC), ""peri"" to refer to the state of schools during the pandemic (2021 BNSC) and ""post"" to indicate the conditions of schools moving forward from the COVID-19 pandemic (at the end of the pandemic).",21,36,36,"https://raw.githubusercontent.com/openwashdata/waschoolpiracema/main/inst/extdata/waschoolpiracema.csv","https://raw.githubusercontent.com/openwashdata/waschoolpiracema/main/inst/extdata/waschoolpiracema.xlsx" +"washinvestments","washinvestments","Multilateral development banks investment behaviour in water and","sanitation Data set on multilateral development bank (MDB) investment in water supply and sanitation between 1960 and 2020 compiled by drawing on on 3,639 water and sanitation projects to assess territorial trends, technology choices, distribution of financial burdens, and reforms to institutional arrangements.",1873,52,40,"https://raw.githubusercontent.com/openwashdata/washinvestments/main/inst/extdata/washinvestments.csv", +"washmalawi","washmalawi","SDG Household Level Survey - Malawi (2018 - 2023)","This dataset comprises household-level survey data collected across Malawi between 2018 and 2023 as part of a Sustainable Development Goals (SDG) monitoring initiative. The data captures detailed information on household water access, sanitation facilities, hygiene practices, and environmental conditions. It includes geolocation data (latitude, longitude, altitude), survey timestamps, and various indicators such as the availability of handwashing facilities, type of toilet used, and waste treatment methods. This dataset is instrumental for assessing progress in WASH (Water, Sanitation, and Hygiene) outcomes and guiding evidence-based interventions in underserved communities.",23112,27,26,"https://raw.githubusercontent.com/openwashdata/washmalawi/main/inst/extdata/washmalawi.csv","https://raw.githubusercontent.com/openwashdata/washmalawi/main/inst/extdata/washmalawi.xlsx" +"washopenresearch","datapapers","Dataset about WASH data papers published in dedicated data journals","Candidate WASH-related data papers harvested from Crossref and Europe PMC for seven data journals (Scientific Data, Data in Brief, Gates Open Research, F1000Research, GigaScience, GigaByte, and Data), screened for relevance with a committed decision sheet. Data papers describe a shared dataset, so the repository link takes the role that the data availability statement variables play in `washdev` and `uncnewsletter`.",,,18,"https://raw.githubusercontent.com/openwashdata/washopenresearch/main/inst/extdata/datapapers.csv","https://raw.githubusercontent.com/openwashdata/washopenresearch/main/inst/extdata/datapapers.xlsx" +"washopenresearch","ploswater","Dataset about data availability in PLOS Water","Article metadata for all articles published in PLOS Water since its first volume (2022), collected through the public PLOS search API and each article's JATS XML. Data availability statements are mandatory at PLOS, so `has_das` is TRUE for research articles throughout; the interesting variation lies in `das_type`, `das_repo_url`, and `das_repo_name`. All article types are included; use `article_type` to restrict to research articles.",,,32,"https://raw.githubusercontent.com/openwashdata/washopenresearch/main/inst/extdata/ploswater.csv","https://raw.githubusercontent.com/openwashdata/washopenresearch/main/inst/extdata/ploswater.xlsx" +"washopenresearch","uncnewsletter","Dataset about data availability in the UNC Water Newsletter",,,,28,"https://raw.githubusercontent.com/openwashdata/washopenresearch/main/inst/extdata/uncnewsletter.csv","https://raw.githubusercontent.com/openwashdata/washopenresearch/main/inst/extdata/uncnewsletter.xlsx" +"washopenresearch","washdev","Dataset about data availability in the Journal of Water, Sanitation and Hygiene for Development",,,,29,"https://raw.githubusercontent.com/openwashdata/washopenresearch/main/inst/extdata/washdev.csv","https://raw.githubusercontent.com/openwashdata/washopenresearch/main/inst/extdata/washdev.xlsx" +"wasteskipsblantyre","wasteskipsblantyre","Location of waste skips in Blantyre, Malawi","This data set includes spatial data about the location of waste skips in the city of Blantyre, Malawi. The data was collected in 2021.",53,4,4,"https://raw.githubusercontent.com/openwashdata/wasteskipsblantyre/main/inst/extdata/wasteskipsblantyre.csv","https://raw.githubusercontent.com/openwashdata/wasteskipsblantyre/main/inst/extdata/wasteskipsblantyre.xlsx" +"watercostaccra","households","households: Household survey data","A survey of 116 households was conducted in two low-income communities in metropolitan Accra. These are Korle Gonno, a larger, well-planned coastal area with over 35 household water vendors, and Abuja, a small, densely packed, extralegal settlement with 15 water vendor and bathhouse businesses.",116,39,39,"https://raw.githubusercontent.com/openwashdata/watercostaccra/main/inst/extdata/households.csv","https://raw.githubusercontent.com/openwashdata/watercostaccra/main/inst/extdata/households.xlsx" +"watercostaccra","waterpoints","waterpoints: Water point survey data","A water point survey was conducted in two low-income communities in metropolitan Accra. These are Korle Gonno, a larger, well-planned coastal area with over 35 household water vendors, and Abuja, a small, densely packed, extralegal settlement with 15 water vendor and bathhouse businesses.",49,28,28,"https://raw.githubusercontent.com/openwashdata/watercostaccra/main/inst/extdata/waterpoints.csv","https://raw.githubusercontent.com/openwashdata/watercostaccra/main/inst/extdata/waterpoints.xlsx" +"waterpumpkwale","location","Location information of the water pumps",,299,6,6,"https://raw.githubusercontent.com/openwashdata/waterpumpkwale/main/inst/extdata/location.csv","https://raw.githubusercontent.com/openwashdata/waterpumpkwale/main/inst/extdata/location.xlsx" +"waterpumpkwale","weeklyvol2014","Weekly volume in year 2014",,324,53,2,"https://raw.githubusercontent.com/openwashdata/waterpumpkwale/main/inst/extdata/weeklyvol2014.csv","https://raw.githubusercontent.com/openwashdata/waterpumpkwale/main/inst/extdata/weeklyvol2014.xlsx" +"waterpumpkwale","weeklyvol2015","Weekly volume in year 2015",,297,53,2,"https://raw.githubusercontent.com/openwashdata/waterpumpkwale/main/inst/extdata/weeklyvol2015.csv","https://raw.githubusercontent.com/openwashdata/waterpumpkwale/main/inst/extdata/weeklyvol2015.xlsx" +"worldhdi","worldhdi","worldhdi: Human Development Index 1990-2022","Trends in Human Development Index worldwide by country from 1990-2022. Data is initially measured at a frequency of once every 10 years, then 5 years and then yearly from 2019 onwards.",195,17,17,"https://raw.githubusercontent.com/openwashdata/worldhdi/main/inst/extdata/worldhdi.csv","https://raw.githubusercontent.com/openwashdata/worldhdi/main/inst/extdata/worldhdi.xlsx" diff --git a/inst/extdata/owd_packages.csv b/inst/extdata/owd_packages.csv new file mode 100644 index 0000000..f9ce164 --- /dev/null +++ b/inst/extdata/owd_packages.csv @@ -0,0 +1,65 @@ +"pkg_name","title","description","version","published","reviewed","maintainer","maintainer_orcid","authors","license","date","keywords","spatial_coverage","temporal_coverage","doi","cff_version","url_github","url_docs","n_datasets","latest_release","default_branch","created_at","last_commit","topics","has_dictionary","has_extdata","washr_version","brand_ref","pkgreview_standard","has_r_cmd_check","has_pkgdown_workflow","has_jsonld" +"artesianwells","Artesian Well Site Assessment Data","A dataset capturing geospatial, structural, usage, and management characteristics of artesian well sites.","0.1.0",TRUE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2025-06-02,,,,"10.5281/zenodo.15824828","0.1.0","https://github.com/openwashdata/artesianwells","https://openwashdata.github.io/artesianwells/",1,"v0.1.0","main",2025-06-02,2026-07-08,,TRUE,TRUE,,,,TRUE,FALSE,FALSE +"basisghana","Basic Sanitation Information System - BaSIS","This package compiles sanitation data from established Open Defecation Free (ODF) communities across different regions in Ghana.","0.0.0.9000",FALSE,,"Lars Schöbitz","0000-0003-2196-5015","Lars Schöbitz; Sophia Skorik","CC BY 4.0",2023-12-04,"defecation, ghana, open-data, openwashdata, r, sanitation, wash",,,,"0.0.0.9000","https://github.com/openwashdata/basisghana","https://openwashdata.github.io/basisghana/",2,"v0.0.1","main",2023-08-09,2024-01-15,"defecation, ghana, open-data, openwashdata, r, sanitation, wash",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"biogasoutcomesmalawi","Data for 61 semi-structured interviews with biogas owners in Malawi","This dataset consists of 61 semi-structured interviews with biogas owners in the Southern Region of Malawi. Interviews were conducted over multiple visits to sites over the course of a two-year period between June 2021 and October 2022.","0.0.1",TRUE,,"Lars Schöbitz","0000-0003-2196-5015","Lars Schöbitz; Sebastian Camilo Loos; Marc Kalina; Jonathan Olal Ogwang; Jonathan Kwangulero; Elizabeth Tilley","CC BY 4.0",2023-08-23,"biogas, interview-data, malawi, opendata, openwashdata, r",,,"10.5281/zenodo.8289620","0.0.1","https://github.com/openwashdata/biogasoutcomesmalawi","https://openwashdata.github.io/biogasoutcomesmalawi/",1,"v0.0.1","main",2023-07-26,2026-09-09,"biogas, interview-data, malawi, opendata, openwashdata, r",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"boreholeforensicspumpingtest","Borehole Forensics 4 - Pumping Test Data 2018-2024","This dataset contains borehole forensic pumping test data, capturing key parameters related to groundwater extraction, borehole performance, and water quality assessments. It includes information on the test conditions, water levels, pumping rates, flow measurement methods, and water quality indicators such as pH, turbidity, and electrical conductivity. The dataset also documents permissions granted for testing, equipment used, and observations on borehole performance.","0.1.0",TRUE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango; Finlay Paterson; Paul Kumpukwe","CC BY 4.0",2025-03-05,,,,"10.5281/zenodo.15800110","0.1.0","https://github.com/openwashdata/boreholeforensicspumpingtest","https://openwashdata.github.io/boreholeforensicspumpingtest/",1,"v0.1.0","main",2025-03-05,2025-07-03,,TRUE,TRUE,,,,FALSE,FALSE,FALSE +"boreholefuncmwi","Analysis of boreholes' functionality in Northern Malawi","The data is obtained from a survey conducted in Wasambo in Karonga district (Northen Malawi). This data is about boreholes and handpumps that people mostly rely on for drinking water, secondary to wells and rivers. The data were collected in June 2023.","0.0.1",TRUE,,"Mabvuto Yesaya","0000-0003-3234-9699","Mabvuto Yesaya; Juliette Preisig; Hastings Kayira; Mian Zhong","CC BY 4.0",2024-06-27,"borehole, malawi, opendata, openwashdata, r, survey-data",,,"10.5281/zenodo.12635354","0.0.1","https://github.com/openwashdata/boreholefuncmwi","https://openwashdata.github.io/boreholefuncmwi/",1,"v0.0.1","main",2024-06-21,2024-07-03,"borehole, malawi, opendata, openwashdata, r, survey-data",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"boreholelabdata","Water Quality Laboratory Analysis and Reporting Dataset – Malawi (2017–2019)","This dataset contains comprehensive records of water quality test results collected from various water points across Malawi between 2017 and 2019","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango; Finlay Paterson; Jamie Rattray","CC BY 4.0",2025-08-06,"boreholes, wash, water-quality",,,,,"https://github.com/openwashdata/boreholelabdata","https://openwashdata.github.io/boreholelabdata/",1,"v1.0.0","master",2025-08-06,2025-12-15,"boreholes, wash, water-quality",TRUE,TRUE,,,,FALSE,FALSE,FALSE +"breathablepitlat","Dataset about experiments of field application of breathable laminate-lined pit latrines","This dataset assists with a research study aims at capturing the pathogens and contaminants from pit latrines by lining them with a hydrophobic laminate. The data are collected to demonstrate the transport of contaminants from two pour flush, twin-pit latrines in which one pit is lined and one is unlined.","0.0.0.9000",TRUE,,"Mian Zhong","0009-0009-4546-7214","Mian Zhong; Shray Saxena","CC BY 4.0",2024-06-21,,,,"10.5281/zenodo.13960699","0.0.0.9000","https://github.com/openwashdata/breathablepitlat","https://openwashdata.github.io/breathablepitlat/",1,"v1.0","main",2024-06-21,2024-10-23,,TRUE,TRUE,,,,FALSE,FALSE,FALSE +"cbssuitabilityhaiti","Data for a sanitation zoning assessment done for Cap Haitien, Haiti","This package contains data for a sanitation zoning assessment done for the city of Cap Haitien, Haiti. It combines two datasets used for an analysis of the suitability of container-based sanitation (CBS).","0.0.1",TRUE,,"Sebastian Camilo Loos","0000-0003-2196-5015","Sebastian Camilo Loos; Sasha Kramer; Maya Lubeck-Schricker","CC BY 4.0",,"central-america, container-based-sanitation, haiti, open-data, open-datasets, r, sanitation, suitability-analysis, wash",,,"10.5281/zenodo.8361085","0.0.1","https://github.com/openwashdata/cbssuitabilityhaiti","https://openwashdata.github.io/cbssuitabilityhaiti/",2,"v0.0.1","main",2023-04-06,2023-10-03,"central-america, container-based-sanitation, haiti, open-data, open-datasets, r, sanitation, suitability-analysis, wash",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"chckapmalawi","Knowledge, Attitudes and Practices (KAP) Survey about Community Health Centers (CHC) in Malawi","This dataset captures insights from a Knowledge, Attitudes, and Practices (KAP) Survey conducted by BASEflow for Waste Advisers in Malawi, focusing on Community Health Centers (CHCs). It covers diverse aspects including household demographics, CHC membership, water sources, sanitation, nutrition knowledge, hygiene practices, and environmental conditions.","0.0.0.9000",FALSE,,"Sophia Skorik","0009-0001-4755-1649","Sophia Skorik; Lars Schöbitz; Rhodrick Sagawa; Paul Kumpukwe; Veronica Chinangwa; Baleke Banda; Rodney Kananji; Feston Bwanyula; Gloria Maliana; Given Ngwira","CC BY 4.0",2023-10-25,,,,,"0.0.0.9000","https://github.com/openwashdata/chckapmalawi","https://openwashdata.github.io/chckapmalawi/",1,"v0.0.1","main",2023-10-25,2024-01-15,,TRUE,TRUE,,,,TRUE,FALSE,FALSE +"choleramalawi","Tracks the progress of Cholera epidemic in Malawi (2022-23)","A dataset that tracks the progress of the cholera epidemic in each district of Malawi in 2022-23.","0.1.0",TRUE,,"Yash Dubey",,"Yash Dubey","CC BY 4.0",,,,,"10.5281/zenodo.13920530","0.1.0","https://github.com/openwashdata/choleramalawi","https://openwashdata.github.io/choleramalawi/",1,"v1.0","main",2024-10-04,2024-10-16,,TRUE,TRUE,,,,FALSE,FALSE,FALSE +"cleanteamghana","Clean Team Ghana","This package compiles user experience data for the Clean Team Ghana container-based sanitation service in Kumasi, Ghana.","0.0.0.9000",FALSE,,"Sophia Skorik","0009-0001-4755-1649","Sophia Skorik; James Benjamin Tidwell; Kwabena Biritwum Nyarko; Ian Ross; Bismark Dwumfour-Asare; Scott Pippa","CC BY 4.0",2023-10-25,"container-based-sanitation, ghana, open-data, openwashdata, r, sanitation",,,,"0.0.0.9000","https://github.com/openwashdata/cleanteamghana","https://openwashdata.github.io/cleanteamghana/",1,"v0.0.1","main",2023-10-25,2024-01-15,"container-based-sanitation, ghana, open-data, openwashdata, r, sanitation",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"climatevulnerabilitykhm","Climate Vulnerability Data in Rural Cambodia","Data on Effects of Climate Vulnerability on Sanitation Access, Sanitation Infrastructure Functionality and Households’ Fecal Sludge Management Practices in Rural Cambodia.","0.0.0.9000",FALSE,,"Mian Zhong","0009-0009-4546-7214","Mian Zhong; James Harper","CC BY 4.0",,"cambodia, climate-data, open-data, open-datasets, openwashdata, r, wash",,,,"0.0.0.9000","https://github.com/openwashdata/climatevulnerabilitykhm","https://openwashdata.github.io/climatevulnerabilitykhm/",1,,"main",2023-06-20,2023-07-05,"cambodia, climate-data, open-data, open-datasets, openwashdata, r, wash",TRUE,FALSE,,,,FALSE,FALSE,FALSE +"dowalatrinesurvey","Household Latrine Survey Data from Dowa and Thyolo, Malawi","Contains survey data collected in October 2020 from households in Dowa and Thyolo Districts, Malawi. The dataset includes detailed information on household sanitation practices, latrine infrastructure, usage patterns, maintenance behaviors, and user preferences across rural and peri-urban communities. Data was collected using the mWater survey platform by BASEflow Malawi enumerators.","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2025-07-16,"hygiene, latrines, sanitation, wash",,,,"0.0.0.9000","https://github.com/openwashdata/dowalatrinesurvey","https://openwashdata.github.io/dowalatrinesurvey/",1,"v1.0.0","master",2025-06-25,2025-12-15,"hygiene, latrines, sanitation, wash",TRUE,TRUE,,,,FALSE,FALSE,FALSE +"dowaodfsurvey","ODF Sanitation and Hygiene Household Survey – Ntchisi & Dowa District 2019","This dataset contains results from a household-level WASH (Water, Sanitation, and Hygiene) survey conducted on July 1st, 2019 in Mduku GVH, Dowa District, within the catchment area of Mbingwa Health Centre, Malawi. The purpose of the survey was to assess sanitation infrastructure, hygiene practices, and menstrual hygiene management (MHM) as part of an Open Defecation Free (ODF) verification exercise.","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2025-08-07,"open-defecation, sanitation, wash",,,,,"https://github.com/openwashdata/dowaodfsurvey","https://openwashdata.github.io/dowaodfsurvey/",1,"V1.0.0","master",2025-08-07,2025-11-03,"open-defecation, sanitation, wash",TRUE,TRUE,,,,FALSE,FALSE,FALSE +"drillingdata","Borehole Drilling and Construction Data – Malawi, 2018 - 2024","This dataset captures detailed information on borehole drilling and construction activities conducted across selected sites in Malawi in 2018. Data were collected using the mWater digital platform, documenting each stage of groundwater development, from site selection and hydrogeological studies to drilling operations, borehole design, and post-construction assessments.","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango; Jamie Rattray; Shaun MacLeod; Feston Bwanyula","CC BY 4.0",2025-11-06,"borehole, sanitation, wash",,,,,"https://github.com/openwashdata/drillingdata","https://openwashdata.github.io/drillingdata/",1,"v1.0.0","master",2025-04-08,2025-11-06,"borehole, sanitation, wash",TRUE,TRUE,,,,FALSE,FALSE,FALSE +"dryingfaecal","What the Package Does (One Line, Title Case)","What the package does (one paragraph).","0.0.0.9000",FALSE,,"Mian Zhong","0009-0009-4546-7214","Mian Zhong","CC BY 4.0",,,,,,"0.0.0.9000","https://github.com/openwashdata/dryingfaecal","https://openwashdata.github.io/dryingfaecal/",2,,"main",2023-06-28,2024-08-12,,TRUE,FALSE,,,,FALSE,FALSE,FALSE +"ds4owdanalytics","DS4OWD Analytics","Data collected from the Data Science for Open WASH Data (DS4OWD) course and the associated website and data publishing endeavour.","0.1.0",TRUE,,"Yash Dubey","0009-0001-2849-970X","Yash Dubey","CC BY 4.0",2025-01-31,,,,"10.5281/zenodo.14778963","0.1.0","https://github.com/openwashdata/ds4owdanalytics","https://openwashdata.github.io/ds4owdanalytics/",9,"v1.0.0","main",2025-01-31,2025-01-31,,TRUE,TRUE,,,,TRUE,FALSE,FALSE +"faecalsludgekampala","What the Package Does (One Line, Title Case)","What the package does (one paragraph).","0.0.0.9000",FALSE,,"Lars Schöbitz",,"Lars Schöbitz; Matt Bannert","`use_mit_license()`, `use_gpl3_license()` or friends to pick a license",,,,,,"0.0.0.9000","https://github.com/openwashdata/faecalsludgekampala","https://openwashdata.github.io/faecalsludgekampala/",1,,"main",2023-11-30,2023-11-30,,FALSE,FALSE,,,,FALSE,FALSE,FALSE +"fecalcanuga","Demographic, Environmental, Technical and Physio-chemical Data on Non Sewered Sanitation Containments in Rural Canada and Urban Uganda","This data package contains data representing 5 months of field work from April - June 2023 (Canada) and January - February 2024 (Uganda) collecting household and commercial wastewater containment data and characterizing physical, chemical and greenhouse gas data for 22 non-sewered sanitation sites on southern Vancouver island and the southern gulf islands in British Columbia, Canada and 19 sites in Kampala, Uganda.","0.1.0",TRUE,,"Kelsey Shaw","0000-0001-7417-110X","Kelsey Shaw; Caetano Dorea; Linda Strande; Charles Niwagaba; Mian Zhong","CC BY 4.0",2026-06-22,,,,"10.5281/zenodo.20795917","0.1.0","https://github.com/openwashdata/fecalcanuga","https://openwashdata.github.io/fecalcanuga/",4,"v0.1.0","main",2026-06-18,2026-06-22,,TRUE,TRUE,,,,TRUE,FALSE,FALSE +"floodchlorinationsurvey","USAID Flood Response Rehabilitation and Chlorination Survey","This R package provides tools for analyzing and visualizing data from the USAID Flood Response Rehabilitation and Chlorination Survey conducted in Mulanje, Malawi (2019–2020). It includes functions to assess handpump component replacements, evaluate changes in functionality before and after rehabilitation, and identify common repair trends using mWater-collected data.","0.1.0",TRUE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2025-07-01,,,,"10.5281/zenodo.15846578","0.1.0","https://github.com/openwashdata/floodchlorinationsurvey","https://openwashdata.github.io/floodchlorinationsurvey/",1,"v0.1.0","master",2025-06-30,2025-07-09,,TRUE,TRUE,,,,TRUE,FALSE,FALSE +"floodresponsemw","Water Point Assessments - USAID Flood Response Malawi 2019-2020","Field-level data on rural water point status and functionality across Malawi, collected during the USAID Flood Response initiative (2019-2020). Includes GPS locations, flood impact indicators, pump functionality, water quality measurements, and microbial contamination data from mWater mobile assessments.","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2025-07-16,"flood, floodresponse, waterpoints",,,,"0.0.0.9000","https://github.com/openwashdata/floodresponsemw","https://openwashdata.github.io/floodresponsemw/",1,"v0.0.1","master",2025-06-27,2025-12-15,"flood, floodresponse, waterpoints",TRUE,TRUE,,,,FALSE,FALSE,FALSE +"fslogisticskampala","Data on Faecal Sludge Transporting Logistics in Kampala, Uganda","Contains two data resources. `trips` contains the GPS locations of faecal sludge emptying trucks collecting sludge from pit latrines and septic tanks in Kampala, Uganda. Each trip is recorded with a unique identifier, the numberplate of the truck, the date and time of the record. Data was collected from 30th March 2015 until 25th June 2015. `trucks` has additional information on the volume of each truck.","1.0.0",TRUE,,"Lars Schöbitz","0000-0003-2196-5015","Lars Schöbitz","CC BY 4.0",2026-07-08,,,,"10.5281/zenodo.21260446","1.0.0","https://github.com/openwashdata/fslogisticskampala","https://openwashdata.github.io/fslogisticskampala/",2,"v1.0.0","main",2024-07-18,2026-09-04,,TRUE,TRUE,,"main","1.0.0-dev",TRUE,FALSE,FALSE +"fsmglobal","Global Faecal Sludge Emptying Services Demand","Global faecal sludge emptying demand data for 175 countries. Demand is quantified by population size receiving one of four emptying methods (mechanized, non-mechanized, unemptiable, no facility). The demand is disaggregated by rural and urban percentages of population.","0.0.1",TRUE,,"Lars Schöbitz","0000-0003-2196-5015","Nicola Greene; Sarah Hennessy; Tate W. Rogers; Jocelyn Tsai; Francis L. de los Reyes III; Lars Schöbitz","CC BY 4.0",2023-04-26,"faecal, faecal-sludge-emptying, open-data, open-datasets, open-research-data, population-data, r",,,"10.5281/zenodo.8208293","0.0.1","https://github.com/openwashdata/fsmglobal","https://openwashdata.github.io/fsmglobal/",1,"v0.0.1","main",2022-12-13,2023-08-08,"faecal, faecal-sludge-emptying, open-data, open-datasets, open-research-data, population-data, r",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"gdho","Global Database of Humanitarian Organizations","A dataset of global humanitarian organizations collected by Humanitarian Outcomes.","0.0.1",TRUE,,"Mian Zhong","0009-0009-4546-7214","Mian Zhong; Abby Stoddard; Tichakunda Mangono","CC BY 4.0",2024-02-29,"humanitarian, humanitarian-aid, open-data, openwashdata, r",,,"10.5281/zenodo.10727977","0.0.1","https://github.com/openwashdata/gdho","https://openwashdata.github.io/gdho/",2,"v0.0.1","main",2023-09-21,2025-07-03,"humanitarian, humanitarian-aid, open-data, openwashdata, r",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"glaas","Complete Data from the Global Analysis and Assessment of Sanitation and Drinking-Water (GLAAS)","An R data package providing comprehensive access to the UN-Water Global Analysis and Assessment of Sanitation and Drinking-water (GLAAS) dataset. The WHO GLAAS survey collects data on water, sanitation, and hygiene (WASH) systems, policies, and financing from countries worldwide.","0.2.0",FALSE,,"Adriana Clavijo Daza","0009-0002-0589-2274","Nicolò Massari; Colin Walder; Adriana Clavijo Daza","CC BY 4.0",2026-02-05,"glaas, r, rpackage, wash",,,,"0.2.0","https://github.com/openwashdata/glaas","https://openwashdata.github.io/glaas/",1,"v0.2.0","main",2025-04-28,2026-03-27,"glaas, r, rpackage, wash",FALSE,FALSE,,,,FALSE,FALSE,FALSE +"glossarywho","WHO Glossary","This package provides access to a tidy version of the WHO Glossary (https://www.who.int/publications/i/item/9789240105485) and thematic areas for each term.","0.1.0",TRUE,,"Yash Dubey","0009-0001-2849-970X","Yash Dubey","CC BY 4.0",2025-01-28,,,,"10.5281/zenodo.14754017","0.1.0","https://github.com/openwashdata/glossarywho","https://openwashdata.github.io/glossarywho/",2,"v1.0.1","main",2025-01-28,2025-02-03,,TRUE,TRUE,,,,TRUE,FALSE,FALSE +"grdwtrsmpkwale","Groundwater analysis from 2016 in Kwale, Kenya","""The goal of `grdwtrsmpkwale` is to provide datasets for research and planning of water and solid waste management in Kwale, Kenya. This package includes water anlaysis data collected in 2016 combined with the geospatial data from the collection points.""","0.0.1",FALSE,,"Sebastian Camilo Loos","0000-0002-8830-1734","Sebastian Camilo Loos; Mian Zhong; Rob Hope","CC BY 4.0",2023-10-16,"groundwater, groundwater-data, kenya, opendata, openwashdata, r",,,,"0.0.0.9000","https://github.com/openwashdata/grdwtrsmpkwale","https://openwashdata.github.io/grdwtrsmpkwale/",2,"v0.0.1","main",2023-08-17,2023-10-16,"groundwater, groundwater-data, kenya, opendata, openwashdata, r",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"gwinfraassess","The Groundwater Monitoring Infrastructure Assessment Dataset, Nkhotakota - Malawi (2022)","The Groundwater Monitoring Infrastructure Assessment Dataset (2022) is an open dataset published by BASEflow Malawi. The dataset contains field observations collected during an assessment of groundwater monitoring infrastructure in Nkhotakota District, Malawi. It includes information on monitoring well characteristics, groundwater level measurements, monitoring equipment, site accessibility, infrastructure condition, community awareness, and recommended maintenance and rehabilitation actions.","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2026-08-07,,,,,,"https://github.com/openwashdata/gwinfraassess","https://openwashdata.github.io/gwinfraassess/",1,"v1.0.0","dev",2026-08-07,2026-08-07,,TRUE,TRUE,,,,FALSE,FALSE,FALSE +"handpumpstatusdata","Chiradzulu Handpump Functionality Verification Survey","This dataset contains detailed field survey records of borehole and handpump functionality verification exercises conducted in Chiradzulu District, Malawi in February 2020.","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2025-08-12,"handpump, wash, waterpoints",,,,,"https://github.com/openwashdata/handpumpstatusdata","https://openwashdata.github.io/handpumpstatusdata/",1,"v1.0.0","master",2025-08-12,2025-12-15,"handpump, wash, waterpoints",TRUE,TRUE,,,,FALSE,FALSE,FALSE +"hydrogeologicalghana","Hydrogeological Dynamics Data in Ghana","This package contains data on boreholes collected to study the hydrogeological dynamics in the greater Accra and Ashanti regions of Ghana.","0.0.1",TRUE,,"Adriana Clavijo Daza","0009-0002-0589-2274","Benedict Addae-Mensah; Elizabeth Tilley; Adriana Clavijo Daza","CC BY 4.0",2025-08-05,,,,"10.5281/zenodo.16743742","0.0.1","https://github.com/openwashdata/hydrogeologicalghana","https://openwashdata.github.io/hydrogeologicalghana/",1,"v0.0.1","main",2025-07-24,2025-08-05,,TRUE,TRUE,,,,FALSE,FALSE,FALSE +"jmpdata","Input Data and Indicator Estimates from the WHO/UNICEF Joint Monitoring Programme","Contains two data resources from the WHO/UNICEF Joint Monitoring Programme (JMP) for Water Supply, Sanitation and Hygiene. `jmpraw` holds the survey-level input data on sanitation that underlies the JMP estimates, collected from the country files published on . `jmpindicators` holds the modelled JMP indicator estimates for water, sanitation and hygiene from the JMP world file. Both datasets are packaged from the JMP 2025 release.","0.1.0",FALSE,,"Lars Schöbitz","0000-0003-2196-5015","Lars Schöbitz","CC BY 4.0",2026-08-20,,,,,"0.1.0","https://github.com/openwashdata/jmpdata","https://openwashdata.github.io/jmpdata/",2,"v0.1.0","main",2022-04-26,2026-08-20,,TRUE,TRUE,,,,FALSE,FALSE,FALSE +"mwefloodresponse","Malawi Emergency Flood Response Water Point Survey (2019–2020)","This dataset contains water point assessment data collected during an emergency flood response in Malawi between 2019 and 2020. The survey was conducted under the BASEflow program to evaluate the status, functionality, and safety of water points affected by flooding events.","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2026-02-20,"sanitation, wash, water",,,,,"https://github.com/openwashdata/mwefloodresponse","https://openwashdata.github.io/mwefloodresponse/",1,"v.0.0.1","master",2026-02-20,2026-02-26,"sanitation, wash, water",TRUE,TRUE,,,,FALSE,FALSE,FALSE +"mwgroundwaterdata","Malawi Groundwater Monitoring Time-Series Dataset (2024–2025)","This dataset contains groundwater monitoring data collected from monitoring wells across 10 districts in Malawi between 2024 and 2025. The data were captured using automated data loggers installed in monitoring wells and were collected and managed by BASEflow. The dataset provides time-series measurements of key groundwater parameters, enabling detailed analysis of aquifer behavior across multiple geographic locations.","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2026-02-26,"groundwater, sanitation, wash, water, watermonitoring",,,,,"https://github.com/openwashdata/mwgroundwaterdata","https://openwashdata.github.io/mwgroundwaterdata/",1,"v.0.0.1","main",2026-02-26,2026-02-27,"groundwater, sanitation, wash, water, watermonitoring",TRUE,TRUE,,,,FALSE,FALSE,FALSE +"nchalohhwatersurvey","What the Package Does (One Line, Title Case)","What the package does (one paragraph).","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2025-06-27,"hygiene, sanitation, wash",,,,,"https://github.com/openwashdata/nchalohhwatersurvey","https://openwashdata.github.io/nchalohhwatersurvey/",1,"v1.0.0","master",2025-06-27,2025-11-04,"hygiene, sanitation, wash",TRUE,TRUE,,,,FALSE,FALSE,FALSE +"planetaryhdi","Planetary Pressures Adjusted Human Development Index Data","Provides data on Planetary Pressures Adjusted Human Development, adjusted by carbon emissions per capita (production related) and materials footprint per capita.","0.1.0",TRUE,,"Yash Dubey",,"Yash Dubey","CC BY 4.0",2024-12-10,"emissions-per-capita, hdi, planetary-pressures, sdgs",,,"10.5281/zenodo.14355748","0.1.0","https://github.com/openwashdata/planetaryhdi","https://openwashdata.github.io/planetaryhdi/",1,"0.0.2","main",2024-12-10,2024-12-10,"emissions-per-capita, hdi, planetary-pressures, sdgs",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"ploswater","Data on Publications in PLOS Water Journal","Provides access to publishing trends from PLOS Water Journal.","0.0.0.9000",TRUE,,"Yash Dubey","0009-0001-2849-970X","Yash Dubey","CC BY 4.0",2025-01-08,,,,"10.5281/zenodo.14616993","0.0.0.9000","https://github.com/openwashdata/ploswater","https://openwashdata.github.io/ploswater/",1,"v1.0.2","main",2025-01-08,2025-01-08,,TRUE,TRUE,,,,TRUE,FALSE,FALSE +"portawaterperu","A Preliminary Review of Peruvian Potable Water System Data","Data to gain preliminary understanding of community potable water systems in Peru.","0.0.1",FALSE,,"Sebastian Camilo Loos","0000-0002-8830-1734","Lauren Judah; Sebastian Camilo Loos; Mian Zhong","CC BY 4.0",2024-07-24,,,,,"0.0.0.9000","https://github.com/openwashdata/portawaterperu","https://openwashdata.github.io/portawaterperu/",1,"v0.0.1","main",2024-06-18,2024-07-30,,TRUE,TRUE,,,,TRUE,FALSE,FALSE +"postfloodintervention","USAID Flood Response Post Intervention Survey Data","Post-intervention monitoring data for rural water points in the Mulanje district of Malawi, collected as part of the USAID Flood Response program during 2019-2020. The dataset includes comprehensive water point assessments covering physical condition, operational performance, hydraulic measurements, water quality parameters, and microbiological quality assessments.","0.1.0",TRUE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",,,,,"10.5281/zenodo.15837461","0.1.0","https://github.com/openwashdata/postfloodintervention","https://openwashdata.github.io/postfloodintervention/",1,"v0.1.1","master",2025-07-01,2025-07-08,,TRUE,TRUE,,,,FALSE,FALSE,FALSE +"rainwaterhsurvey","Rainwater Harvesting and Groundwater Recharge Household Survey (BASEflow, 2025)","This dataset contains household-level survey data collected in 2025 under the BASEflow monitoring and data systems using the mWater digital data collection platform. The survey was conducted across selected communities to assess household water access conditions, perceptions of groundwater systems, and adoption of rainwater harvesting (RWH) practices.","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2026-04-16,"baseflow, groundwater, opendatawash, rainwater-harvesting",,,,,"https://github.com/openwashdata/rainwaterhsurvey","https://openwashdata.github.io/rainwaterhsurvey/",1,"v1.0.0","main",2026-04-16,2026-04-16,"baseflow, groundwater, opendatawash, rainwater-harvesting",TRUE,TRUE,,,,FALSE,FALSE,FALSE +"rwpfunctionality","Water point functionality assessment in nine sub-Saharan Africa and South Asia countries","Water point monitoring data associated with the paper ""[Rural water point functionality estimates and associations: evidence from nine countries in sub-Saharan Africa and South Asia](https://agupubs.onlinelibrary.wiley.com/doi/10.1029/2023WR034679)"" (Murray, Anna L et al., 2024).","0.0.1",TRUE,,"Margaux Götschmann","0009-0002-2567-3343","Margaux Götschmann; Anna L. Murray; Gabriela Stone; Audrey R. Yang; Nicholas F. Lawrence; Hannah Matthews; Georgia L. Kayser","CC BY 4.0",2024-03-11,"management, open-data, r, wash, water, waterpoint",,,"10.5281/zenodo.10878635","0.0.1","https://github.com/openwashdata/rwpfunctionality","https://openwashdata.github.io/rwpfunctionality/",1,"v0.0.1","main",2024-03-11,2024-03-26,"management, open-data, r, wash, water, waterpoint",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"saniabidjan","Data About Behavior and Practices of Managing Sanitation Facilties in Abidjan, Cote d’Ivoire","This data package contains household survey data collected from two low-income areas of Abidjan, Cote d'Ivoire. The survey was focusing on practices related to the management of sanitation facilities, specifically, latrines and tanks.","0.0.1",TRUE,,"Mian Zhong","0009-0009-4546-7214","Phaniwa Zié Zoumana Coulibaly; Kouassi Dongo; Mian Zhong","CC BY 4.0",2024-07-30,"abidjan, cote-d-ivoire, household-surveys, open-data, openwashdata, r, sanitation, wash, water-management",,,"10.5281/zenodo.13134220","0.0.1","https://github.com/openwashdata/saniabidjan","https://openwashdata.github.io/saniabidjan/",1,"v0.0.1","main",2024-07-03,2024-09-16,"abidjan, cote-d-ivoire, household-surveys, open-data, openwashdata, r, sanitation, wash, water-management",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"solidwastekampala","Quantity and Composition of Domestic Solid Waste in Kampala City","Domestic solid waste generation and composition data for 103 households in Kampala City, Uganda, collected over a seven-day measurement campaign in three parishes representing different income levels (Bwaise I, low income; Bukoto I, middle income; Ggaba, high income). Includes ten measured waste-category masses, derived per-household metrics, and household socio-economic characteristics. The data accompany the manuscript ""Quantity and Composition of Domestic Solid Waste in Kampala City as Influenced by Socio-Economic Factors"" (Katukiza et al., Makerere University).","1.0.0",TRUE,,"Lars Schöbitz","0000-0003-2196-5015","Alex Y. Katukiza; Charles B. Niwagaba; Ivan Feni; Shaluwa Namagembe; Swaib Semiyaga; Abubakar Batte; Lars Schöbitz; Musa Manga","CC BY 4.0",2026-07-24,,,,"10.5281/zenodo.21519797","1.0.0","https://github.com/openwashdata/solidwastekampala","https://openwashdata.github.io/solidwastekampala/",1,"v1.0.0","main",2026-07-22,2026-07-28,,TRUE,TRUE,,,"1.0.0",TRUE,FALSE,FALSE +"thyolocbcc","WASH and Sanitation Survey in Community-Based Childcare Centres – Thyolo and Chikwawa, Malawi (2021)","This dataset provides detailed information on Water, Sanitation, and Hygiene (WASH) conditions and related management practices in Community-Based Childcare Centres (CBCCs) across Thyolo and Chikwawa Districts in Malawi, collected in 2021. Data were gathered by BASEflow using the mWater digital data collection platform..","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2025-11-06,"baseflow, cbcc, hygiene, openwashdata, sanitation, wash",,,,,"https://github.com/openwashdata/thyolocbcc","https://openwashdata.github.io/thyolocbcc/",1,"v1.0.0","master",2025-06-24,2025-11-06,"baseflow, cbcc, hygiene, openwashdata, sanitation, wash",TRUE,TRUE,,,,FALSE,FALSE,FALSE +"ugabore","Borehole repair data from central Uganda","Data set about borehole repair records from the borehole operation and maintenance company operating in central Uganda. Population data is picked as an interview from a representative of the Local Water User Committees (LWUCs). The data on the technical specifications about the borehole is picked from the borehole records file from the company.","0.0.1",TRUE,,"Margaux Götschmann","0009-0002-2567-3343","Margaux Götschmann; Joseph Lwere","CC BY 4.0",2024-05-21,"analysis, borehole, data, open-data, r, uganda, wash, water",,,"10.5281/zenodo.12188179","0.0.1","https://github.com/openwashdata/ugabore","https://openwashdata.github.io/ugabore/",1,"v.0.0.1","main",2024-04-30,2024-06-20,"analysis, borehole, data, open-data, r, uganda, wash, water",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"undpcomposite","UNDP Composite Indicators Timeseries","Provides tidy data about all UNDP indicators in a composite timeseries.","0.1.0",TRUE,,"Yash Dubey","0009-0001-2849-970X","Yash Dubey","CC BY 4.0",2025-02-10,,,,"10.5281/zenodo.14845848","0.1.0","https://github.com/openwashdata/undpcomposite","https://openwashdata.github.io/undpcomposite/",1,"v1.0.0","main",2025-02-10,2025-02-11,,TRUE,TRUE,,,,TRUE,FALSE,FALSE +"unhcrwash","WASH Data From Refugee Camps and Settlements (UNHCR)","This is a dataset on WASH indicators in refugee camps and settlements. The data was collected from the UNHCR Information Management System (IRIS) and was available on the UNHCR WASH dashboard. This dataset includes data from 227 sites and 36 countries. The source dashboard has since been retired and the data now sits behind the login-gated iRHIS portal, so this dataset is a fixed historical snapshot (2013 to 2024) that can no longer be regenerated.","1.1.0",TRUE,,"Lars Schöbitz","0000-0003-2196-5015","Lars Schöbitz; Yash Dubey","CC BY 4.0",2026-06-22,,,,"10.5281/zenodo.14185117","1.1.0","https://github.com/openwashdata/unhcrwash","https://openwashdata.github.io/unhcrwash/",1,"v1.1.0","main",2024-11-13,2026-06-22,,TRUE,TRUE,,,,FALSE,FALSE,FALSE +"universityrankingafrica","University Ranking Africa","Data from institutional and national levels was combined into a dataset to provide a comprehensive characterization of the top ranked Universities of every African country. This was done to demonstrate the correlation of certain attributes with the academic ranking performance. The dataset also highlights the difficulties of accessing data from many African Universities online.","0.0.0.9000",FALSE,,"Sophia Skorik","0009-0001-4755-1649","Samuel Sigrist; Sophia Skorik","CC BY 4.0",2023-10-30,"africa, openwashdata, r, university-ranking",,,,"0.0.0.9000","https://github.com/openwashdata/universityrankingafrica","https://openwashdata.github.io/universityrankingafrica/",2,"v0.0.1","main",2023-12-04,2023-12-14,"africa, openwashdata, r, university-ranking",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"waschoolpiracema","WASH in Schools in Piracema, Brazil","The main goal of this study was to describe the profile of schools from the basic education system in the municipality of Piracema (Minas Gerais, Brazil). Moreover, we also aimed to compare the characteristics of schools, with a special concern to WASH, pre- (2020), peri- (2021) and post-COVID-19 pandemic (2022) to evaluate to what extend schools in Piracema made progress in providing WASH since the beginning of the COVID-19 pandemic. This study is a sub-project of a PhD project and an initial study comparing the BNSC from 2020 and 2021 has already been conducted and published by the author of this project (for more details see references). Findings will be essential for the next phase of the research, which will be the collection of primary data in schools in the municipality of Piracema through qualitative methods (interviews, on-spot observations and art-based research).","0.0.1",TRUE,,"Alexis Tabin","0009-0004-4908-9250","Alexis Tabin; Kasandra Poague; Mian Zhong","CC BY 4.0",2024-07-09,"brazil, opendata, openwashdata, piracema, r, sanitation, wash",,,"10.5281/zenodo.12701107","0.0.1","https://github.com/openwashdata/waschoolpiracema","https://openwashdata.github.io/waschoolpiracema/",1,"v0.0.1","main",2024-06-18,2024-07-09,"brazil, opendata, openwashdata, piracema, r, sanitation, wash",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"washdataportalsl","What the Package Does (One Line, Title Case)","What the package does (one paragraph).","0.0.0.9000",FALSE,,"First Last","YOUR-ORCID-ID","First Last","`use_mit_license()`, `use_gpl3_license()` or friends to pick a license",,,,,,,"https://github.com/openwashdata/washdataportalsl","https://openwashdata.github.io/washdataportalsl/",1,,"main",2025-03-10,2025-03-10,,TRUE,TRUE,,,,FALSE,FALSE,FALSE +"washinvestments","Multilateral development banks investment behaviour in water and sanitation","Dataset on multilateral development bank (MDB) investment in water supply and sanitation between 1960 and 2020 compiled by drawing on on 3,639 water and sanitation projects to assess territorial trends, technology choices, distribution of financial burdens, and reforms to institutional arrangements.","0.0.1",TRUE,,"Margaux Götschmann","0009-0002-2567-3343","Margaux Götschmann; Andri Heidler; Muhil Nesi; Josiane Nikiema; Christoph Lüthi","CC BY 4.0",2024-05-16,"africa, asia, investment, mdb, open-data, r, sanitation, wash, water",,,"10.5281/zenodo.11203434","0.0.1","https://github.com/openwashdata/washinvestments","https://openwashdata.github.io/washinvestments/",1,"v0.0.1","main",2024-03-11,2026-07-08,"africa, asia, investment, mdb, open-data, r, sanitation, wash, water",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"washmalawi","WASH Household Level Survey Data 2018 - 2023","This package provides access to Water, Sanitation, and Hygiene (WASH) household-level survey data collected in Malawi between 2018 and 2023. The dataset includes comprehensive indicators for monitoring WASH-related Sustainable Development Goals at the household level.","1.0.1",TRUE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango; Donald Robertson; Chifundo Mandala; M Nzengo; Muthi Nhlema; M. Banda; Khumbo Zinyongo; Christian Nedi; Leman Ngwena; M Kazembe; Yankho Mthindi; E. Mofolo; Jeffrey Bauleni; Khallen Malliot; Thandi Mtemangombe; Tamandani Tembo; Samuel Mlenga; Dufter Joshua; Andrew Mthunzi; Martha Kafuwa; Takondwa Tembo; Peter Singogo; Goodwin Mkandawire; Monica Msiska; Lemekezani Chilora; Tendai Jambo; William Kanyinji; Chikondi Kanyinji; Madalitso Kamamkhudza; Sylvia Siliya; Edward K Gadi; Buli Echika; Sunganani Monjeza; Derick Macheke; Fatsani Chinawa; Jonathan Sunthika; Precious Phiri; Bright Mphero; Rodney Kananji","CC BY 4.0",2025-04-30,,,,"10.5281/zenodo.15799918","1.0.1","https://github.com/openwashdata/washmalawi","https://openwashdata.github.io/washmalawi/",1,"v1.0.1","main",2025-04-29,2025-07-03,,TRUE,TRUE,,,,TRUE,FALSE,FALSE +"washopenresearch","Dataset about open research data information in Water, Sanitation, and Hygiene","The goal of washopenresearch is to provide an overview of open research data related to Water Sanitation and Hygiene (WASH). The package provides access to four datasets `washdev`, `uncnewsletter`, `ploswater`, and `datapapers`. Each dataset collects information on scientific articles about (1) article metadata (e.g. title, first author, correspondence author), (2) supplementary material information, (3) data availability statement, and (4) semantic information (e.g. keywords).","0.3.0",TRUE,,"Mian Zhong","0009-0009-4546-7214","Mian Zhong; Ludwig Luz; Lars Schöbitz","CC BY 4.0",2026-08-20,"open-data, open-research-data, open-science, openwashdata, sanitation, wash",,,"10.5281/zenodo.11185699","0.3.0","https://github.com/openwashdata/washopenresearch","https://openwashdata.github.io/washopenresearch/",4,"v0.3.0","main",2023-12-21,2026-08-20,"open-data, open-research-data, open-science, openwashdata, sanitation, wash",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"wasteburningblantyre","What the Package Does (One Line, Title Case)","What the package does (one paragraph).","0.0.0.9000",FALSE,,"Lars Schöbitz","0000-0003-2196-5015","Lars Schöbitz; Mabvuto Yesaya; Elizabeth Tilley; Saloni Vijay","CC BY 4.0",2023-09-13,,,,,"0.0.0.9000","https://github.com/openwashdata/wasteburningblantyre","https://openwashdata.github.io/wasteburningblantyre/",9,,"main",2023-09-13,2023-10-26,,TRUE,FALSE,,,,FALSE,FALSE,FALSE +"wastecollectionblantyre","What the Package Does (One Line, Title Case)","What the package does (one paragraph).","0.0.0.9000",FALSE,,"First Last","YOUR-ORCID-ID","First Last","`use_mit_license()`, `use_gpl3_license()` or friends to pick a license",,,,,,,"https://github.com/openwashdata/wastecollectionblantyre","https://openwashdata.github.io/wastecollectionblantyre/",2,,"main",2023-12-06,2023-12-06,,FALSE,FALSE,,,,FALSE,FALSE,FALSE +"wastedata","Waste Site Survey Data (2017 - 2018)","This dataset contains survey records on cemeteries, burial grounds, and waste disposal sites in Malawi. The information was gathered through field enumerators using the mWater platform as part of a mapping initiative. Each record captures details such as the location of the site, its operational status, management arrangements, and opening or closing history. The dataset also includes data on the type and state of waste present, evidence of pollution, the sources of waste, and the population served by municipal facilities. In addition, it documents the types of operations at municipal, commercial, industrial, and sludge waste sites, as well as practices related to drinking water and waste water treatment.","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2025-09-01,"waste-data, waste-management",,,,,"https://github.com/openwashdata/wastedata","https://openwashdata.github.io/wastedata/",1,"v1.0.0","master",2025-09-01,2025-10-28,"waste-data, waste-management",TRUE,TRUE,,,,FALSE,FALSE,FALSE +"wasteskipsblantyre","Locations of Public Waste Skips in Blantyre, Malawi","An R data package containing the locations of public waste skips in Blantyre, Malawi.","0.0.2",TRUE,,"Sebastian Camilo Loos","0000-0002-8830-1734","Mabvuto Yesaya; Limbani Msuku; Elizabeth Tilley; Sebastian Camilo Loos","CC BY 4.0",,"data-visualization, geolocation, malawi, open-data, open-datasets, r, solid-waste, waste-management",,,"10.5281/zenodo.6470427","0.0.2","https://github.com/openwashdata/wasteskipsblantyre","https://openwashdata.github.io/wasteskipsblantyre/",1,,"main",2023-07-05,2023-12-06,"data-visualization, geolocation, malawi, open-data, open-datasets, r, solid-waste, waste-management",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"waterconsumersurvey","Household Water Point Satisfaction Survey Data from Malawi","Provides household-level survey data on water access, reliability, and user satisfaction from Zomba and Mangochi Districts in Malawi. Collected in September 2021 using GPS-enabled devices, the dataset includes 423 households with information on water sources, infrastructure conditions, seasonal availability, and demographic indicators relevant to water access and decision-making.","0.0.0.9000",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2025-07-16,,,,,"0.0.0.9000","https://github.com/openwashdata/waterconsumersurvey","https://openwashdata.github.io/waterconsumersurvey/",1,"v1.0.0","master",2025-06-26,2025-11-04,,TRUE,TRUE,,,,FALSE,FALSE,FALSE +"watercostaccra","Household water costs and coping strategies data from metropolitan Accra","A household survey on water costs and coping strategies as well as a water point survey were conducted in two low-income communities in metropolitan Accra. These are Korle Gonno, a larger, well-planned coastal area with over 35 household water vendors, and Abuja, a small, densely packed, extralegal settlement with 15 water vendor and bathhouse businesses.","0.0.0.9000",TRUE,,"Margaux Götschmann","0009-0002-2567-3343","Elizabeth Vicario; Margaux Götschmann; Betty Avanu Davidson; Ebenezer F. Amankwaa; Mian Zhong","CC BY 4.0",2024-06-21,"accra, ghana, household-surveys, open-data, openwashdata, r, water-cost",,,"10.5281/zenodo.13981225","0.0.0.9000","https://github.com/openwashdata/watercostaccra","https://openwashdata.github.io/watercostaccra/",2,"v0.0.0.9000","main",2024-06-18,2024-10-23,"accra, ghana, household-surveys, open-data, openwashdata, r, water-cost",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"waterpointstatus","Water Point Functionality and Service Delivery Monitoring Dataset - 2023","This dataset contains structured field survey responses collected from water point inspections and interviews with community members or water point committee representatives. Each record represents a single survey event linked to a specific water point, including GPS coordinates, enumerator metadata, timestamps, and detailed observations on infrastructure condition, functionality, water availability, maintenance practices, and governance arrangements.","1.0.0",FALSE,,"Emmanuel Mhango","0000-0003-3197-6244","Emmanuel Mhango","CC BY 4.0",2026-04-10,"baseflow, boreholes, groundwater, wash, waterpoints",,,,,"https://github.com/openwashdata/waterpointstatus","https://openwashdata.github.io/waterpointstatus/",1,"v1.0.0","main",2026-04-10,2026-04-10,"baseflow, boreholes, groundwater, wash, waterpoints",TRUE,TRUE,,,,FALSE,FALSE,FALSE +"waterpumpkwale","Weekly volume of water pumped for handpumps monitored with Smart Handpump technology, Kwale County, Kenya","A dataset contains a summary of the weekly volumetric output of pumps monitored using Smart Handpump sensors for 2014 and 2015 in Kwale County of Kenya.","0.0.1",TRUE,,"Mian Zhong","0009-0009-4546-7214","Patrick Thomson; Rob Hope; Tim Foster; Mian Zhong","CC BY 4.0",2023-10-02,"africa, kenya, kwale, open-data, open-datasets, r, underground-water, upgro, water-pump",,,"10.5281/zenodo.8399887","0.0.1","https://github.com/openwashdata/waterpumpkwale","https://openwashdata.github.io/waterpumpkwale/",3,"v0.0.1","main",2023-08-16,2024-05-02,"africa, kenya, kwale, open-data, open-datasets, r, underground-water, upgro, water-pump",TRUE,TRUE,,,,TRUE,FALSE,FALSE +"whatawaste","What the Package Does (One Line, Title Case)","What the package does (one paragraph).","0.0.0.9000",FALSE,,"First Last",,"First Last","CC BY 4.0",,,,,,,"https://github.com/openwashdata/whatawaste","https://openwashdata.github.io/whatawaste/",1,,"main",2025-03-10,2025-03-11,,TRUE,TRUE,,,,FALSE,FALSE,FALSE +"whdxdata","Water point exchange data","Data from the Water Point Data Exchange (WPDX) database.","0.0.0.9000",FALSE,,"Lars Schöbitz","0000-0003-2196-5015","Lars Schöbitz","CC BY 4.0",2024-04-16,,,,,"0.0.0.9000","https://github.com/openwashdata/whdxdata","https://openwashdata.github.io/whdxdata/",1,,"main",2024-04-16,2024-04-16,,TRUE,FALSE,,,,TRUE,FALSE,FALSE +"worldhdi","Human Development Index Worldwide 1990-2022 (2024)","This package provides details about Human Development Index across the world from 1990 to 2022. 193 countries are included in the dataset. It also includes data aggregated by regions.","0.1.0",TRUE,,"Yash Dubey",,"Yash Dubey","What license is it under?",,,,,"10.5281/zenodo.14006110","0.1.0","https://github.com/openwashdata/worldhdi","https://openwashdata.github.io/worldhdi/",1,"V1.0.1","main",2024-10-28,2025-01-22,,TRUE,TRUE,,,,FALSE,FALSE,FALSE +"wsabrazil","Wastewater management and household infrastructure in Brazil","This dataset about wastewater management and household infrastructure from various Brazilian regions provides insights into wastewater disposal habits, water sources, bathroom facilities, and sanitation infrastructure.","0.0.0.9000",FALSE,,"Margaux Götschmann","0009-0002-2567-3343","Margaux Götschmann; Lais Santos","CC BY 4.0",2024-03-28,"2010, brazil, infrastructure, open-data, r, sanitation, wash, wastewater, water",,,,"0.0.0.9000","https://github.com/openwashdata/wsabrazil","https://openwashdata.github.io/wsabrazil/",1,,"main",2024-03-26,2024-11-27,"2010, brazil, infrastructure, open-data, r, sanitation, wash, wastewater, water",TRUE,TRUE,,,,TRUE,FALSE,FALSE diff --git a/inst/extdata/owd_variables.csv b/inst/extdata/owd_variables.csv new file mode 100644 index 0000000..b66cd84 --- /dev/null +++ b/inst/extdata/owd_variables.csv @@ -0,0 +1,2799 @@ +"pkg_name","dataset_name","variable_name","variable_type","description" +"artesianwells","artesianwells","date_submitted","character","Date when the survey or data entry was submitted" +"artesianwells","artesianwells","latitude","numeric","Latitude coordinate of the surveyed site" +"artesianwells","artesianwells","longitude","numeric","Longitude coordinate of the surveyed site" +"artesianwells","artesianwells","artesian_well","character","Indicates whether the location of the artesian well" +"artesianwells","artesianwells","district","character","Administrative district where the site is located" +"artesianwells","artesianwells","traditional_authority","character","Traditional authority under which the site falls" +"artesianwells","artesianwells","well_images","character","Links or filenames of images showing the well" +"artesianwells","artesianwells","has_structure","character","Indicates if the well has a surrounding structure" +"artesianwells","artesianwells","well_structure_type","character","Type of structure present around the well" +"artesianwells","artesianwells","well_structure_type_other","character","Description of structure if Other is selected" +"artesianwells","artesianwells","can_test_flow","character","Indicates if a flow test can be conducted at the site" +"artesianwells","artesianwells","seconds_to_fill_20L","numeric","Time in seconds required to fill a 20 liter container" +"artesianwells","artesianwells","use_of_site","character","Primary community usage of the water source" +"artesianwells","artesianwells","other_site_use","character","Additional uses of the site (if any)" +"artesianwells","artesianwells","seasonal_unavail","character","Indicates if the site becomes unavailable during certain seasons" +"artesianwells","artesianwells","area_photos","character","Links or filenames of photos showing the broader site area" +"artesianwells","artesianwells","abstraction_nearby","character","Indicates if there are other water abstractions near the site" +"artesianwells","artesianwells","abstraction_count","numeric","Number of nearby water abstractions" +"artesianwells","artesianwells","abs1_name","character","Name or label of the nearest water abstraction" +"artesianwells","artesianwells","abs1_latitude","numeric","Latitude of the nearest abstraction" +"artesianwells","artesianwells","abs1_longitude","numeric","Longitude of the nearest abstraction" +"artesianwells","artesianwells","abs1_method","character","Method used at the nearest abstraction" +"artesianwells","artesianwells","abs1_region","character","Region or area where the nearest abstraction is located" +"artesianwells","artesianwells","recharge_known","character","Indicates if groundwater recharge source is known" +"artesianwells","artesianwells","recharge_other","character","Description of recharge source if Other is selected" +"artesianwells","artesianwells","river_nearby","character","Indicates if a river is near the site" +"artesianwells","artesianwells","has_operator","character","Indicates if the water point has a designated operator" +"artesianwells","artesianwells","mgmt_type","character","Type of management in place for the water source" +"artesianwells","artesianwells","mgmt_type_other","logical","Type of management in place for the water source if Other is selected" +"biogasoutcomesmalawi","biogasoutcomesmalawi","interview_id","character","The site id where the interview was performed." +"biogasoutcomesmalawi","biogasoutcomesmalawi","interview_date","date","The date on which the interview was performed." +"biogasoutcomesmalawi","biogasoutcomesmalawi","question_id","integer","The number of the question within each interview. Note: Number of questions differ between interviews." +"biogasoutcomesmalawi","biogasoutcomesmalawi","interviewer","character","The question asked by the interviewer." +"biogasoutcomesmalawi","biogasoutcomesmalawi","interviewee","character","The answer given by the interviewee." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","date_of_test","Date","Date the borehole pumping test was conducted." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","administrative_region","character","Geographic region where the water point is located." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","latitude","numeric","Latitude coordinate of the water point." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","longitude","numeric","Longitude coordinate of the water point." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","name","character","Name of the water point or borehole." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","type_of_waterpoint","character","Classification of the water point." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","description","character","A brief description of the water point." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","type_of_test","character","Type of pumping test conducted on the borehole." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","pumping_test_possible","character","Indicates if the pumping test was successfully completed." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","pumping_test_not_possible_reason","character","Reason why the pumping test could not be completed, if applicable." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","water_point_committee_permission","character","Indicates whether the water point committee approved the test." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","district_water_office_permission","character","Indicates whether the district water office approved the test." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","static_water_level","numeric","Water level below the reference point before the test started (in meters)." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","water_level_reference_point","character","Reference point used to measure the water level." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","other_water_level_reference_point","character","Additional reference point for measuring water level, if applicable." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","reference_level","numeric","Measurement of the reference level relative to ground level (in meters)." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","pump_intake_depth","numeric","Depth of the pump intake within the borehole (in meters)." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","total_hole_depth","numeric","Total depth of the borehole (in meters)." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","was_a_water_level_logger_used","character","Indicates if a water level logger was used during the test." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","was_a_flow_meter_used","character","Indicates if a flow meter was used during the pumping test." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","other_flow_meter_used","logical","Indicates if an alternative flow meter was used during the test." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","bucket_size_in_litres","numeric","Volume of the bucket used for manual flow measurements (in liters)." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","index_1","logical","Internal logical index variable for tracking purposes." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","time_in_mins","logical","Indicates if time was recorded in minutes during the test." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","water_level_in_mbrp","logical","Indicates if the water level was measured in meters below the reference point." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","flowmeter_total","logical","Indicates if the total flowmeter reading was recorded." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","flow_rate_in_liters_per_second","logical","Indicates if the flow rate was measured in liters per second." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","flow_rate_method","logical","Indicates if the method for measuring flow rate was recorded." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","index_2","logical","A second internal logical index variable for tracking purposes." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","time_of_sample_in_min","logical","Indicates if the sampling time was recorded in minutes." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","ec_in_ms_per_cm","logical","Indicates if electrical conductivity (EC) was measured in millisiemens per centimeter." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","tds_ppt","logical","Indicates if total dissolved solids (TDS) were recorded in parts per thousand (ppt)." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","temperature_in_celcius","logical","Indicates if the temperature of the water was recorded in degrees Celsius." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","ph","logical","Indicates if the pH level of the water was measured." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","turbidity_ntu","logical","Indicates if turbidity was measured in nephelometric turbidity units (NTU)." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","Imhoff_cone_cubic_centimeter_per_liter","logical","Indicates if sediment concentration was measured using an Imhoff cone." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","water_level_stabilised","character","Indicates if the water level stabilized during pumping at 0.25 liters per second." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","dwl_at_0.25lps","numeric","Depth to the water level at a 0.25 liters per second pumping rate (in meters)." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","max_pumping_rate","numeric","Maximum pumping rate successfully achieved during the test (in liters per second)." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","dwl_at_max_rate","numeric","Depth to the water level at the maximum pumping rate (in meters)." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","silt_ejected_during_test","character","Indicates whether silt was observed being ejected from the borehole during the test." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","borehole_passed","character","Indicates if the borehole passed the pumping test based on performance criteria." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","other_borehole_pass_reason","logical","Additional explanation regarding the boreholes performance in the pumping test, if applicable." +"boreholeforensicspumpingtest","boreholeforensicspumpingtest","comments_on_pumping_test","character","Additional comments or observations regarding the pumping test." +"boreholefuncmwi","boreholefuncmwi","id","integer","Identification number of the observation" +"boreholefuncmwi","boreholefuncmwi","date","date","Date the survey was filled out" +"boreholefuncmwi","boreholefuncmwi","role","categorical","Main role of the respondent. Options include 'Area Mechanic', 'Chief/Village Headman', 'Community member', 'Councilor', 'Head teacher/Teacher', 'HSA/Health officer', 'Hand pump borehole committee chair', 'Hand pump borehole committee member', 'Hand pump borehole owner', 'Water Seller', and 'Water User Association/Water Board member'" +"boreholefuncmwi","boreholefuncmwi","committee_members","integer","How many people are on the Hand pump borehole Committee as of 2023?" +"boreholefuncmwi","boreholefuncmwi","last_meeting_participants","integer","How many community members attended the last meeting? (Label 99 for unknown number of attendants)" +"boreholefuncmwi","boreholefuncmwi","annual_budget","integer","How much money in Malawi Kwacha do you need to manage this borehole without financial problems annually?" +"boreholefuncmwi","boreholefuncmwi","village","categorical","Name of the village" +"boreholefuncmwi","boreholefuncmwi","number_households","integer","How many households use this hand pump borehole?" +"boreholefuncmwi","boreholefuncmwi","tariff_costs_consider","categorical","What costs were considered when setting the tariff or user fee? Options including Maintenance costs, Operation costs - e.g. salary of the water seller, Total replacement cost for the system, Set by local government, and Bill payments." +"boreholefuncmwi","boreholefuncmwi","tariff_frequency","categorical","How often is the tariff/user fee collected? Including per month, per 2 months, per quarter, per year and when required for repairs." +"boreholefuncmwi","boreholefuncmwi","tariff_amount","integer","How much is the tariff/user fee in Kwacha?" +"boreholefuncmwi","boreholefuncmwi","total_money","integer","How much money in Malawi Kwacha do you source to support operations and maintenance annually?" +"boreholefuncmwi","boreholefuncmwi","tariff_hh_number","integer","How many households in the community paid a water fee the last time it was collected?" +"boreholefuncmwi","boreholefuncmwi","distance_materials","categorical","How far away are/were the materials you use for hand pump borehole repairs? Options include '>20km', '0-20km', 'within community', and 'don't know'." +"boreholefuncmwi","boreholefuncmwi","service_provider","categorical","Is there a service provider or someone responsible for operating and/or maintaining this hand pump borehole or water system? Yes for 1 and No for 0." +"boreholefuncmwi","boreholefuncmwi","preventive_maintenance","categorical","Do you conduct preventive maintenance? Yes for 1 and No for 0." +"boreholefuncmwi","boreholefuncmwi","functional_status","categorical","Functional status of the borehole. Functional for 1, Not functional for 0 (including 'Partially functional but in need of repair', 'Not functional')" +"breathablepitlat","breathablepitlat","site","integer","There are two sites for the field test: site 1 and site 2. A twin-pit pour-flush pit latrine was constructed at each site." +"breathablepitlat","breathablepitlat","depth","double","The soil samples were collected at two different depths (1 m and 0.5 m) from ground level." +"breathablepitlat","breathablepitlat","lateral","double","The soil samples were collected from 0.5 m , 1 m, 5 m and 10 m lateral distance away from the pit." +"breathablepitlat","breathablepitlat","time","double","This describes the time (in days) of sample collection. The water and soil samples were collected over a period of 322 days." +"breathablepitlat","breathablepitlat","test","integer","The 6 parameters tested from the samples collected in this field test. They include pH, electrical conductivity, total coliform, nitrate, ammonia, and phosphorus." +"breathablepitlat","breathablepitlat","location","integer","The location of the soil samples marked P1 for unlined and P2 for lined pit. A, B, C, D, E, F are locations around the pits while M is the middle point between the lined and unlined pit." +"breathablepitlat","breathablepitlat","values","double","The values measured for said parameter" +"breathablepitlat","breathablepitlat","num_test","logical","The values measured for said parameter" +"cbssuitabilityhaiti","mwater","latitude","double","Lattitude coordinate" +"cbssuitabilityhaiti","mwater","longitude","double","Longitude coordinate" +"cbssuitabilityhaiti","mwater","administra","character","Communal section- smallest administrative unit in Haiti" +"cbssuitabilityhaiti","mwater","type","character","Type of water access point" +"cbssuitabilityhaiti","mwater","date_added","double","Date water access point was added to mWater" +"cbssuitabilityhaiti","mwater","datasets","character","Dataset in mWater that point is part of, including organizaiton that is responsible for data" +"cbssuitabilityhaiti","mwater","geometry","list","Geospatial data of the different access points that were added to mWater" +"cbssuitabilityhaiti","okap","neighborho","double","Unique identifying number for each neighborhood unit" +"cbssuitabilityhaiti","okap","name","character","Name of each nieghborhood unit" +"cbssuitabilityhaiti","okap","sup_km2","double","Area of neighborhood in square km" +"cbssuitabilityhaiti","okap","cte","character","Name of commune (administrative unit in Haiti)" +"cbssuitabilityhaiti","okap","economy","character","Categorical socioeconomic status (low, medium)" +"cbssuitabilityhaiti","okap","sup_bati_km2","double","area of neihborhood covered by buildings in square kilometers" +"cbssuitabilityhaiti","okap","density","integer","Categorical population density (least dense, somewhat dense, dense, very dense, most dense)" +"cbssuitabilityhaiti","okap","aptitude","character","suitability of the site for a wastewater treatment system" +"cbssuitabilityhaiti","okap","zoning","character","group"" if collective or grouped sanitation is possible in short term." +"cbssuitabilityhaiti","okap","latrine","character","Suggested pit latrine and septic allowance (allowed, not allowed)" +"cbssuitabilityhaiti","okap","density_ra","double","Catgoriccal population density according to the description of the variable ""density"" (values from 1 to 5)" +"cbssuitabilityhaiti","okap","economy_nu","double","Categotical socioeconomic status according to the description of the variable ""economy"" (1=low, 2 = medium)" +"cbssuitabilityhaiti","okap","geometry","list","Geospatial data of the neighborhood stored as a polygon" +"choleramalawi","choleramalawi","epi_week","character","Week of the epidemic" +"choleramalawi","choleramalawi","week_start","character","Week of the year" +"choleramalawi","choleramalawi","week","double","Date for the week" +"choleramalawi","choleramalawi","cases","character","No. of recorded cases" +"choleramalawi","choleramalawi","deaths","character","No. of recorded deaths" +"choleramalawi","choleramalawi","c_cases","character","Cumulative cases since the start of the epidemic" +"choleramalawi","choleramalawi","c_deaths","character","Cumulative deaths since the start of the epidemic" +"choleramalawi","choleramalawi","district","character","District of Malawi for which the record is collected" +"ds4owdanalytics","course_participation","duration_minutes","numeric","Minutes spent in the session" +"ds4owdanalytics","course_participation","guest","character","Whether the user is a guest or not. The course instructor and their notetaker is not a guest" +"ds4owdanalytics","course_participation","date","character","Date of the session" +"ds4owdanalytics","course_participation","session","numeric","Session number" +"ds4owdanalytics","course_participation","anonymized_name","character","Anonymized hash of the name as an identifier" +"ds4owdanalytics","ds4owd_browser","browser","character","Browser used to accesss the DS4OWD website" +"ds4owdanalytics","ds4owd_browser","pageviews","numeric","Number of pages viewed" +"ds4owdanalytics","ds4owd_browser","visitors","numeric","Total number of unique visitors" +"ds4owdanalytics","ds4owd_browser","visit_duration","numeric","Duration of visit (seconds)" +"ds4owdanalytics","ds4owd_browser","visits","numeric","Number of non-unique visits to the website" +"ds4owdanalytics","ds4owd_browser","bounce_rate","numeric","Percentage of users ""bouncing"" off website. A bounce is when a visitor spends less than 30 seconds on the website" +"ds4owdanalytics","ds4owd_country","country","character","Country of visit to the website" +"ds4owdanalytics","ds4owd_country","pageviews","numeric","Number of pages viewed" +"ds4owdanalytics","ds4owd_country","visit_duration","numeric","Duration of visit (seconds)" +"ds4owdanalytics","ds4owd_country","visitors","numeric","Total number of unique visitors" +"ds4owdanalytics","ds4owd_country","visits","numeric","Number of non-unique visits to the website" +"ds4owdanalytics","ds4owd_country","bounce_rate","numeric","Percentage of users ""bouncing"" off website. A bounce is when a visitor spends less than 30 seconds on the website" +"ds4owdanalytics","ds4owd_source","source","character","Source of visit (Search engine, organic etc.)" +"ds4owdanalytics","ds4owd_source","pageviews","numeric","Number of pages viewed" +"ds4owdanalytics","ds4owd_source","visit_duration","numeric","Duration of visit (seconds)" +"ds4owdanalytics","ds4owd_source","visitors","numeric","Total number of unique visitors" +"ds4owdanalytics","ds4owd_source","visits","numeric","Number of non-unique visits to the website" +"ds4owdanalytics","ds4owd_source","bounce_rate","numeric","Percentage of users ""bouncing"" off website. A bounce is when a visitor spends less than 30 seconds on the website" +"ds4owdanalytics","ds4owd_timeseries","date","Date","Date of data collection" +"ds4owdanalytics","ds4owd_timeseries","pageviews","numeric","Number of pages viewed" +"ds4owdanalytics","ds4owd_timeseries","visitors","numeric","Total number of unique visitors" +"ds4owdanalytics","ds4owd_timeseries","visit_duration","numeric","Duration of visit (seconds)" +"ds4owdanalytics","ds4owd_timeseries","visits","numeric","Number of non-unique visits to the website" +"ds4owdanalytics","ds4owd_timeseries","bounce_rate","numeric","Percentage of users ""bouncing"" off website. A bounce is when a visitor spends less than 30 seconds on the website" +"ds4owdanalytics","locations","iso_country","character","ISO Name for country of course participant" +"ds4owdanalytics","locations","country","character","Name of country" +"ds4owdanalytics","locations","city","character","Name of city" +"ds4owdanalytics","postsurvey","course_completion","numeric","Whether the course was completed by the respondent or not" +"ds4owdanalytics","postsurvey","rating_overall","numeric","Overall course rating" +"ds4owdanalytics","postsurvey","expectations","character","Expectations from the course" +"ds4owdanalytics","postsurvey","learning_objectives","character","Whether learning objectives were met" +"ds4owdanalytics","postsurvey","rating_structure","numeric","Rating for the structure of the course" +"ds4owdanalytics","postsurvey","rating_ins_knowledge","numeric","Rating for the instructor's knowledge of the course material" +"ds4owdanalytics","postsurvey","rating_ins_clarity","numeric","Rating for the instructor's clarity" +"ds4owdanalytics","postsurvey","rating_ins_comp","numeric","Rating for the instructor's competency" +"ds4owdanalytics","postsurvey","rating_ins_app","numeric","Rating for approachability of the instructor" +"ds4owdanalytics","postsurvey","feedback","character","Feedback for the course" +"ds4owdanalytics","postsurvey","rating_self_r_comp","numeric","Self rating for R competency" +"ds4owdanalytics","postsurvey","rating_self_vc_comp","numeric","Self rating for version control competency" +"ds4owdanalytics","postsurvey","conf_skill_app","numeric","Confidence in applying skills learned during the course" +"ds4owdanalytics","postsurvey","most_liked","character","Most liked aspects of the course" +"ds4owdanalytics","postsurvey","least_liked","character","Least liked aspects of the course" +"ds4owdanalytics","postsurvey","suggestion","character","Suggestions for the course" +"ds4owdanalytics","postsurvey","other_comments","character","Any other comments" +"ds4owdanalytics","postsurvey","reason_non_participation","logical","If course was not completed" +"ds4owdanalytics","presurvey","id","character","ID of survey response" +"ds4owdanalytics","presurvey","google_timestamp","POSIXct", +"ds4owdanalytics","presurvey","zoom_timestamp","POSIXct", +"ds4owdanalytics","presurvey","prog_exp","character","Previous programming experience" +"ds4owdanalytics","presurvey","prog_exp_r","character","Previous programming experience in R" +"ds4owdanalytics","presurvey","prog_ease_max_list","character","Ease of programming" +"ds4owdanalytics","presurvey","data_format","character","Format of data" +"ds4owdanalytics","presurvey","current_use_llm","character","Current level of LLM usage" +"ds4owdanalytics","presurvey","work_organisation","character","Organisation type where participant works" +"ds4owdanalytics","presurvey","barrier_time_availability","character","If time availability is a barrier to learning" +"ds4owdanalytics","presurvey","barrier_supervisor_interests","character","If supervisor's interest is a barrier to learning" +"ds4owdanalytics","presurvey","barrier_internet_connection","character","If internet connection is a barrier to learning" +"ds4owdanalytics","presurvey","barrier_electricity","character","If electricity availability is a barrier to learning" +"ds4owdanalytics","presurvey","barrier_computer","character","If availability of a compiuter is a barrier to learning" +"ds4owdanalytics","presurvey","interest_share_dataset","character","If interested in sharing a dataset" +"ds4owdanalytics","publishing_metadata","id","numeric","Identifier of dataset" +"ds4owdanalytics","publishing_metadata","pkg_name","character","Name of the package" +"ds4owdanalytics","publishing_metadata","maintainer","character","Github ID of maintainer" +"ds4owdanalytics","publishing_metadata","source","character","Source of data" +"ds4owdanalytics","publishing_metadata","difficulty","character","Difficult of cleaning data" +"ds4owdanalytics","publishing_metadata","status","character","Current status" +"ds4owdanalytics","publishing_metadata","description","character","Description of data package" +"ds4owdanalytics","publishing_metadata","location","character","Location of data in the package" +"ds4owdanalytics","publishing_metadata","date_published","POSIXct","Date of publication" +"ds4owdanalytics","publishing_metadata","link_github","character","Link to github repo" +"ds4owdanalytics","publishing_metadata","link_pkg_website","character","Link to package website" +"ds4owdanalytics","publishing_metadata","doi","character","Zenodo DOI of package" +"ds4owdanalytics","publishing_metadata","temporal_coverage","logical","Temporal coverage of data" +"ds4owdanalytics","publishing_metadata","keywords","character","Keywords to identify data" +"fecalcanuga","containment","sample_id","factor","unique identifier for each sampling location in the format ##-Location-ddmmyyyy" +"fecalcanuga","containment","location_id","factor","unique location identifier for each sampling day in the format of (#)-day of sampling (a) - location in that day" +"fecalcanuga","containment","date","POSIXct","date of sampling" +"fecalcanuga","containment","area","numeric","surface area of liquid surface in containment m^2" +"fecalcanuga","containment","sludge_depth","numeric","depth in meters, of where from the top of the sludge the sample was taken" +"fecalcanuga","containment","containment_depth","numeric","depth, in meters, from the top of the containment to the bottom of the containment" +"fecalcanuga","containment","containment_volume","numeric","total volume of the containment in m^3" +"fecalcanuga","containment","fs_volume","numeric","total volume of the sludge in containment in m^3" +"fecalcanuga","containment","accumulation_rate","numeric","the accumulation rate in litres/capita -year (based on total volume and number of users)" +"fecalcanuga","containment","scum_depth","numeric","the depth of the top scum layer in centimeters" +"fecalcanuga","household_survey","sample_id","factor","unique identifier for each sampling location in the format ##-Location-ddmmyyyy" +"fecalcanuga","household_survey","location_id","factor","unique location identifier for each sampling day in the format of (#)-day of sampling (a) - location in that day" +"fecalcanuga","household_survey","date","POSIXct","date of sampling" +"fecalcanuga","household_survey","local_area_name","factor","community / area name that locals commonly use where samples were taken" +"fecalcanuga","household_survey","establishment_type","factor","type of establishment where sampling occurred (household, commercial, school, office building, other)" +"fecalcanuga","household_survey","users","numeric","average number of users for the sanitation system that was sampled" +"fecalcanuga","household_survey","last_emptied","numeric","in years how long ago from sampling date the containment was last emptied" +"fecalcanuga","household_survey","shared_toilet","factor","Is the toilet(s) connected to the sanitation containment shared or not (Yes/No)" +"fecalcanuga","household_survey","rent_or_own","factor","Is the establishment where the containment is rented or owned by the head of household?" +"fecalcanuga","household_survey","containment","factor","The type of containment (septic tank, pit latrine, treatment plant unit, etc.)" +"fecalcanuga","household_survey","lining","factor","The type of containment lining (fully lined, unlined, don't know)" +"fecalcanuga","household_survey","lining_material","factor","The material the lining is made of if it is lined (fiberglass, concrete, PVC, unlined, etc.)" +"fecalcanuga","household_survey","change_in_liquid_level","factor","Is there a change in liquid level due to seasonal variation (Y/N)" +"fecalcanuga","household_survey","baffles","factor","Are there baffles in the containment (Y/N/I don't know)" +"fecalcanuga","household_survey","outflow","factor","Is there an outflow for the containment (Y/N/I don't know)" +"fecalcanuga","household_survey","outflow_location","factor","If there is an outflow, where is it located (i.e., leech field)" +"fecalcanuga","household_survey","toilet_type","factor","What is the type of toilet connected to the sanitation system (cistern flush, pour-flush, etc.)" +"fecalcanuga","household_survey","anal_cleansing_material","factor","What type of material is used for anal cleansing (water, paper, both)" +"fecalcanuga","household_survey","paper","numeric","Is paper used for anal cleansing (Yes = 1 | No = 0)" +"fecalcanuga","household_survey","water","numeric","Is water used for anal cleansing (Yes = 1 | No = 0)" +"fecalcanuga","household_survey","additives","factor","Are there additives added to the containment (Y/N/I don't know)" +"fecalcanuga","household_survey","frequency","factor","If additives are added, in what frequency?" +"fecalcanuga","household_survey","chemicals","factor","What chemicals are added to the sanitation system?" +"fecalcanuga","household_survey","wastewater_type","factor","What are the types of wastewater that the containment collects (toilet, kitchen, laundry, bathing)" +"fecalcanuga","household_survey","toilet","numeric","Does the containment collect this type of wastewater (Yes = 1 | No = 0)" +"fecalcanuga","household_survey","bathing","numeric","Does the containment collect this type of wastewater (Yes = 1 | No = 0)" +"fecalcanuga","household_survey","laundry","numeric","Does the containment collect this type of wastewater (Yes = 1 | No = 0)" +"fecalcanuga","household_survey","kitchen","numeric","Does the containment collect this type of wastewater (Yes = 1 | No = 0)" +"fecalcanuga","household_survey","water_connection","factor","What type of water connection does the establishment where sampling is occurring have (tap inside building, standpipe, other)?" +"fecalcanuga","household_survey","tap_inside_building","numeric","Does the establishment have this type of water connection (Yes = 1 | No = 0)" +"fecalcanuga","household_survey","standpipe","numeric","Does the establishment have this type of water connection (Yes = 1 | No = 0)" +"fecalcanuga","household_survey","containment_age","factor","What is the age (in years) of the containment system?" +"fecalcanuga","household_survey","containment_constructed","factor","Who constructed the containment system (Technician, professional engineering, myself, don't know)?" +"fecalcanuga","household_survey","containment_volume","numeric","What (in m^3) is the total volume of the containment?" +"fecalcanuga","household_survey","fully_emptied","factor","When the system was last emptied was it emptied fully? (Y/N/I don't know)" +"fecalcanuga","household_survey","emptying_interval","numeric","What is the average / typical emptying interval (in years) of the containment?" +"fecalcanuga","household_survey","rainy_season","factor","Is it currently the rainy season? (Y/N)" +"fecalcanuga","household_survey","solid_waste","factor","Does the containment contain solid waste (i.e., garbage) (Y/N)" +"fecalcanuga","household_survey","type","factor","If there is solid waste, what type is it?" +"fecalcanuga","phys_chem_parameter","sample_id","factor","unique identifier for each sampling location in the format ##-Location-ddmmyyyy" +"fecalcanuga","phys_chem_parameter","location_id","factor","unique location identifier for each sampling day in the format of (#)-day of sampling (a) - location in that day" +"fecalcanuga","phys_chem_parameter","date","POSIXct","date of sampling" +"fecalcanuga","phys_chem_parameter","depth_id","factor","unique identifier for each sample indicating the location in the containment (T = top, M = middle, B = bottom)" +"fecalcanuga","phys_chem_parameter","sludge_depth","numeric","depth in meters, of where from the top of the sludge the sample was taken" +"fecalcanuga","phys_chem_parameter","temperature","numeric","Temperature of the sludge at the insitu sampling location (in degrees Celsius)" +"fecalcanuga","phys_chem_parameter","DO","numeric","dissolved oxygen concentration in mg/L at the insitu sampling location" +"fecalcanuga","phys_chem_parameter","pH","numeric","pH value at the insitu sampling location" +"fecalcanuga","phys_chem_parameter","ORP","numeric","oxidation reduction potential, measured in millivolts, at the insitu sampling locations" +"fecalcanuga","phys_chem_parameter","EC","numeric","electrical conductivity, measured in microSiemens, at the insitu sampling locations" +"fecalcanuga","phys_chem_parameter","COD","numeric","Chemical oxygen demand, mg/L" +"fecalcanuga","phys_chem_parameter","soluble_COD","numeric","Soluble chemical oxygen demand, mg/L" +"fecalcanuga","phys_chem_parameter","sulphide","numeric","Sulphide, mg/L" +"fecalcanuga","phys_chem_parameter","total_nitrogen","numeric","Total Nitrogen, mg/L" +"fecalcanuga","phys_chem_parameter","nitrite","numeric","Nitrite, mg/L" +"fecalcanuga","phys_chem_parameter","nitrate","numeric","Nitrate, mg/L" +"fecalcanuga","phys_chem_parameter","ammonia","numeric","Ammonia, mg/L" +"fecalcanuga","phys_chem_parameter","TKN","numeric","Total Kjeldahl Nitrogen, mg/L" +"fecalcanuga","phys_chem_parameter","ortho_phosphorous","numeric","Ortho Phosphorous, mg/L" +"fecalcanuga","phys_chem_parameter","total_phosphorous","numeric","Total Phosphorous, mg/L" +"fecalcanuga","phys_chem_parameter","BOD","numeric","Biochemical oxygen demand, mg/L" +"fecalcanuga","phys_chem_parameter","TOC","numeric","Total organic carbon, mg/L" +"fecalcanuga","phys_chem_parameter","ts","numeric","Total solids, g/L" +"fecalcanuga","phys_chem_parameter","vs","numeric","Volatile Solids, g/L" +"fecalcanuga","phys_chem_parameter","vs_percent","numeric","Volatile Solids, % total solids" +"fecalcanuga","phys_chem_parameter","sand_content","numeric","Sand content, g/L" +"fecalcanuga","phys_chem_parameter","tss","numeric","Total suspended solids, g/L" +"fecalcanuga","phys_chem_parameter","vss","numeric","Volatile suspended solids, g/L" +"fecalcanuga","phys_chem_parameter","vss_tss","numeric","VSS/TSS (ratio)" +"floodchlorinationsurvey","floodchlorinationsurvey","submitted_on","character","Date when the data was submitted" +"floodchlorinationsurvey","floodchlorinationsurvey","water_point_name","character","Name of the water point" +"floodchlorinationsurvey","floodchlorinationsurvey","latitude","numeric","Latitude coordinate of the water point" +"floodchlorinationsurvey","floodchlorinationsurvey","longitude","numeric","Longitude coordinate of the water point" +"floodchlorinationsurvey","floodchlorinationsurvey","chlorination_rehab_date","character","Date chlorination or rehabilitation was conducted" +"floodchlorinationsurvey","floodchlorinationsurvey","community_mobilised","character","Indicates whether the community was mobilized for support" +"floodchlorinationsurvey","floodchlorinationsurvey","functional_status_before","character","Functional status of the water point before intervention" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_bolts_nuts","character","Condition rating of bolts and nuts" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_compression_cone","character","Condition rating of the compression cone" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_cylinder","character","Condition rating of the cylinder" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_flapper","character","Condition rating of the flapper" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_footvalve_bobbin","character","Condition rating of the footvalve bobbin" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_footvalve_body","character","Condition rating of the footvalve body" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_footvalve_oring","character","Condition rating of the footvalve O ring" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_fulcrum_pin","character","Condition rating of the fulcrum pin" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_fulcrum_bearings","character","Condition rating of the fulcrum pin bush bearings" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_handle","character","Condition rating of the pump handle" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_hanger_pin","character","Condition rating of the hanger pin" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_hanger_bearings","character","Condition rating of the hanger pin bush bearings" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_head_bolt","character","Condition rating of the head bolt" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_plunger_bobbin","character","Condition rating of the plunger bobbin" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_plunger_body","character","Condition rating of the plunger body" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_plunger_useal","character","Condition rating of the plunger U seal" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_pump_head_case","character","Condition rating of the pump head case" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_pump_head_cover","character","Condition rating of the pump head cover" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_rising_main","numeric","Condition rating of the rising main pipe" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_rising_centralisers","character","Condition rating of rising main centralisers" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_rods","character","Condition rating of connecting rods" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_rod_centralisers","character","Condition rating of rod centralisers" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_rodhanger","character","Condition rating of the rod hanger" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_rope","character","Condition rating of the rope" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_socket","character","Condition rating of the socket" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_steel_cone","character","Condition rating of the steel cone" +"floodchlorinationsurvey","floodchlorinationsurvey","rating_top_sleeve","character","Condition rating of the top sleeve" +"floodchlorinationsurvey","floodchlorinationsurvey","rod_count","numeric","Number of rods in the borehole" +"floodchlorinationsurvey","floodchlorinationsurvey","broken_parts_fished_out","character","Indicates whether broken parts were retrieved from the borehole" +"floodchlorinationsurvey","floodchlorinationsurvey","broken_parts_comments","character","Comments on the broken parts retrieved" +"floodchlorinationsurvey","floodchlorinationsurvey","silt_observed","character","Presence of silt on parts (Yes/No)" +"floodchlorinationsurvey","floodchlorinationsurvey","corrosion_observed","character","Presence of corrosion on parts (Yes/No)" +"floodchlorinationsurvey","floodchlorinationsurvey","slime_observed","character","Presence of slime buildup on parts (Yes/No)" +"floodchlorinationsurvey","floodchlorinationsurvey","rising_main_length_m","numeric","Length of the rising main pipe in meters" +"floodchlorinationsurvey","floodchlorinationsurvey","rope_attached","character","Indicates whether a rope was attached to the rising main" +"floodchlorinationsurvey","floodchlorinationsurvey","photos_of_removed_parts","character","URLs or filenames of photos showing removed parts" +"floodchlorinationsurvey","floodchlorinationsurvey","pedestal_condition","character","General condition of the pedestal" +"floodchlorinationsurvey","floodchlorinationsurvey","pedestal_firm","character","Is the pedestal held firmly in place?" +"floodchlorinationsurvey","floodchlorinationsurvey","photos_of_civil_work","character","URLs or filenames of photos showing surrounding infrastructure" +"floodchlorinationsurvey","floodchlorinationsurvey","latrines_within_30m","character","Presence of latrines within 30m of the water point" +"floodchlorinationsurvey","floodchlorinationsurvey","latrines_within_100m","character","Presence of latrines within 100m of the water point" +"floodchlorinationsurvey","floodchlorinationsurvey","cemetery_within_30m","character","Presence of cemetery within 30m" +"floodchlorinationsurvey","floodchlorinationsurvey","waste_dumps_within_30m","character","Presence of waste dumps within 30m" +"floodchlorinationsurvey","floodchlorinationsurvey","difficult_access_by_car","character","Whether the site is difficult to reach by car" +"floodchlorinationsurvey","floodchlorinationsurvey","chlorination_done","character","Indicates whether chlorination was conducted" +"floodchlorinationsurvey","floodchlorinationsurvey","parts_chlorinated","character","Indicates whether the parts were chlorinated" +"floodchlorinationsurvey","floodchlorinationsurvey","parts_chlorinated_unknown","logical","TRUE if unsure whether parts were chlorinated" +"floodchlorinationsurvey","floodchlorinationsurvey","borehole_depth_m","numeric","Total depth of the borehole in meters" +"floodchlorinationsurvey","floodchlorinationsurvey","water_depth_m","numeric","Depth of water in the borehole in meters" +"floodchlorinationsurvey","floodchlorinationsurvey","chlorine_water_buckets","numeric","Number of 20L buckets of chlorine-treated water used" +"floodchlorinationsurvey","floodchlorinationsurvey","hth_dissolved_properly","character","Whether 1g of HTH was dissolved for every 20L of water" +"floodchlorinationsurvey","floodchlorinationsurvey","chlorinated_parts_installed","character","Were chlorinated parts reinstalled after treatment?" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rising_main_length_m","numeric","Length of rising main pipe replaced (m)" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rod_count","numeric","Number of rods replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_bolts_nuts_tick","logical","TRUE if bolts and nuts were replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_bolts_nuts_count","numeric","Number of bolts and nuts replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_compression_cone_tick","logical","TRUE if compression cone was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_compression_cone_count","numeric","Number of compression cones replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_cylinder_tick","logical","TRUE if cylinder was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_cylinder_count","numeric","Number of cylinders replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_flapper_tick","logical","TRUE if flapper was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_flapper_count","numeric","Number of flappers replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_footvalve_bobbin_tick","logical","TRUE if footvalve bobbin was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_footvalve_bobbin_count","numeric","Number of footvalve bobbins replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_footvalve_body_tick","logical","TRUE if footvalve body was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_footvalve_body_count","numeric","Number of footvalve bodies replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_footvalve_oring_tick","logical","TRUE if footvalve O-ring was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_footvalve_oring_count","numeric","Number of O-rings replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_fulcrum_pin_tick","logical","TRUE if fulcrum pin was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_fulcrum_pin_count","numeric","Number of fulcrum pins replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_fulcrum_bearings_tick","logical","TRUE if fulcrum bearings were replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_fulcrum_bearings_count","numeric","Number of fulcrum bearings replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_handle_tick","logical","TRUE if handle was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_handle_count","numeric","Number of handles replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_hanger_pin_tick","logical","TRUE if hanger pin was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_hanger_pin_count","numeric","Number of hanger pins replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_hanger_bearings_tick","logical","TRUE if hanger bearings were replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_hanger_bearings_count","numeric","Number of hanger bearings replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_head_bolt_tick","logical","TRUE if head bolt was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_head_bolt_count","numeric","Number of head bolts replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_plunger_bobbin_tick","logical","TRUE if plunger bobbin was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_plunger_bobbin_count","numeric","Number of plunger bobbins replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_plunger_body_tick","logical","TRUE if plunger body was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_plunger_body_count","numeric","Number of plunger bodies replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_plunger_useal_tick","logical","TRUE if plunger U-seal was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_plunger_useal_count","numeric","Number of U-seals replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_pump_head_case_tick","logical","TRUE if pump head case was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_pump_head_case_count","numeric","Number of pump head cases replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_pump_head_cover_tick","logical","TRUE if pump head cover was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_pump_head_cover_count","numeric","Number of pump head covers replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rising_main_tick","logical","TRUE if rising main pipe was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rising_main_count","numeric","Number of rising main pipes replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rising_centralisers_tick","logical","TRUE if rising main centralisers were replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rising_centralisers_count","numeric","Number of centralisers replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rods_tick","logical","TRUE if rods were replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rods_count","numeric","Number of rods replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rod_centralisers_tick","logical","TRUE if rod centralisers were replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rod_centralisers_count","numeric","Number of rod centralisers replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rodhanger_tick","logical","TRUE if rodhanger was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rodhanger_count","numeric","Number of rodhangers replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rope_tick","logical","TRUE if rope was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_rope_count","numeric","Number of ropes replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_socket_tick","logical","TRUE if socket was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_socket_count","numeric","Number of sockets replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_steel_cone_tick","logical","TRUE if steel cone was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_steel_cone_count","numeric","Number of steel cones replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_top_sleeve_tick","logical","TRUE if top sleeve was replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","replaced_top_sleeve_count","numeric","Number of top sleeves replaced" +"floodchlorinationsurvey","floodchlorinationsurvey","functionality_after","character","Functional status of the water point after intervention" +"floodchlorinationsurvey","floodchlorinationsurvey","time_to_fill_20l_bucket","numeric","Time (in seconds) it took to fill a 20L bucket" +"floodchlorinationsurvey","floodchlorinationsurvey","strokes_to_yield_water","numeric","Number of strokes required to yield water from the pump" +"fslogisticskampala","trips","fid","integer","Running ID for each recorded GPS location of a truck." +"fslogisticskampala","trips","numberplate","character","Numberplate of the truck, can be joined with `trucks` resource." +"fslogisticskampala","trips","date","Date","Date of the record in ISO 8601 format." +"fslogisticskampala","trips","time","hms","Time of the record in hours, minutes, seconds." +"fslogisticskampala","trips","lat","numeric","Latitude of the record." +"fslogisticskampala","trips","lon","numeric","Longitude of the record." +"fslogisticskampala","trips","plant","character","Treatment plant that the truck delivered faecal sludge to." +"fslogisticskampala","trucks","numberplate","character","Numberplate of the truck, can be joined with `trips` resource." +"fslogisticskampala","trucks","volume","numeric","Volume of the truck in cubic meters." +"fsmglobal","fsmglobal","iso3c","character","International Standards Organization (ISO) 3-digit alphabetic codes." +"fsmglobal","fsmglobal","country","character","Name of the country." +"fsmglobal","fsmglobal","emptying_method","character","Type of faecal sludge emptying method for corresponding population in `population_emptying_method`." +"fsmglobal","fsmglobal","population_2017","numeric","Total country population in 2017." +"fsmglobal","fsmglobal","population_emptying_method","numeric","Total population requiring faecal sludge emptying services for type of method identified in `emptying_method`." +"fsmglobal","fsmglobal","count_pits_septics","numeric","Total number of pit latrines and septic tanks in country." +"fsmglobal","fsmglobal","emptying_demand","numeric","Emptying demand as the proportion of `population_emptying_method` / `population_2017`." +"fsmglobal","fsmglobal","urban_demand","numeric","Proportion of urban population." +"fsmglobal","fsmglobal","rural_demand","numeric","Proportion of rural population." +"gdho","gdho","id","integer","A unique Id for each organisation" +"gdho","gdho","year","integer","Latest year information is available for" +"gdho","gdho","name","character","Full organisation name" +"gdho","gdho","abbreviated_name","character","Organisation abbreviation or acronym" +"gdho","gdho","type","integer","National NGO (NNGO), International NGO (INGO), UN, Red Cross/Crescent classification" +"gdho","gdho","international_or_national","integer","Organisation’s reach" +"gdho","gdho","website","character","Organisation page url" +"gdho","gdho","hq_location","character","Country where HQ office is located" +"gdho","gdho","year_founded","integer","Year of establishment" +"gdho","gdho","year_closed","integer","Year closed or last year of visible activity" +"gdho","gdho","countries_of_operation_count","integer","Number of countries operational in" +"gdho","gdho","sector","integer","Children/youth, coordination, disabilities, education, environment, food security/agriculture, health, landmines, livelihoods, logistics/communications, nutrition, refugees, shelter, veterinary, water/sanitation, women" +"gdho","gdho","religious_or_secular","integer","Organisations religious affiliation" +"gdho","gdho","religion","character","Specific religious affiliation (ex. Catholic, Islamic, Jewish)" +"gdho","gdho","red_cross_code_of_conduct_signatory","integer","Signatory status of the organisation" +"gdho","gdho","chs_member","integer","Signatory status to the Core Humanitarian Standard on Quality and Accountability " +"gdho","gdho","interaction_member","integer","Membership status" +"gdho","gdho","icva_member","integer","Membership status" +"gdho","gdho","staff","integer","Actual number of total staff" +"gdho","gdho","staff_imputed","character","Imputed number of total staff" +"gdho","gdho","natl","integer","Actual number of national staff" +"gdho","gdho","natl_imputed","character","Imputed number of national staff" +"gdho","gdho","intl","integer","Actual number of international staff" +"gdho","gdho","intl_imputed","character","Imputed number of international staff" +"gdho","gdho","percent_intl","double","Percent of total staff that are international" +"gdho","gdho","ope_approx_usd","double","Actual approximate annual operational program expenditure in USD" +"gdho","gdho","ope_imputed","character","Imputed approximate annual operational program expenditure in USD" +"gdho","gdho","ope/staff","double","Percent of operational program expenditure per staff member" +"gdho","gdho","ope_inflation_adjusted","double","Operational program expenditure adjusted for inflation" +"gdho","gdho","ope_original_currency","character","Actual approximate operational program expenditure in original currency used by organisation" +"gdho","gdho","ope_original_amount","character","Operational program expenditure amount in original currency" +"gdho","gdho","ope_original_currency_code","character","Currency code for operational program expenditure" +"gdho","gdho","humexp_approx_usd","double","Approximate humanitarian expenditure in USD" +"gdho","gdho","humexp_imputed","character","Imputed approximate humanitarian expenditure in USD" +"gdho","gdho","humexp_inflation_adjusted","double","Approximate humanitarian expenditure adjusted for inflation" +"gdho","gdho_full","id","integer","A unique Id for each organisation" +"gdho","gdho_full","year","integer","Latest year information is available for" +"gdho","gdho_full","name","character","Full organisation name" +"gdho","gdho_full","abbreviated_name","character","Organisation abbreviation or acronym" +"gdho","gdho_full","type","integer","National NGO (NNGO), International NGO (INGO), UN, Red Cross/Crescent classification" +"gdho","gdho_full","international_or_national","integer","Organisation’s reach" +"gdho","gdho_full","website","character","Organisation page url" +"gdho","gdho_full","hq_location","character","Country where HQ office is located" +"gdho","gdho_full","year_founded","integer","Year of establishment" +"gdho","gdho_full","year_closed","integer","Year closed or last year of visible activity" +"gdho","gdho_full","countries_of_operation_count","integer","Number of countries operational in" +"gdho","gdho_full","sector","integer","Children/youth, coordination, disabilities, education, environment, food security/agriculture, health, landmines, livelihoods, logistics/communications, nutrition, refugees, shelter, veterinary, water/sanitation, women" +"gdho","gdho_full","religious_or_secular","integer","Organisations religious affiliation" +"gdho","gdho_full","religion","character","Specific religious affiliation (ex. Catholic, Islamic, Jewish)" +"gdho","gdho_full","red_cross_code_of_conduct_signatory","integer","Signatory status of the organisation" +"gdho","gdho_full","chs_member","integer","Signatory status to the Core Humanitarian Standard on Quality and Accountability " +"gdho","gdho_full","interaction_member","integer","Membership status" +"gdho","gdho_full","icva_member","integer","Membership status" +"gdho","gdho_full","staff","integer","Actual number of total staff" +"gdho","gdho_full","staff_imputed","character","Imputed number of total staff" +"gdho","gdho_full","natl","integer","Actual number of national staff" +"gdho","gdho_full","natl_imputed","character","Imputed number of national staff" +"gdho","gdho_full","intl","integer","Actual number of international staff" +"gdho","gdho_full","intl_imputed","character","Imputed number of international staff" +"gdho","gdho_full","percent_intl","double","Percent of total staff that are international" +"gdho","gdho_full","ope_approx_usd","double","Actual approximate annual operational program expenditure in USD" +"gdho","gdho_full","ope_imputed","character","Imputed approximate annual operational program expenditure in USD" +"gdho","gdho_full","ope/staff","double","Percent of operational program expenditure per staff member" +"gdho","gdho_full","ope_inflation_adjusted","double","Operational program expenditure adjusted for inflation" +"gdho","gdho_full","ope_original_currency","character","Actual approximate operational program expenditure in original currency used by organisation" +"gdho","gdho_full","ope_original_amount","character","Operational program expenditure amount in original currency" +"gdho","gdho_full","ope_original_currency_code","character","Currency code for operational program expenditure" +"gdho","gdho_full","humexp_approx_usd","double","Approximate humanitarian expenditure in USD" +"gdho","gdho_full","humexp_imputed","character","Imputed approximate humanitarian expenditure in USD" +"gdho","gdho_full","humexp_inflation_adjusted","double","Approximate humanitarian expenditure adjusted for inflation" +"gdho","gdho_full","afghanistan","integer","Country operational presence indicator" +"gdho","gdho_full","albania","integer","Country operational presence indicator" +"gdho","gdho_full","algeria","integer","Country operational presence indicator" +"gdho","gdho_full","american_samoa","integer","Country operational presence indicator" +"gdho","gdho_full","andorra","integer","Country operational presence indicator" +"gdho","gdho_full","angola","integer","Country operational presence indicator" +"gdho","gdho_full","anguilla","integer","Country operational presence indicator" +"gdho","gdho_full","antarctica","integer","Country operational presence indicator" +"gdho","gdho_full","antigua_and_barbuda","integer","Country operational presence indicator" +"gdho","gdho_full","argentina","integer","Country operational presence indicator" +"gdho","gdho_full","armenia","integer","Country operational presence indicator" +"gdho","gdho_full","aruba","integer","Country operational presence indicator" +"gdho","gdho_full","australia","integer","Country operational presence indicator" +"gdho","gdho_full","austria","integer","Country operational presence indicator" +"gdho","gdho_full","azerbaijan","integer","Country operational presence indicator" +"gdho","gdho_full","bahamas","integer","Country operational presence indicator" +"gdho","gdho_full","bahrain","integer","Country operational presence indicator" +"gdho","gdho_full","bangladesh","integer","Country operational presence indicator" +"gdho","gdho_full","barbados","integer","Country operational presence indicator" +"gdho","gdho_full","belarus","integer","Country operational presence indicator" +"gdho","gdho_full","belgium","integer","Country operational presence indicator" +"gdho","gdho_full","belize","integer","Country operational presence indicator" +"gdho","gdho_full","benin","integer","Country operational presence indicator" +"gdho","gdho_full","bermuda","integer","Country operational presence indicator" +"gdho","gdho_full","bhutan","integer","Country operational presence indicator" +"gdho","gdho_full","bolivia","integer","Country operational presence indicator" +"gdho","gdho_full","bosnia_and_herzegovina","integer","Country operational presence indicator" +"gdho","gdho_full","botswana","integer","Country operational presence indicator" +"gdho","gdho_full","bouvet_island","integer","Country operational presence indicator" +"gdho","gdho_full","brazil","integer","Country operational presence indicator" +"gdho","gdho_full","british_indian_ocean_territory","integer","Country operational presence indicator" +"gdho","gdho_full","brunei_darussalam","integer","Country operational presence indicator" +"gdho","gdho_full","bulgaria","integer","Country operational presence indicator" +"gdho","gdho_full","burkina_faso","integer","Country operational presence indicator" +"gdho","gdho_full","burundi","integer","Country operational presence indicator" +"gdho","gdho_full","cambodia","integer","Country operational presence indicator" +"gdho","gdho_full","cameroon","integer","Country operational presence indicator" +"gdho","gdho_full","canada","integer","Country operational presence indicator" +"gdho","gdho_full","cape_verde","integer","Country operational presence indicator" +"gdho","gdho_full","cayman_islands","integer","Country operational presence indicator" +"gdho","gdho_full","central_african_republic","integer","Country operational presence indicator" +"gdho","gdho_full","chad","integer","Country operational presence indicator" +"gdho","gdho_full","chile","integer","Country operational presence indicator" +"gdho","gdho_full","china","integer","Country operational presence indicator" +"gdho","gdho_full","christmas_island","integer","Country operational presence indicator" +"gdho","gdho_full","cocos_keeling_islands","integer","Country operational presence indicator" +"gdho","gdho_full","colombia","integer","Country operational presence indicator" +"gdho","gdho_full","comoros","integer","Country operational presence indicator" +"gdho","gdho_full","congo","integer","Country operational presence indicator" +"gdho","gdho_full","cook_islands","integer","Country operational presence indicator" +"gdho","gdho_full","costa_rica","integer","Country operational presence indicator" +"gdho","gdho_full","cote_d'ivoire","integer","Country operational presence indicator" +"gdho","gdho_full","croatia","integer","Country operational presence indicator" +"gdho","gdho_full","cuba","integer","Country operational presence indicator" +"gdho","gdho_full","cyprus","integer","Country operational presence indicator" +"gdho","gdho_full","czech_republic","integer","Country operational presence indicator" +"gdho","gdho_full","denmark","integer","Country operational presence indicator" +"gdho","gdho_full","djibouti","integer","Country operational presence indicator" +"gdho","gdho_full","dominica","integer","Country operational presence indicator" +"gdho","gdho_full","dominican_republic","integer","Country operational presence indicator" +"gdho","gdho_full","dr_congo","integer","Country operational presence indicator" +"gdho","gdho_full","ecuador","integer","Country operational presence indicator" +"gdho","gdho_full","egypt","integer","Country operational presence indicator" +"gdho","gdho_full","el_salvador","integer","Country operational presence indicator" +"gdho","gdho_full","equatorial_guinea","integer","Country operational presence indicator" +"gdho","gdho_full","eritrea","integer","Country operational presence indicator" +"gdho","gdho_full","estonia","integer","Country operational presence indicator" +"gdho","gdho_full","ethiopia","integer","Country operational presence indicator" +"gdho","gdho_full","falkland_islands_malvinas","integer","Country operational presence indicator" +"gdho","gdho_full","faroe_islands","integer","Country operational presence indicator" +"gdho","gdho_full","fiji","integer","Country operational presence indicator" +"gdho","gdho_full","finland","integer","Country operational presence indicator" +"gdho","gdho_full","france","integer","Country operational presence indicator" +"gdho","gdho_full","french_guiana","integer","Country operational presence indicator" +"gdho","gdho_full","french_polynesia","integer","Country operational presence indicator" +"gdho","gdho_full","french_southern_territories","integer","Country operational presence indicator" +"gdho","gdho_full","gabon","integer","Country operational presence indicator" +"gdho","gdho_full","gambia","integer","Country operational presence indicator" +"gdho","gdho_full","georgia","integer","Country operational presence indicator" +"gdho","gdho_full","germany","integer","Country operational presence indicator" +"gdho","gdho_full","ghana","integer","Country operational presence indicator" +"gdho","gdho_full","gibraltar","integer","Country operational presence indicator" +"gdho","gdho_full","greece","integer","Country operational presence indicator" +"gdho","gdho_full","greenland","integer","Country operational presence indicator" +"gdho","gdho_full","grenada","integer","Country operational presence indicator" +"gdho","gdho_full","guadeloupe","integer","Country operational presence indicator" +"gdho","gdho_full","guam","integer","Country operational presence indicator" +"gdho","gdho_full","guatemala","integer","Country operational presence indicator" +"gdho","gdho_full","guinea","integer","Country operational presence indicator" +"gdho","gdho_full","guinea-bissau","integer","Country operational presence indicator" +"gdho","gdho_full","guyana","integer","Country operational presence indicator" +"gdho","gdho_full","haiti","integer","Country operational presence indicator" +"gdho","gdho_full","heard_island_and_mcdonald_islands","integer","Country operational presence indicator" +"gdho","gdho_full","holy_see_vatican_city_state","integer","Country operational presence indicator" +"gdho","gdho_full","honduras","integer","Country operational presence indicator" +"gdho","gdho_full","hong_kong","integer","Country operational presence indicator" +"gdho","gdho_full","hungary","integer","Country operational presence indicator" +"gdho","gdho_full","iceland","integer","Country operational presence indicator" +"gdho","gdho_full","india","integer","Country operational presence indicator" +"gdho","gdho_full","indonesia","integer","Country operational presence indicator" +"gdho","gdho_full","iran_islamic_republic_of","integer","Country operational presence indicator" +"gdho","gdho_full","iraq","integer","Country operational presence indicator" +"gdho","gdho_full","ireland","integer","Country operational presence indicator" +"gdho","gdho_full","israel","integer","Country operational presence indicator" +"gdho","gdho_full","italy","integer","Country operational presence indicator" +"gdho","gdho_full","jamaica","integer","Country operational presence indicator" +"gdho","gdho_full","japan","integer","Country operational presence indicator" +"gdho","gdho_full","jordan","integer","Country operational presence indicator" +"gdho","gdho_full","kazakhstan","integer","Country operational presence indicator" +"gdho","gdho_full","kenya","integer","Country operational presence indicator" +"gdho","gdho_full","kiribati","integer","Country operational presence indicator" +"gdho","gdho_full","korea_democratic_people's_republic_of","integer","Country operational presence indicator" +"gdho","gdho_full","korea_republic_of","integer","Country operational presence indicator" +"gdho","gdho_full","kuwait","integer","Country operational presence indicator" +"gdho","gdho_full","kyrgyzstan","integer","Country operational presence indicator" +"gdho","gdho_full","lao_people's_democratic_republic","integer","Country operational presence indicator" +"gdho","gdho_full","latvia","integer","Country operational presence indicator" +"gdho","gdho_full","lebanon","integer","Country operational presence indicator" +"gdho","gdho_full","lesotho","integer","Country operational presence indicator" +"gdho","gdho_full","liberia","integer","Country operational presence indicator" +"gdho","gdho_full","libyan_arab_jamahiriya","integer","Country operational presence indicator" +"gdho","gdho_full","liechtenstein","integer","Country operational presence indicator" +"gdho","gdho_full","lithuania","integer","Country operational presence indicator" +"gdho","gdho_full","luxembourg","integer","Country operational presence indicator" +"gdho","gdho_full","macao","integer","Country operational presence indicator" +"gdho","gdho_full","macedonia_the_former_yugoslav_republic_of","integer","Country operational presence indicator" +"gdho","gdho_full","madagascar","integer","Country operational presence indicator" +"gdho","gdho_full","malawi","integer","Country operational presence indicator" +"gdho","gdho_full","malaysia","integer","Country operational presence indicator" +"gdho","gdho_full","maldives","integer","Country operational presence indicator" +"gdho","gdho_full","mali","integer","Country operational presence indicator" +"gdho","gdho_full","malta","integer","Country operational presence indicator" +"gdho","gdho_full","marshall_islands","integer","Country operational presence indicator" +"gdho","gdho_full","martinique","integer","Country operational presence indicator" +"gdho","gdho_full","mauritania","integer","Country operational presence indicator" +"gdho","gdho_full","mauritius","integer","Country operational presence indicator" +"gdho","gdho_full","mayotte","integer","Country operational presence indicator" +"gdho","gdho_full","mexico","integer","Country operational presence indicator" +"gdho","gdho_full","micronesia_federated_states_of","integer","Country operational presence indicator" +"gdho","gdho_full","moldova_republic_of","integer","Country operational presence indicator" +"gdho","gdho_full","monaco","integer","Country operational presence indicator" +"gdho","gdho_full","mongolia","integer","Country operational presence indicator" +"gdho","gdho_full","montserrat","integer","Country operational presence indicator" +"gdho","gdho_full","morocco","integer","Country operational presence indicator" +"gdho","gdho_full","mozambique","integer","Country operational presence indicator" +"gdho","gdho_full","myanmar","integer","Country operational presence indicator" +"gdho","gdho_full","namibia","integer","Country operational presence indicator" +"gdho","gdho_full","nauru","integer","Country operational presence indicator" +"gdho","gdho_full","nepal","integer","Country operational presence indicator" +"gdho","gdho_full","netherlands","integer","Country operational presence indicator" +"gdho","gdho_full","netherlands_antilles","integer","Country operational presence indicator" +"gdho","gdho_full","new_caledonia","integer","Country operational presence indicator" +"gdho","gdho_full","new_zealand","integer","Country operational presence indicator" +"gdho","gdho_full","nicaragua","integer","Country operational presence indicator" +"gdho","gdho_full","niger","integer","Country operational presence indicator" +"gdho","gdho_full","nigeria","integer","Country operational presence indicator" +"gdho","gdho_full","niue","integer","Country operational presence indicator" +"gdho","gdho_full","norfolk_island","integer","Country operational presence indicator" +"gdho","gdho_full","northern_mariana_islands","integer","Country operational presence indicator" +"gdho","gdho_full","norway","integer","Country operational presence indicator" +"gdho","gdho_full","occupied_palestinian_territories","integer","Country operational presence indicator" +"gdho","gdho_full","oman","integer","Country operational presence indicator" +"gdho","gdho_full","pakistan","integer","Country operational presence indicator" +"gdho","gdho_full","palau","integer","Country operational presence indicator" +"gdho","gdho_full","panama","integer","Country operational presence indicator" +"gdho","gdho_full","papua_new_guinea","integer","Country operational presence indicator" +"gdho","gdho_full","paraguay","integer","Country operational presence indicator" +"gdho","gdho_full","peru","integer","Country operational presence indicator" +"gdho","gdho_full","philippines","integer","Country operational presence indicator" +"gdho","gdho_full","pitcairn","integer","Country operational presence indicator" +"gdho","gdho_full","poland","integer","Country operational presence indicator" +"gdho","gdho_full","portugal","integer","Country operational presence indicator" +"gdho","gdho_full","puerto_rico","integer","Country operational presence indicator" +"gdho","gdho_full","qatar","integer","Country operational presence indicator" +"gdho","gdho_full","reunion","integer","Country operational presence indicator" +"gdho","gdho_full","romania","integer","Country operational presence indicator" +"gdho","gdho_full","russian_federation","integer","Country operational presence indicator" +"gdho","gdho_full","rwanda","integer","Country operational presence indicator" +"gdho","gdho_full","saint_helena","integer","Country operational presence indicator" +"gdho","gdho_full","saint_kitts_and_nevis","integer","Country operational presence indicator" +"gdho","gdho_full","saint_lucia","integer","Country operational presence indicator" +"gdho","gdho_full","saint_pierre_and_miquelon","integer","Country operational presence indicator" +"gdho","gdho_full","saint_vincent_and_the_grenadines","integer","Country operational presence indicator" +"gdho","gdho_full","samoa","integer","Country operational presence indicator" +"gdho","gdho_full","san_marino","integer","Country operational presence indicator" +"gdho","gdho_full","sao_tome_and_principe","integer","Country operational presence indicator" +"gdho","gdho_full","saudi_arabia","integer","Country operational presence indicator" +"gdho","gdho_full","senegal","integer","Country operational presence indicator" +"gdho","gdho_full","serbia_and_montenegro","integer","Country operational presence indicator" +"gdho","gdho_full","seychelles","integer","Country operational presence indicator" +"gdho","gdho_full","sierra_leone","integer","Country operational presence indicator" +"gdho","gdho_full","singapore","integer","Country operational presence indicator" +"gdho","gdho_full","slovakia","integer","Country operational presence indicator" +"gdho","gdho_full","slovenia","integer","Country operational presence indicator" +"gdho","gdho_full","solomon_islands","integer","Country operational presence indicator" +"gdho","gdho_full","somalia","integer","Country operational presence indicator" +"gdho","gdho_full","south_africa","integer","Country operational presence indicator" +"gdho","gdho_full","south_georgia_and_the_south_sandwich_islands","integer","Country operational presence indicator" +"gdho","gdho_full","south_sudan","integer","Country operational presence indicator" +"gdho","gdho_full","spain","integer","Country operational presence indicator" +"gdho","gdho_full","sri_lanka","integer","Country operational presence indicator" +"gdho","gdho_full","sudan","integer","Country operational presence indicator" +"gdho","gdho_full","suriname","integer","Country operational presence indicator" +"gdho","gdho_full","svalbard_and_jan_mayen","integer","Country operational presence indicator" +"gdho","gdho_full","swaziland","integer","Country operational presence indicator" +"gdho","gdho_full","sweden","integer","Country operational presence indicator" +"gdho","gdho_full","switzerland","integer","Country operational presence indicator" +"gdho","gdho_full","syrian_arab_republic","integer","Country operational presence indicator" +"gdho","gdho_full","taiwan","integer","Country operational presence indicator" +"gdho","gdho_full","tajikistan","integer","Country operational presence indicator" +"gdho","gdho_full","tanzania","integer","Country operational presence indicator" +"gdho","gdho_full","thailand","integer","Country operational presence indicator" +"gdho","gdho_full","timor-leste","integer","Country operational presence indicator" +"gdho","gdho_full","togo","integer","Country operational presence indicator" +"gdho","gdho_full","tokelau","integer","Country operational presence indicator" +"gdho","gdho_full","tonga","integer","Country operational presence indicator" +"gdho","gdho_full","trinidad_and_tobago","integer","Country operational presence indicator" +"gdho","gdho_full","tunisia","integer","Country operational presence indicator" +"gdho","gdho_full","turkey","integer","Country operational presence indicator" +"gdho","gdho_full","turkmenistan","integer","Country operational presence indicator" +"gdho","gdho_full","turks_and_caicos_islands","integer","Country operational presence indicator" +"gdho","gdho_full","tuvalu","integer","Country operational presence indicator" +"gdho","gdho_full","uganda","integer","Country operational presence indicator" +"gdho","gdho_full","ukraine","integer","Country operational presence indicator" +"gdho","gdho_full","united_arab_emirates","integer","Country operational presence indicator" +"gdho","gdho_full","united_kingdom","integer","Country operational presence indicator" +"gdho","gdho_full","united_states","integer","Country operational presence indicator" +"gdho","gdho_full","united_states_minor_outlying_islands","integer","Country operational presence indicator" +"gdho","gdho_full","uruguay","integer","Country operational presence indicator" +"gdho","gdho_full","uzbekistan","integer","Country operational presence indicator" +"gdho","gdho_full","vanuatu","integer","Country operational presence indicator" +"gdho","gdho_full","venezuela","integer","Country operational presence indicator" +"gdho","gdho_full","vietnam","integer","Country operational presence indicator" +"gdho","gdho_full","virgin_islands_british","integer","Country operational presence indicator" +"gdho","gdho_full","virgin_islands_u.s.","integer","Country operational presence indicator" +"gdho","gdho_full","wallis_and_futuna","integer","Country operational presence indicator" +"gdho","gdho_full","western_sahara","integer","Country operational presence indicator" +"gdho","gdho_full","yemen","integer","Country operational presence indicator" +"gdho","gdho_full","zambia","integer","Country operational presence indicator" +"gdho","gdho_full","zimbabwe","integer","Country operational presence indicator" +"glossarywho","definitions","Term","character","Term in the Glossary" +"glossarywho","definitions","Description","character","Description of the term" +"glossarywho","themes","Thematic Area","character","Thematic Area" +"glossarywho","themes","Term","character","Term in the Glossary" +"hydrogeologicalghana","hydrogeologicalghana","date","POSIXct","Date of the measurement." +"hydrogeologicalghana","hydrogeologicalghana","region","character","Name of the region where the borehole was drilled." +"hydrogeologicalghana","hydrogeologicalghana","community","character","Name of the community where the borehole was drilled." +"hydrogeologicalghana","hydrogeologicalghana","depth","numeric","Vertical distance from the surface of the ground to the bottom of the borehole, measured in meters (m). The depth of a borehole determines how deep the drilling process goes to reach the desired aquifer or geological layer." +"hydrogeologicalghana","hydrogeologicalghana","static_water_level","numeric","Llevel of water in the borehole when no pumping is taking place. It is measured from the ground surface down to the water surface inside the borehole. This measurement is crucial for determining the natural water table level and the initial conditions of the aquifer." +"hydrogeologicalghana","hydrogeologicalghana","pumping_rate","numeric","Volume of water being extracted from the borehole per unit of time, typically measured in liters per minute (l/min). This rate is essential for determining the efficiency and capacity of the borehole, as well as for designing the pump system." +"hydrogeologicalghana","hydrogeologicalghana","drawdown","numeric","Difference between the static water level and the water level in the borehole after pumping has started. It indicates how much the water level has dropped due to pumping and is measured in meters (m). Drawdown helps in understanding the impact of pumping on the aquifer and is essential for calculating the sustainable yield of the borehole." +"hydrogeologicalghana","hydrogeologicalghana","specific_capacity","numeric","Measure of the productivity of a borehole, defined as the pumping rate per unit drawdown. It is expressed in terms of volume per unit time per unit drawdown, commonly m_/day per meter of drawdown, which can be simplified to m_/day. This parameter helps in assessing the efficiency of the borehole and the aquifer's ability to transmit water to the borehole." +"hydrogeologicalghana","hydrogeologicalghana","transmissivity","numeric","Measure of how much water can be transmitted horizontally through the aquifer material over a unit width and is measured in cubic meters per day (m_/day). It is a product of the hydraulic conductivity of the aquifer and the saturated thickness of the aquifer. High transmissivity indicates a highly productive aquifer." +"hydrogeologicalghana","hydrogeologicalghana","aquifer_material","character","Type of geological materials (such as sand, gravel, limestone, or sandstone) that make up the aquifer from which the borehole extracts water. The characteristics of these materials, including their porosity and permeability, influence the aquifer's ability to store and transmit water. Understanding the aquifer material is critical for assessing the water quality and the potential yield of the borehole." +"planetaryhdi","planetaryhdi","hdi_rank","numeric","Rank by HDI" +"planetaryhdi","planetaryhdi","country","character","Name of the country" +"planetaryhdi","planetaryhdi","hdi","numeric","Human Development Index (HDI): A composite index measuring average achievement in three basic dimensions of human developmentÑa long and healthy life, knowledge and a decent standard of living. See Technical note 1 at http://hdr.undp.org/sites/default/files/hdr2023_technical_notes.pdf for details on how the HDI is calculated." +"planetaryhdi","planetaryhdi","phdi","numeric","Planetary pressures-adjusted HDI (PHDI): HDI value adjusted by the level of carbon dioxide emissions and material footprint per capita to account for the excessive human pressure on the planet. It should be seen as an incentive for transformation. See Technical note 6 at http://hdr.undp.org/sites/default/files/hdr2023_technical_notes.pdf for details on how the PHDI is calculated." +"planetaryhdi","planetaryhdi","pct_diff_hdi","numeric","Percentage Difference in HDI and Planetary HDI (caluclated as: [HDI - PHDI] / HDI)" +"planetaryhdi","planetaryhdi","rank_diff_hdi","numeric","Difference in rank between PHDI and HDI. Expressed as Rank(phdi) - Rank(hdi)" +"planetaryhdi","planetaryhdi","adj_factor","numeric","Adjustment factor for planetary pressures: Arithmetic average of the carbon dioxide emissions index and the material footprint index, both defined below. A high value implies less pressure on the planet." +"planetaryhdi","planetaryhdi","tco2_per_capita_prod","numeric","Carbon dioxide emissions per capita (production): carbon dioxide emissions produced as a consequence of human activities (use of coal, oil and gas for combustion and industrial processes, gas flaring and cement manufacture), divided by midyear population. Values are territorial emissions, meaning that emissions are attributed to the country in which they physically occur." +"planetaryhdi","planetaryhdi","co2_emissions_index","numeric","Carbon dioxide emissions (production) index: Carbon dioxide emissions per capita (production-based) expressed as an index using a minimum value of 0 and a maximum value of 76.61 tonnes per capita. A high value of this index implies less pressure to the planet." +"planetaryhdi","planetaryhdi","material_footprint_per_capita","numeric","Material footprint per capita: Material Footprint (MF) is the attribution of global material extraction to domestic final demand of a country. The total material footprint is the sum of the material footprint for biomass, fossil fuels, metal ores and non-metal ores. This indicator is calculated as raw material equivalent of imports (RMEIM) plus domestic extraction (DE) minus raw material equivalents of exports (RMEEX). Per-capita MF describes the average material use for final demand." +"planetaryhdi","planetaryhdi","material_footprint_index","numeric","Material footprint index: Material footprint per capita expressed as an index using a minimum value of 0 and a maximum value of 140.82 tonnes per capita. A high value of this index implies less pressure to the planet." +"planetaryhdi","planetaryhdi","iso3c","character","ISO 3166-1 alpha-3 country code}" +"ploswater","ploswater","id","character","Unique Identifier" +"ploswater","ploswater","doi","character","DOI of the study" +"ploswater","ploswater","title","character","Title of the study" +"ploswater","ploswater","display_name","character","Displayed Name in OpenAlex" +"ploswater","ploswater","publication_year","numeric","Year of publication" +"ploswater","ploswater","publication_date","Date","Date of publication" +"ploswater","ploswater","language","character","Original publication language" +"ploswater","ploswater","type","character","Indicates the type of scholarly work" +"ploswater","ploswater","type_crossref","character","The work type as specified by Crossref" +"ploswater","ploswater","indexed_in","character", +"ploswater","ploswater","authorships","character","Contains detailed information about authors and their institutional affiliations" +"ploswater","ploswater","institution_assertions","character","Information about institutional affiliations" +"ploswater","ploswater","countries_distinct_count","numeric","Total number of unique country codes among the work's authorships" +"ploswater","ploswater","institutions_distinct_count","numeric","Total number of unique institutions among the work's authorships" +"ploswater","ploswater","corresponding_author_ids","character","List of OpenAlex IDs for corresponding authors" +"ploswater","ploswater","corresponding_institution_ids","character","List of OpenAlex IDs for institutions of corresponding authors" +"ploswater","ploswater","fwci","numeric","Field-weighted Citation Impact, calculated as the ratio of citations received to citations expected in the publication year and three following years" +"ploswater","ploswater","has_fulltext","logical","Boolean indicating if the full text is searchable in OpenAlex" +"ploswater","ploswater","fulltext_origin","character","Indicates how the full text was obtained (e.g., ""pdf"" or ""ngrams"") when has_fulltext is true" +"ploswater","ploswater","cited_by_count","numeric","Number of times the work has been cited" +"ploswater","ploswater","is_retracted","logical","Wether study was retracted or not" +"ploswater","ploswater","is_paratext","logical", +"ploswater","ploswater","topics","character", +"ploswater","ploswater","keywords","character","Keywords in the text" +"ploswater","ploswater","concepts","character","Key concepts in the text" +"ploswater","ploswater","mesh","character", +"ploswater","ploswater","locations_count","numeric","Number of different places where the work can be found" +"ploswater","ploswater","locations","character","List of all places where the work exists, including journals, proceedings, repositories (like arXiv), and institutional repositories" +"ploswater","ploswater","sustainable_development_goals","character","Classifications linking the work to UN Sustainable Development Goals (SDGs)" +"ploswater","ploswater","grants","character","Information about research funding and grants associated with the work" +"ploswater","ploswater","datasets","character","Associated research datasets" +"ploswater","ploswater","versions","character","Different versions of the work available across locations (e.g., peer-reviewed published version, preprint version)" +"ploswater","ploswater","referenced_works_count","numeric","Number of works this work cites" +"ploswater","ploswater","referenced_works","character","List of works cited by this work" +"ploswater","ploswater","related_works","character","Works that are related to this one" +"ploswater","ploswater","cited_by_api_url","character","URL to access the list of works citing this work" +"ploswater","ploswater","counts_by_year","character","Year-by-year breakdown of citation counts, excluding citations older than ten years" +"ploswater","ploswater","updated_date","POSIXct","ISO 8601 date string showing when the record was last modified" +"ploswater","ploswater","created_date","Date","ISO 8601 date string indicating when the work was first added to OpenAlex" +"ploswater","ploswater","ids.openalex","character","The primary identifier in OpenAlex" +"ploswater","ploswater","ids.doi","character","The Digital Object Identifier, serving as the Canonical External ID" +"ploswater","ploswater","primary_location.is_oa","logical", +"ploswater","ploswater","primary_location.landing_page_url","character", +"ploswater","ploswater","primary_location.pdf_url","character", +"ploswater","ploswater","primary_location.license","character", +"ploswater","ploswater","primary_location.license_id","character", +"ploswater","ploswater","primary_location.version","character", +"ploswater","ploswater","primary_location.is_accepted","logical", +"ploswater","ploswater","primary_location.is_published","logical", +"ploswater","ploswater","primary_location.source.id","character", +"ploswater","ploswater","primary_location.source.display_name","character", +"ploswater","ploswater","primary_location.source.issn_l","character", +"ploswater","ploswater","primary_location.source.issn","character", +"ploswater","ploswater","primary_location.source.is_oa","logical", +"ploswater","ploswater","primary_location.source.is_in_doaj","logical", +"ploswater","ploswater","primary_location.source.is_core","logical", +"ploswater","ploswater","primary_location.source.host_organization","character", +"ploswater","ploswater","primary_location.source.host_organization_name","character", +"ploswater","ploswater","primary_location.source.host_organization_lineage","character", +"ploswater","ploswater","primary_location.source.host_organization_lineage_names","character", +"ploswater","ploswater","primary_location.source.type","character", +"ploswater","ploswater","open_access.is_oa","logical", +"ploswater","ploswater","open_access.oa_status","character", +"ploswater","ploswater","open_access.oa_url","character", +"ploswater","ploswater","open_access.any_repository_has_fulltext","logical", +"ploswater","ploswater","apc_list.value","numeric", +"ploswater","ploswater","apc_list.currency","character", +"ploswater","ploswater","apc_list.value_usd","numeric", +"ploswater","ploswater","apc_list.provenance","character", +"ploswater","ploswater","apc_paid.value","numeric", +"ploswater","ploswater","apc_paid.currency","character", +"ploswater","ploswater","apc_paid.value_usd","numeric", +"ploswater","ploswater","apc_paid.provenance","character", +"ploswater","ploswater","citation_normalized_percentile.value","numeric", +"ploswater","ploswater","citation_normalized_percentile.is_in_top_1_percent","logical", +"ploswater","ploswater","citation_normalized_percentile.is_in_top_10_percent","logical", +"ploswater","ploswater","cited_by_percentile_year.min","numeric", +"ploswater","ploswater","cited_by_percentile_year.max","numeric", +"ploswater","ploswater","biblio.volume","numeric", +"ploswater","ploswater","biblio.issue","numeric", +"ploswater","ploswater","biblio.first_page","character", +"ploswater","ploswater","biblio.last_page","character", +"ploswater","ploswater","primary_topic.id","character", +"ploswater","ploswater","primary_topic.display_name","character", +"ploswater","ploswater","primary_topic.score","numeric", +"ploswater","ploswater","primary_topic.subfield.id","character", +"ploswater","ploswater","primary_topic.subfield.display_name","character", +"ploswater","ploswater","primary_topic.field.id","character", +"ploswater","ploswater","primary_topic.field.display_name","character", +"ploswater","ploswater","primary_topic.domain.id","character", +"ploswater","ploswater","primary_topic.domain.display_name","character", +"ploswater","ploswater","best_oa_location.is_oa","logical", +"ploswater","ploswater","best_oa_location.landing_page_url","character", +"ploswater","ploswater","best_oa_location.pdf_url","character", +"ploswater","ploswater","best_oa_location.license","character", +"ploswater","ploswater","best_oa_location.license_id","character", +"ploswater","ploswater","best_oa_location.version","character", +"ploswater","ploswater","best_oa_location.is_accepted","logical", +"ploswater","ploswater","best_oa_location.is_published","logical", +"ploswater","ploswater","best_oa_location.source.id","character", +"ploswater","ploswater","best_oa_location.source.display_name","character", +"ploswater","ploswater","best_oa_location.source.issn_l","character", +"ploswater","ploswater","best_oa_location.source.issn","character", +"ploswater","ploswater","best_oa_location.source.is_oa","logical", +"ploswater","ploswater","best_oa_location.source.is_in_doaj","logical", +"ploswater","ploswater","best_oa_location.source.is_core","logical", +"ploswater","ploswater","best_oa_location.source.host_organization","character", +"ploswater","ploswater","best_oa_location.source.host_organization_name","character", +"ploswater","ploswater","best_oa_location.source.host_organization_lineage","character", +"ploswater","ploswater","best_oa_location.source.host_organization_lineage_names","character", +"ploswater","ploswater","best_oa_location.source.type","character", +"ploswater","ploswater","abstract_inverted_index.water","character", +"ploswater","ploswater","abstract_inverted_index.and","character", +"ploswater","ploswater","abstract_inverted_index.sanitation","character", +"ploswater","ploswater","abstract_inverted_index.programs","numeric", +"ploswater","ploswater","abstract_inverted_index.have","character", +"ploswater","ploswater","abstract_inverted_index.focused","character", +"ploswater","ploswater","abstract_inverted_index.on","character", +"ploswater","ploswater","abstract_inverted_index.value","character", +"ploswater","ploswater","abstract_inverted_index.in","character", +"ploswater","ploswater","abstract_inverted_index.improving","numeric", +"ploswater","ploswater","abstract_inverted_index.conditions","character", +"ploswater","ploswater","abstract_inverted_index.evidence","character", +"ploswater","ploswater","abstract_inverted_index.This","character", +"ploswater","ploswater","abstract_inverted_index.review","character", +"ploswater","ploswater","abstract_inverted_index.identified","character", +"ploswater","ploswater","abstract_inverted_index.empirical","character", +"ploswater","ploswater","abstract_inverted_index.research","character", +"ploswater","ploswater","abstract_inverted_index.that","character", +"ploswater","ploswater","abstract_inverted_index.and/or","character", +"ploswater","ploswater","abstract_inverted_index.reported","character", +"ploswater","ploswater","abstract_inverted_index.used,","numeric", +"ploswater","ploswater","abstract_inverted_index.methods","character", +"ploswater","ploswater","abstract_inverted_index.if","character", +"ploswater","ploswater","abstract_inverted_index.was","character", +"ploswater","ploswater","abstract_inverted_index.the","character", +"ploswater","ploswater","abstract_inverted_index.A","character", +"ploswater","ploswater","abstract_inverted_index.conceptual","numeric", +"ploswater","ploswater","abstract_inverted_index.model","character", +"ploswater","ploswater","abstract_inverted_index.of","character", +"ploswater","ploswater","abstract_inverted_index.which","character", +"ploswater","ploswater","abstract_inverted_index.includes","character", +"ploswater","ploswater","abstract_inverted_index.three","character", +"ploswater","ploswater","abstract_inverted_index.resources,","numeric", +"ploswater","ploswater","abstract_inverted_index.institutional","character", +"ploswater","ploswater","abstract_inverted_index.analysis.","numeric", +"ploswater","ploswater","abstract_inverted_index.We","character", +"ploswater","ploswater","abstract_inverted_index.Global","character", +"ploswater","ploswater","abstract_inverted_index.for","character", +"ploswater","ploswater","abstract_inverted_index.peer-reviewed","character", +"ploswater","ploswater","abstract_inverted_index.sources","character", +"ploswater","ploswater","abstract_inverted_index.either","character", +"ploswater","ploswater","abstract_inverted_index.related","character", +"ploswater","ploswater","abstract_inverted_index.terms","character", +"ploswater","ploswater","abstract_inverted_index.from","character", +"ploswater","ploswater","abstract_inverted_index.were","character", +"ploswater","ploswater","abstract_inverted_index.representing","character", +"ploswater","ploswater","abstract_inverted_index.over","character", +"ploswater","ploswater","abstract_inverted_index.used","character", +"ploswater","ploswater","abstract_inverted_index.followed","character", +"ploswater","ploswater","abstract_inverted_index.framework","character", +"ploswater","ploswater","abstract_inverted_index.analysis","character", +"ploswater","ploswater","abstract_inverted_index.approach,","numeric", +"ploswater","ploswater","abstract_inverted_index.using","character", +"ploswater","ploswater","abstract_inverted_index.as","character", +"ploswater","ploswater","abstract_inverted_index.two","character", +"ploswater","ploswater","abstract_inverted_index.additional","character", +"ploswater","ploswater","abstract_inverted_index.relevant","numeric", +"ploswater","ploswater","abstract_inverted_index.to","character", +"ploswater","ploswater","abstract_inverted_index.The","character", +"ploswater","ploswater","abstract_inverted_index.majority","numeric", +"ploswater","ploswater","abstract_inverted_index.or","character", +"ploswater","ploswater","abstract_inverted_index.published","numeric", +"ploswater","ploswater","abstract_inverted_index.since","character", +"ploswater","ploswater","abstract_inverted_index.proportion","character", +"ploswater","ploswater","abstract_inverted_index.studies","character", +"ploswater","ploswater","abstract_inverted_index.half","character", +"ploswater","ploswater","abstract_inverted_index.yet","numeric", +"ploswater","ploswater","abstract_inverted_index.only","character", +"ploswater","ploswater","abstract_inverted_index.provided","character", +"ploswater","ploswater","abstract_inverted_index.a","character", +"ploswater","ploswater","abstract_inverted_index.least","character", +"ploswater","ploswater","abstract_inverted_index.assessing","character", +"ploswater","ploswater","abstract_inverted_index.are","character", +"ploswater","ploswater","abstract_inverted_index.is","character", +"ploswater","ploswater","abstract_inverted_index.main","character", +"ploswater","ploswater","abstract_inverted_index.more","character", +"ploswater","ploswater","abstract_inverted_index.approaches","character", +"ploswater","ploswater","abstract_inverted_index.reduce","character", +"ploswater","ploswater","abstract_inverted_index.systemic","numeric", +"ploswater","ploswater","abstract_inverted_index.resources","character", +"ploswater","ploswater","abstract_inverted_index.For","character", +"ploswater","ploswater","abstract_inverted_index.first","character", +"ploswater","ploswater","abstract_inverted_index.time","character", +"ploswater","ploswater","abstract_inverted_index.has","character", +"ploswater","ploswater","abstract_inverted_index.been","character", +"ploswater","ploswater","abstract_inverted_index.focus","character", +"ploswater","ploswater","abstract_inverted_index.both","character", +"ploswater","ploswater","abstract_inverted_index.2","character", +"ploswater","ploswater","abstract_inverted_index.we","character", +"ploswater","ploswater","abstract_inverted_index.argue","numeric", +"ploswater","ploswater","abstract_inverted_index.here","numeric", +"ploswater","ploswater","abstract_inverted_index.not","character", +"ploswater","ploswater","abstract_inverted_index.attention","character", +"ploswater","ploswater","abstract_inverted_index.it","character", +"ploswater","ploswater","abstract_inverted_index.scientists","character", +"ploswater","ploswater","abstract_inverted_index.policymakers","character", +"ploswater","ploswater","abstract_inverted_index.several","numeric", +"ploswater","ploswater","abstract_inverted_index.historical","character", +"ploswater","ploswater","abstract_inverted_index.temperature","character", +"ploswater","ploswater","abstract_inverted_index.change","character", +"ploswater","ploswater","abstract_inverted_index.further","numeric", +"ploswater","ploswater","abstract_inverted_index.increased","character", +"ploswater","ploswater","abstract_inverted_index.with","character", +"ploswater","ploswater","abstract_inverted_index.use","character", +"ploswater","ploswater","abstract_inverted_index.global","character", +"ploswater","ploswater","abstract_inverted_index.levels","character", +"ploswater","ploswater","abstract_inverted_index.by","character", +"ploswater","ploswater","abstract_inverted_index.an","character", +"ploswater","ploswater","abstract_inverted_index.aim","numeric", +"ploswater","ploswater","abstract_inverted_index.be","character", +"ploswater","ploswater","abstract_inverted_index.consistent","character", +"ploswater","ploswater","abstract_inverted_index.current","character", +"ploswater","ploswater","abstract_inverted_index.policy","character", +"ploswater","ploswater","abstract_inverted_index.increasing","character", +"ploswater","ploswater","abstract_inverted_index.extreme","character", +"ploswater","ploswater","abstract_inverted_index.weather","character", +"ploswater","ploswater","abstract_inverted_index.sometimes","character", +"ploswater","ploswater","abstract_inverted_index.changes","character", +"ploswater","ploswater","abstract_inverted_index.such","character", +"ploswater","ploswater","abstract_inverted_index.land","character", +"ploswater","ploswater","abstract_inverted_index.variability","character", +"ploswater","ploswater","abstract_inverted_index.cycle","character", +"ploswater","ploswater","abstract_inverted_index.season","character", +"ploswater","ploswater","abstract_inverted_index.season,","numeric", +"ploswater","ploswater","abstract_inverted_index.year","character", +"ploswater","ploswater","abstract_inverted_index.also","character", +"ploswater","ploswater","abstract_inverted_index.impacts","character", +"ploswater","ploswater","abstract_inverted_index.all","character", +"ploswater","ploswater","abstract_inverted_index.needed","character", +"ploswater","ploswater","abstract_inverted_index.understanding","character", +"ploswater","ploswater","abstract_inverted_index.effectiveness","character", +"ploswater","ploswater","abstract_inverted_index.future","character", +"ploswater","ploswater","abstract_inverted_index.adaptation","numeric", +"ploswater","ploswater","abstract_inverted_index.strategies","character", +"ploswater","ploswater","abstract_inverted_index.reducing","character", +"ploswater","ploswater","abstract_inverted_index.water-related","character", +"ploswater","ploswater","abstract_inverted_index.climate","character", +"ploswater","ploswater","abstract_inverted_index.Finally,","numeric", +"ploswater","ploswater","abstract_inverted_index.role","character", +"ploswater","ploswater","abstract_inverted_index.assessment","character", +"ploswater","ploswater","abstract_inverted_index.require","character", +"ploswater","ploswater","abstract_inverted_index.whose","numeric", +"ploswater","ploswater","abstract_inverted_index.feasibility","numeric", +"ploswater","ploswater","abstract_inverted_index.efficiency","character", +"ploswater","ploswater","abstract_inverted_index.resources.","character", +"ploswater","ploswater","abstract_inverted_index.It","character", +"ploswater","ploswater","abstract_inverted_index.thus","numeric", +"ploswater","ploswater","abstract_inverted_index.essential","character", +"ploswater","ploswater","abstract_inverted_index.develop","character", +"ploswater","ploswater","abstract_inverted_index.integrated","character", +"ploswater","ploswater","abstract_inverted_index.approach","character", +"ploswater","ploswater","abstract_inverted_index.change,","character", +"ploswater","ploswater","abstract_inverted_index.would","character", +"ploswater","ploswater","abstract_inverted_index.between","character", +"ploswater","ploswater","abstract_inverted_index.hydrological","character", +"ploswater","ploswater","abstract_inverted_index.testing","character", +"ploswater","ploswater","abstract_inverted_index.novel","character", +"ploswater","ploswater","abstract_inverted_index.tool","character", +"ploswater","ploswater","abstract_inverted_index.public","character", +"ploswater","ploswater","abstract_inverted_index.health","character", +"ploswater","ploswater","abstract_inverted_index.monitoring,","character", +"ploswater","ploswater","abstract_inverted_index.but","character", +"ploswater","ploswater","abstract_inverted_index.laboratory","character", +"ploswater","ploswater","abstract_inverted_index.capacity","character", +"ploswater","ploswater","abstract_inverted_index.provide","character", +"ploswater","ploswater","abstract_inverted_index.monitoring","character", +"ploswater","ploswater","abstract_inverted_index.at","character", +"ploswater","ploswater","abstract_inverted_index.locations","numeric", +"ploswater","ploswater","abstract_inverted_index.where","character", +"ploswater","ploswater","abstract_inverted_index.potential","character", +"ploswater","ploswater","abstract_inverted_index.practices","character", +"ploswater","ploswater","abstract_inverted_index.wastewater","character", +"ploswater","ploswater","abstract_inverted_index.currently","numeric", +"ploswater","ploswater","abstract_inverted_index.quality","character", +"ploswater","ploswater","abstract_inverted_index.control","character", +"ploswater","ploswater","abstract_inverted_index.may","character", +"ploswater","ploswater","abstract_inverted_index.across","character", +"ploswater","ploswater","abstract_inverted_index.many","character", +"ploswater","ploswater","abstract_inverted_index.academic","numeric", +"ploswater","ploswater","abstract_inverted_index.out","character", +"ploswater","ploswater","abstract_inverted_index.Here,","numeric", +"ploswater","ploswater","abstract_inverted_index.our","character", +"ploswater","ploswater","abstract_inverted_index.including","character", +"ploswater","ploswater","abstract_inverted_index.standard","character", +"ploswater","ploswater","abstract_inverted_index.operating","numeric", +"ploswater","ploswater","abstract_inverted_index.present","character", +"ploswater","ploswater","abstract_inverted_index.data","character", +"ploswater","ploswater","abstract_inverted_index.discuss","numeric", +"ploswater","ploswater","abstract_inverted_index.reporting","numeric", +"ploswater","ploswater","abstract_inverted_index.this","character", +"ploswater","ploswater","abstract_inverted_index.information","character", +"ploswater","ploswater","abstract_inverted_index.will","character", +"ploswater","ploswater","abstract_inverted_index.others","numeric", +"ploswater","ploswater","abstract_inverted_index.developing","character", +"ploswater","ploswater","abstract_inverted_index.support","character", +"ploswater","ploswater","abstract_inverted_index.decision-making.","numeric", +"ploswater","ploswater","abstract_inverted_index.agriculture","character", +"ploswater","ploswater","abstract_inverted_index.significant","character", +"ploswater","ploswater","abstract_inverted_index.food","character", +"ploswater","ploswater","abstract_inverted_index.socio-economic","numeric", +"ploswater","ploswater","abstract_inverted_index.people","character", +"ploswater","ploswater","abstract_inverted_index.living","character", +"ploswater","ploswater","abstract_inverted_index.some","character", +"ploswater","ploswater","abstract_inverted_index.UN","character", +"ploswater","ploswater","abstract_inverted_index.Organization","numeric", +"ploswater","ploswater","abstract_inverted_index.(e.g.,","character", +"ploswater","ploswater","abstract_inverted_index.World","character", +"ploswater","ploswater","abstract_inverted_index.River","character", +"ploswater","ploswater","abstract_inverted_index.these","character", +"ploswater","ploswater","abstract_inverted_index.areas","character", +"ploswater","ploswater","abstract_inverted_index.resource","character", +"ploswater","ploswater","abstract_inverted_index.sustainability","character", +"ploswater","ploswater","abstract_inverted_index.its","character", +"ploswater","ploswater","abstract_inverted_index.unique","numeric", +"ploswater","ploswater","abstract_inverted_index.risk","character", +"ploswater","ploswater","abstract_inverted_index.process","character", +"ploswater","ploswater","abstract_inverted_index.results","character", +"ploswater","ploswater","abstract_inverted_index.multiple","character", +"ploswater","ploswater","abstract_inverted_index.natural","character", +"ploswater","ploswater","abstract_inverted_index.recently","numeric", +"ploswater","ploswater","abstract_inverted_index.river","character", +"ploswater","ploswater","abstract_inverted_index.sustainable","character", +"ploswater","ploswater","abstract_inverted_index.development","character", +"ploswater","ploswater","abstract_inverted_index.particularly","character", +"ploswater","ploswater","abstract_inverted_index.lack","character", +"ploswater","ploswater","abstract_inverted_index.leads","numeric", +"ploswater","ploswater","abstract_inverted_index.discharge","character", +"ploswater","ploswater","abstract_inverted_index.flow","character", +"ploswater","ploswater","abstract_inverted_index.agricultural","character", +"ploswater","ploswater","abstract_inverted_index.plant","character", +"ploswater","ploswater","abstract_inverted_index.uptake","numeric", +"ploswater","ploswater","abstract_inverted_index.effects","character", +"ploswater","ploswater","abstract_inverted_index.crop","character", +"ploswater","ploswater","abstract_inverted_index.growth","character", +"ploswater","ploswater","abstract_inverted_index.higher","character", +"ploswater","ploswater","abstract_inverted_index.lower","character", +"ploswater","ploswater","abstract_inverted_index.soil","character", +"ploswater","ploswater","abstract_inverted_index.microbial","character", +"ploswater","ploswater","abstract_inverted_index.activity,","numeric", +"ploswater","ploswater","abstract_inverted_index.overall","numeric", +"ploswater","ploswater","abstract_inverted_index.case","character", +"ploswater","ploswater","abstract_inverted_index.critical","character", +"ploswater","ploswater","abstract_inverted_index.regions","character", +"ploswater","ploswater","abstract_inverted_index.can","character", +"ploswater","ploswater","abstract_inverted_index.considered","character", +"ploswater","ploswater","abstract_inverted_index.possible","numeric", +"ploswater","ploswater","abstract_inverted_index.Two","numeric", +"ploswater","ploswater","abstract_inverted_index.among","character", +"ploswater","ploswater","abstract_inverted_index.home","numeric", +"ploswater","ploswater","abstract_inverted_index.animal","character", +"ploswater","ploswater","abstract_inverted_index.strong","character", +"ploswater","ploswater","abstract_inverted_index.rural","character", +"ploswater","ploswater","abstract_inverted_index.major","character", +"ploswater","ploswater","abstract_inverted_index.area","character", +"ploswater","ploswater","abstract_inverted_index.important","character", +"ploswater","ploswater","abstract_inverted_index.hydraulic","character", +"ploswater","ploswater","abstract_inverted_index.works","numeric", +"ploswater","ploswater","abstract_inverted_index.Republic","numeric", +"ploswater","ploswater","abstract_inverted_index.region","character", +"ploswater","ploswater","abstract_inverted_index.faces","numeric", +"ploswater","ploswater","abstract_inverted_index.due","character", +"ploswater","ploswater","abstract_inverted_index.[4],","numeric", +"ploswater","ploswater","abstract_inverted_index.increasingly","character", +"ploswater","ploswater","abstract_inverted_index.challenging","numeric", +"ploswater","ploswater","abstract_inverted_index.recent","numeric", +"ploswater","ploswater","abstract_inverted_index.attributed","numeric", +"ploswater","ploswater","abstract_inverted_index.range","numeric", +"ploswater","ploswater","abstract_inverted_index.building","character", +"ploswater","ploswater","abstract_inverted_index.studied","character", +"ploswater","ploswater","abstract_inverted_index.February","numeric", +"ploswater","ploswater","abstract_inverted_index.biological","character", +"ploswater","ploswater","abstract_inverted_index.parameters","character", +"ploswater","ploswater","abstract_inverted_index.pH,","character", +"ploswater","ploswater","abstract_inverted_index.total","character", +"ploswater","ploswater","abstract_inverted_index.count","character", +"ploswater","ploswater","abstract_inverted_index.analyzed","character", +"ploswater","ploswater","abstract_inverted_index.understand","character", +"ploswater","ploswater","abstract_inverted_index.differences","character", +"ploswater","ploswater","abstract_inverted_index.within","character", +"ploswater","ploswater","abstract_inverted_index.chlorine","character", +"ploswater","ploswater","abstract_inverted_index.concentration","character", +"ploswater","ploswater","abstract_inverted_index.decreased","character", +"ploswater","ploswater","abstract_inverted_index.(","character", +"ploswater","ploswater","abstract_inverted_index.p","character", +"ploswater","ploswater","abstract_inverted_index.<","character", +"ploswater","ploswater","abstract_inverted_index.point","character", +"ploswater","ploswater","abstract_inverted_index.plumbing","character", +"ploswater","ploswater","abstract_inverted_index.As","character", +"ploswater","ploswater","abstract_inverted_index.much","character", +"ploswater","ploswater","abstract_inverted_index.greater","character", +"ploswater","ploswater","abstract_inverted_index.compared","character", +"ploswater","ploswater","abstract_inverted_index.every","character", +"ploswater","ploswater","abstract_inverted_index.sampling","character", +"ploswater","ploswater","abstract_inverted_index.found","character", +"ploswater","ploswater","abstract_inverted_index.highest","numeric", +"ploswater","ploswater","abstract_inverted_index.no","character", +"ploswater","ploswater","abstract_inverted_index.recorded","numeric", +"ploswater","ploswater","abstract_inverted_index.during","character", +"ploswater","ploswater","abstract_inverted_index.lead","character", +"ploswater","ploswater","abstract_inverted_index.health-based","numeric", +"ploswater","ploswater","abstract_inverted_index.drinking","character", +"ploswater","ploswater","abstract_inverted_index.four","character", +"ploswater","ploswater","abstract_inverted_index.same","character", +"ploswater","ploswater","abstract_inverted_index.shared","character", +"ploswater","ploswater","abstract_inverted_index.use.","character", +"ploswater","ploswater","abstract_inverted_index.conducted","character", +"ploswater","ploswater","abstract_inverted_index.one","character", +"ploswater","ploswater","abstract_inverted_index.required","character", +"ploswater","ploswater","abstract_inverted_index.supply.","numeric", +"ploswater","ploswater","abstract_inverted_index.viable","character", +"ploswater","ploswater","abstract_inverted_index.method","character", +"ploswater","ploswater","abstract_inverted_index.need","character", +"ploswater","ploswater","abstract_inverted_index.19","numeric", +"ploswater","ploswater","abstract_inverted_index.than","character", +"ploswater","ploswater","abstract_inverted_index.50","character", +"ploswater","ploswater","abstract_inverted_index.before","character", +"ploswater","ploswater","abstract_inverted_index.prior","character", +"ploswater","ploswater","abstract_inverted_index.suggest","numeric", +"ploswater","ploswater","abstract_inverted_index.significantly","character", +"ploswater","ploswater","abstract_inverted_index.implications","character", +"ploswater","ploswater","abstract_inverted_index.collected","character", +"ploswater","ploswater","abstract_inverted_index.infrastructure","character", +"ploswater","ploswater","abstract_inverted_index.engineering","numeric", +"ploswater","ploswater","abstract_inverted_index.security","character", +"ploswater","ploswater","abstract_inverted_index.In","character", +"ploswater","ploswater","abstract_inverted_index.freshwater","character", +"ploswater","ploswater","abstract_inverted_index.society","character", +"ploswater","ploswater","abstract_inverted_index.environment","character", +"ploswater","ploswater","abstract_inverted_index.could","character", +"ploswater","ploswater","abstract_inverted_index.benefit","numeric", +"ploswater","ploswater","abstract_inverted_index.Such","numeric", +"ploswater","ploswater","abstract_inverted_index.conservation","character", +"ploswater","ploswater","abstract_inverted_index.ongoing","character", +"ploswater","ploswater","abstract_inverted_index.species","character", +"ploswater","ploswater","abstract_inverted_index.their","character", +"ploswater","ploswater","abstract_inverted_index.systems.","character", +"ploswater","ploswater","abstract_inverted_index.However,","character", +"ploswater","ploswater","abstract_inverted_index.make","character", +"ploswater","ploswater","abstract_inverted_index.meaningful","numeric", +"ploswater","ploswater","abstract_inverted_index.contributions","character", +"ploswater","ploswater","abstract_inverted_index.must","character", +"ploswater","ploswater","abstract_inverted_index.established","character", +"ploswater","ploswater","abstract_inverted_index.link","numeric", +"ploswater","ploswater","abstract_inverted_index.common","character", +"ploswater","ploswater","abstract_inverted_index.six","numeric", +"ploswater","ploswater","abstract_inverted_index.actions","numeric", +"ploswater","ploswater","abstract_inverted_index.life","numeric", +"ploswater","ploswater","abstract_inverted_index.science","character", +"ploswater","ploswater","abstract_inverted_index.highlight","numeric", +"ploswater","ploswater","abstract_inverted_index.knowledge","character", +"ploswater","ploswater","abstract_inverted_index.necessary","character", +"ploswater","ploswater","abstract_inverted_index.how","character", +"ploswater","ploswater","abstract_inverted_index.play","numeric", +"ploswater","ploswater","abstract_inverted_index.direct","character", +"ploswater","ploswater","abstract_inverted_index.aquatic","character", +"ploswater","ploswater","abstract_inverted_index.quality,","character", +"ploswater","ploswater","abstract_inverted_index.ecosystems.","numeric", +"ploswater","ploswater","abstract_inverted_index.ensure","numeric", +"ploswater","ploswater","abstract_inverted_index.ecosystems","character", +"ploswater","ploswater","abstract_inverted_index.species.","numeric", +"ploswater","ploswater","abstract_inverted_index.Water","character", +"ploswater","ploswater","abstract_inverted_index.managers","character", +"ploswater","ploswater","abstract_inverted_index.consider","character", +"ploswater","ploswater","abstract_inverted_index.whether","numeric", +"ploswater","ploswater","abstract_inverted_index.concern","character", +"ploswater","ploswater","abstract_inverted_index.reservoir","character", +"ploswater","ploswater","abstract_inverted_index.management,","character", +"ploswater","ploswater","abstract_inverted_index.modeling","character", +"ploswater","ploswater","abstract_inverted_index.requires","character", +"ploswater","ploswater","abstract_inverted_index.models","character", +"ploswater","ploswater","abstract_inverted_index.watershed","character", +"ploswater","ploswater","abstract_inverted_index.various","character", +"ploswater","ploswater","abstract_inverted_index.most","character", +"ploswater","ploswater","abstract_inverted_index.practical","character", +"ploswater","ploswater","abstract_inverted_index.selecting","character", +"ploswater","ploswater","abstract_inverted_index.availability","character", +"ploswater","ploswater","abstract_inverted_index.number","character", +"ploswater","ploswater","abstract_inverted_index.decisions","numeric", +"ploswater","ploswater","abstract_inverted_index.regarding","character", +"ploswater","ploswater","abstract_inverted_index.best","character", +"ploswater","ploswater","abstract_inverted_index.relative","character", +"ploswater","ploswater","abstract_inverted_index.importance","character", +"ploswater","ploswater","abstract_inverted_index.different","character", +"ploswater","ploswater","abstract_inverted_index.limited","character", +"ploswater","ploswater","abstract_inverted_index.should","character", +"ploswater","ploswater","abstract_inverted_index.assess","numeric", +"ploswater","ploswater","abstract_inverted_index.existing","character", +"ploswater","ploswater","abstract_inverted_index.then","character", +"ploswater","ploswater","abstract_inverted_index.limitations","numeric", +"ploswater","ploswater","abstract_inverted_index.questions","character", +"ploswater","ploswater","abstract_inverted_index.previous","character", +"ploswater","ploswater","abstract_inverted_index.While","character", +"ploswater","ploswater","abstract_inverted_index.there","character", +"ploswater","ploswater","abstract_inverted_index.work","character", +"ploswater","ploswater","abstract_inverted_index.options","character", +"ploswater","ploswater","abstract_inverted_index.activity","numeric", +"ploswater","ploswater","abstract_inverted_index.leading","character", +"ploswater","ploswater","abstract_inverted_index.widespread","character", +"ploswater","ploswater","abstract_inverted_index.lake","character", +"ploswater","ploswater","abstract_inverted_index.key","character", +"ploswater","ploswater","abstract_inverted_index.health.","character", +"ploswater","ploswater","abstract_inverted_index.anthropogenic","character", +"ploswater","ploswater","abstract_inverted_index.affecting","numeric", +"ploswater","ploswater","abstract_inverted_index.space","character", +"ploswater","ploswater","abstract_inverted_index.potentially","character", +"ploswater","ploswater","abstract_inverted_index.highly","character", +"ploswater","ploswater","abstract_inverted_index.responses","numeric", +"ploswater","ploswater","abstract_inverted_index.poorly","character", +"ploswater","ploswater","abstract_inverted_index.million","character", +"ploswater","ploswater","abstract_inverted_index.estimates","character", +"ploswater","ploswater","abstract_inverted_index.4","character", +"ploswater","ploswater","abstract_inverted_index.km","character", +"ploswater","ploswater","abstract_inverted_index.quantify","character", +"ploswater","ploswater","abstract_inverted_index.2020","numeric", +"ploswater","ploswater","abstract_inverted_index.large","character", +"ploswater","ploswater","abstract_inverted_index.cumulative","character", +"ploswater","ploswater","abstract_inverted_index.increase","character", +"ploswater","ploswater","abstract_inverted_index.human","character", +"ploswater","ploswater","abstract_inverted_index.lakes","character", +"ploswater","ploswater","abstract_inverted_index.positive","character", +"ploswater","ploswater","abstract_inverted_index.trends","character", +"ploswater","ploswater","abstract_inverted_index.times","numeric", +"ploswater","ploswater","abstract_inverted_index.demonstrates","numeric", +"ploswater","ploswater","abstract_inverted_index.inform","character", +"ploswater","ploswater","abstract_inverted_index.management","character", +"ploswater","ploswater","abstract_inverted_index.determine","character", +"ploswater","ploswater","abstract_inverted_index.local","character", +"ploswater","ploswater","abstract_inverted_index.Existing","numeric", +"ploswater","ploswater","abstract_inverted_index.literature","character", +"ploswater","ploswater","abstract_inverted_index.water,","character", +"ploswater","ploswater","abstract_inverted_index.sanitation,","numeric", +"ploswater","ploswater","abstract_inverted_index.hygiene","character", +"ploswater","ploswater","abstract_inverted_index.(WASH)","numeric", +"ploswater","ploswater","abstract_inverted_index.United","character", +"ploswater","ploswater","abstract_inverted_index.States,","character", +"ploswater","ploswater","abstract_inverted_index.issues","character", +"ploswater","ploswater","abstract_inverted_index.areas.","character", +"ploswater","ploswater","abstract_inverted_index.emerging","numeric", +"ploswater","ploswater","abstract_inverted_index.infectious","numeric", +"ploswater","ploswater","abstract_inverted_index.disease","character", +"ploswater","ploswater","abstract_inverted_index.face","numeric", +"ploswater","ploswater","abstract_inverted_index.challenges","character", +"ploswater","ploswater","abstract_inverted_index.urban","character", +"ploswater","ploswater","abstract_inverted_index.study","character", +"ploswater","ploswater","abstract_inverted_index.WASH","character", +"ploswater","ploswater","abstract_inverted_index.needs","character", +"ploswater","ploswater","abstract_inverted_index.through","character", +"ploswater","ploswater","abstract_inverted_index.interviews","character", +"ploswater","ploswater","abstract_inverted_index.(n","character", +"ploswater","ploswater","abstract_inverted_index.=","character", +"ploswater","ploswater","abstract_inverted_index.participants","character", +"ploswater","ploswater","abstract_inverted_index.18","character", +"ploswater","ploswater","abstract_inverted_index.years","character", +"ploswater","ploswater","abstract_inverted_index.lived","numeric", +"ploswater","ploswater","abstract_inverted_index.five","character", +"ploswater","ploswater","abstract_inverted_index.had","character", +"ploswater","ploswater","abstract_inverted_index.Using","numeric", +"ploswater","ploswater","abstract_inverted_index.analysis,","character", +"ploswater","ploswater","abstract_inverted_index.factors","character", +"ploswater","ploswater","abstract_inverted_index.access,","character", +"ploswater","ploswater","abstract_inverted_index.outcomes","character", +"ploswater","ploswater","abstract_inverted_index.result","character", +"ploswater","ploswater","abstract_inverted_index.explore","numeric", +"ploswater","ploswater","abstract_inverted_index.experiences","character", +"ploswater","ploswater","abstract_inverted_index.who","character", +"ploswater","ploswater","abstract_inverted_index.those","character", +"ploswater","ploswater","abstract_inverted_index.did","character", +"ploswater","ploswater","abstract_inverted_index.not.","numeric", +"ploswater","ploswater","abstract_inverted_index.Our","character", +"ploswater","ploswater","abstract_inverted_index.findings","character", +"ploswater","ploswater","abstract_inverted_index.revealed","character", +"ploswater","ploswater","abstract_inverted_index.contributed","numeric", +"ploswater","ploswater","abstract_inverted_index.physical,","numeric", +"ploswater","ploswater","abstract_inverted_index.relationship","character", +"ploswater","ploswater","abstract_inverted_index.communities","character", +"ploswater","ploswater","abstract_inverted_index.impacted","numeric", +"ploswater","ploswater","abstract_inverted_index.facilities","character", +"ploswater","ploswater","abstract_inverted_index.safe","character", +"ploswater","ploswater","abstract_inverted_index.available","character", +"ploswater","ploswater","abstract_inverted_index.inadequate","numeric", +"ploswater","ploswater","abstract_inverted_index.access","character", +"ploswater","ploswater","abstract_inverted_index.collaboration","character", +"ploswater","ploswater","abstract_inverted_index.reduction","character", +"ploswater","ploswater","abstract_inverted_index.services","character", +"ploswater","ploswater","abstract_inverted_index.example,","numeric", +"ploswater","ploswater","abstract_inverted_index.hand","character", +"ploswater","ploswater","abstract_inverted_index.community","character", +"ploswater","ploswater","abstract_inverted_index.measures","character", +"ploswater","ploswater","abstract_inverted_index.transmission","character", +"ploswater","ploswater","abstract_inverted_index.COVID-19","character", +"ploswater","ploswater","abstract_inverted_index.other","character", +"ploswater","ploswater","abstract_inverted_index.diseases.","character", +"ploswater","ploswater","abstract_inverted_index.guidance","character", +"ploswater","ploswater","abstract_inverted_index.standards","character", +"ploswater","ploswater","abstract_inverted_index.new","character", +"ploswater","ploswater","abstract_inverted_index.tools","character", +"ploswater","ploswater","abstract_inverted_index.targeted","numeric", +"ploswater","ploswater","abstract_inverted_index.assessments","character", +"ploswater","ploswater","abstract_inverted_index.pandemic.","numeric", +"ploswater","ploswater","abstract_inverted_index.organizations","numeric", +"ploswater","ploswater","abstract_inverted_index.evaluate","character", +"ploswater","ploswater","abstract_inverted_index.interventions","character", +"ploswater","ploswater","abstract_inverted_index.mitigate","numeric", +"ploswater","ploswater","abstract_inverted_index.middle-income","character", +"ploswater","ploswater","abstract_inverted_index.countries","character", +"ploswater","ploswater","abstract_inverted_index.focusing","numeric", +"ploswater","ploswater","abstract_inverted_index.household","character", +"ploswater","ploswater","abstract_inverted_index.settings","character", +"ploswater","ploswater","abstract_inverted_index.observed","character", +"ploswater","ploswater","abstract_inverted_index.gaps","character", +"ploswater","ploswater","abstract_inverted_index.specifically","numeric", +"ploswater","ploswater","abstract_inverted_index.often","character", +"ploswater","ploswater","abstract_inverted_index.about","character", +"ploswater","ploswater","abstract_inverted_index.high","character", +"ploswater","ploswater","abstract_inverted_index.after","character", +"ploswater","ploswater","abstract_inverted_index.stations","numeric", +"ploswater","ploswater","abstract_inverted_index.points","numeric", +"ploswater","ploswater","abstract_inverted_index.external","numeric", +"ploswater","ploswater","abstract_inverted_index.needed.","numeric", +"ploswater","ploswater","abstract_inverted_index.refinement","numeric", +"ploswater","ploswater","abstract_inverted_index.help","character", +"ploswater","ploswater","abstract_inverted_index.aspects","character", +"ploswater","ploswater","abstract_inverted_index.efforts","character", +"ploswater","ploswater","abstract_inverted_index.remain","numeric", +"ploswater","ploswater","abstract_inverted_index.functional","numeric", +"ploswater","ploswater","abstract_inverted_index.inclusive","character", +"ploswater","ploswater","abstract_inverted_index.U.S.","character", +"ploswater","ploswater","abstract_inverted_index.service","character", +"ploswater","ploswater","abstract_inverted_index.health,","character", +"ploswater","ploswater","abstract_inverted_index.economic","character", +"ploswater","ploswater","abstract_inverted_index.expressed","character", +"ploswater","ploswater","abstract_inverted_index.sample","numeric", +"ploswater","ploswater","abstract_inverted_index.approximately","numeric", +"ploswater","ploswater","abstract_inverted_index.city","character", +"ploswater","ploswater","abstract_inverted_index.perceptions","character", +"ploswater","ploswater","abstract_inverted_index.barriers","character", +"ploswater","ploswater","abstract_inverted_index.meeting","character", +"ploswater","ploswater","abstract_inverted_index.question","numeric", +"ploswater","ploswater","abstract_inverted_index.cost","character", +"ploswater","ploswater","abstract_inverted_index.capital","character", +"ploswater","ploswater","abstract_inverted_index.projects","character", +"ploswater","ploswater","abstract_inverted_index.increases","numeric", +"ploswater","ploswater","abstract_inverted_index.infrastructure.","character", +"ploswater","ploswater","abstract_inverted_index.demonstrate","character", +"ploswater","ploswater","abstract_inverted_index.disparities","character", +"ploswater","ploswater","abstract_inverted_index.great","numeric", +"ploswater","ploswater","abstract_inverted_index.little","numeric", +"ploswater","ploswater","abstract_inverted_index.condition","character", +"ploswater","ploswater","abstract_inverted_index.making","character", +"ploswater","ploswater","abstract_inverted_index.financial","numeric", +"ploswater","ploswater","abstract_inverted_index.decision","character", +"ploswater","ploswater","abstract_inverted_index.clean","character", +"ploswater","ploswater","abstract_inverted_index.substantial","character", +"ploswater","ploswater","abstract_inverted_index.States","character", +"ploswater","ploswater","abstract_inverted_index.cannot","numeric", +"ploswater","ploswater","abstract_inverted_index.pathways","character", +"ploswater","ploswater","abstract_inverted_index.influence","character", +"ploswater","ploswater","abstract_inverted_index.behaviors","numeric", +"ploswater","ploswater","abstract_inverted_index.vulnerable","character", +"ploswater","ploswater","abstract_inverted_index.interviewed","character", +"ploswater","ploswater","abstract_inverted_index.low-income","character", +"ploswater","ploswater","abstract_inverted_index.bill","character", +"ploswater","ploswater","abstract_inverted_index.content","numeric", +"ploswater","ploswater","abstract_inverted_index.interview","numeric", +"ploswater","ploswater","abstract_inverted_index.Results","numeric", +"ploswater","ploswater","abstract_inverted_index.showed","character", +"ploswater","ploswater","abstract_inverted_index.ways","character", +"ploswater","ploswater","abstract_inverted_index.made","character", +"ploswater","ploswater","abstract_inverted_index.times.","numeric", +"ploswater","ploswater","abstract_inverted_index.influenced","numeric", +"ploswater","ploswater","abstract_inverted_index.utility","character", +"ploswater","ploswater","abstract_inverted_index.included","character", +"ploswater","ploswater","abstract_inverted_index.reduced","numeric", +"ploswater","ploswater","abstract_inverted_index.decline","numeric", +"ploswater","ploswater","abstract_inverted_index.government","character", +"ploswater","ploswater","abstract_inverted_index.affordable","character", +"ploswater","ploswater","abstract_inverted_index.households.","character", +"ploswater","ploswater","abstract_inverted_index.infrastructure,","character", +"ploswater","ploswater","abstract_inverted_index.state","character", +"ploswater","ploswater","abstract_inverted_index.well","character", +"ploswater","ploswater","abstract_inverted_index.municipal","character", +"ploswater","ploswater","abstract_inverted_index.policies","character", +"ploswater","ploswater","abstract_inverted_index.households","character", +"ploswater","ploswater","abstract_inverted_index.growing","character", +"ploswater","ploswater","abstract_inverted_index.residents","character", +"ploswater","ploswater","abstract_inverted_index.balance","character", +"ploswater","ploswater","abstract_inverted_index.resulting","character", +"ploswater","ploswater","abstract_inverted_index.affect","numeric", +"ploswater","ploswater","abstract_inverted_index.loss","character", +"ploswater","ploswater","abstract_inverted_index.impact","character", +"ploswater","ploswater","abstract_inverted_index.system,","character", +"ploswater","ploswater","abstract_inverted_index.influencing","numeric", +"ploswater","ploswater","abstract_inverted_index.frequency","character", +"ploswater","ploswater","abstract_inverted_index.During","numeric", +"ploswater","ploswater","abstract_inverted_index.past","character", +"ploswater","ploswater","abstract_inverted_index.basin","character", +"ploswater","ploswater","abstract_inverted_index.uses","numeric", +"ploswater","ploswater","abstract_inverted_index.along","character", +"ploswater","ploswater","abstract_inverted_index.predicted","character", +"ploswater","ploswater","abstract_inverted_index.temporal","character", +"ploswater","ploswater","abstract_inverted_index.spatial","character", +"ploswater","ploswater","abstract_inverted_index.sediment","character", +"ploswater","ploswater","abstract_inverted_index.effective","character", +"ploswater","ploswater","abstract_inverted_index.50%","numeric", +"ploswater","ploswater","abstract_inverted_index.baseline","character", +"ploswater","ploswater","abstract_inverted_index.cause","character", +"ploswater","ploswater","abstract_inverted_index.3%","character", +"ploswater","ploswater","abstract_inverted_index.mean","character", +"ploswater","ploswater","abstract_inverted_index.surface","character", +"ploswater","ploswater","abstract_inverted_index.solid","character", +"ploswater","ploswater","abstract_inverted_index.estimated","character", +"ploswater","ploswater","abstract_inverted_index.concentrations","character", +"ploswater","ploswater","abstract_inverted_index.cover","numeric", +"ploswater","ploswater","abstract_inverted_index.biochar","character", +"ploswater","ploswater","abstract_inverted_index.remove","numeric", +"ploswater","ploswater","abstract_inverted_index.improve","character", +"ploswater","ploswater","abstract_inverted_index.P","character", +"ploswater","ploswater","abstract_inverted_index.molecular","numeric", +"ploswater","ploswater","abstract_inverted_index.carbon","character", +"ploswater","ploswater","abstract_inverted_index.produced","character", +"ploswater","ploswater","abstract_inverted_index.under","character", +"ploswater","ploswater","abstract_inverted_index.3","character", +"ploswater","ploswater","abstract_inverted_index.gas","character", +"ploswater","ploswater","abstract_inverted_index.mass","numeric", +"ploswater","ploswater","abstract_inverted_index.capacities","character", +"ploswater","ploswater","abstract_inverted_index.near","character", +"ploswater","ploswater","abstract_inverted_index.structure","numeric", +"ploswater","ploswater","abstract_inverted_index.indicated","numeric", +"ploswater","ploswater","abstract_inverted_index.advance","character", +"ploswater","ploswater","abstract_inverted_index.treatment","character", +"ploswater","ploswater","abstract_inverted_index.processes","character", +"ploswater","ploswater","abstract_inverted_index.employed","numeric", +"ploswater","ploswater","abstract_inverted_index.stormwater","character", +"ploswater","ploswater","abstract_inverted_index.stream","character", +"ploswater","ploswater","abstract_inverted_index.performance","character", +"ploswater","ploswater","abstract_inverted_index.metrics","character", +"ploswater","ploswater","abstract_inverted_index.they","character", +"ploswater","ploswater","abstract_inverted_index.catchment","character", +"ploswater","ploswater","abstract_inverted_index.aimed","numeric", +"ploswater","ploswater","abstract_inverted_index.response","character", +"ploswater","ploswater","abstract_inverted_index.application","character", +"ploswater","ploswater","abstract_inverted_index.experiment","numeric", +"ploswater","ploswater","abstract_inverted_index.test","character", +"ploswater","ploswater","abstract_inverted_index.improved","character", +"ploswater","ploswater","abstract_inverted_index.achieved","character", +"ploswater","ploswater","abstract_inverted_index.experimental","character", +"ploswater","ploswater","abstract_inverted_index.similar","character", +"ploswater","ploswater","abstract_inverted_index.per","character", +"ploswater","ploswater","abstract_inverted_index.implementation","character", +"ploswater","ploswater","abstract_inverted_index.achieve","character", +"ploswater","ploswater","abstract_inverted_index.success","numeric", +"ploswater","ploswater","abstract_inverted_index.final","numeric", +"ploswater","ploswater","abstract_inverted_index.into","character", +"ploswater","ploswater","abstract_inverted_index.demand","character", +"ploswater","ploswater","abstract_inverted_index.measure","character", +"ploswater","ploswater","abstract_inverted_index.period","character", +"ploswater","ploswater","abstract_inverted_index.varied","character", +"ploswater","ploswater","abstract_inverted_index.modelling","character", +"ploswater","ploswater","abstract_inverted_index.broader","character", +"ploswater","ploswater","abstract_inverted_index.decades","numeric", +"ploswater","ploswater","abstract_inverted_index.environmental","character", +"ploswater","ploswater","abstract_inverted_index.surveillance","character", +"ploswater","ploswater","abstract_inverted_index.pathogens","character", +"ploswater","ploswater","abstract_inverted_index.single","character", +"ploswater","ploswater","abstract_inverted_index.pathogen","character", +"ploswater","ploswater","abstract_inverted_index.small","character", +"ploswater","ploswater","abstract_inverted_index.few","numeric", +"ploswater","ploswater","abstract_inverted_index.quantitative","character", +"ploswater","ploswater","abstract_inverted_index.developed","character", +"ploswater","ploswater","abstract_inverted_index.targets","character", +"ploswater","ploswater","abstract_inverted_index.applied","character", +"ploswater","ploswater","abstract_inverted_index.samples","character", +"ploswater","ploswater","abstract_inverted_index.plants","character", +"ploswater","ploswater","abstract_inverted_index.From","numeric", +"ploswater","ploswater","abstract_inverted_index.detected","character", +"ploswater","ploswater","abstract_inverted_index.find","character", +"ploswater","ploswater","abstract_inverted_index.E","character", +"ploswater","ploswater","abstract_inverted_index..","character", +"ploswater","ploswater","abstract_inverted_index.coli","character", +"ploswater","ploswater","abstract_inverted_index.stable","numeric", +"ploswater","ploswater","abstract_inverted_index.notable","numeric", +"ploswater","ploswater","abstract_inverted_index.,","character", +"ploswater","ploswater","abstract_inverted_index.broad","character", +"ploswater","ploswater","abstract_inverted_index.expanding","numeric", +"ploswater","ploswater","abstract_inverted_index.fecal","character", +"ploswater","ploswater","abstract_inverted_index.waste","character", +"ploswater","ploswater","abstract_inverted_index.solids","character", +"ploswater","ploswater","abstract_inverted_index.changed","numeric", +"ploswater","ploswater","abstract_inverted_index.objective","character", +"ploswater","ploswater","abstract_inverted_index.One","character", +"ploswater","ploswater","abstract_inverted_index.when","character", +"ploswater","ploswater","abstract_inverted_index.To","numeric", +"ploswater","ploswater","abstract_inverted_index.trend","character", +"ploswater","ploswater","abstract_inverted_index.index","numeric", +"ploswater","ploswater","abstract_inverted_index.measurements","character", +"ploswater","ploswater","abstract_inverted_index.characterize","character", +"ploswater","ploswater","abstract_inverted_index.trends.","character", +"ploswater","ploswater","abstract_inverted_index.better","character", +"ploswater","ploswater","abstract_inverted_index.so","character", +"ploswater","ploswater","abstract_inverted_index.5","character", +"ploswater","ploswater","abstract_inverted_index.detect","numeric", +"ploswater","ploswater","abstract_inverted_index.respectively.","character", +"ploswater","ploswater","abstract_inverted_index.providing","numeric", +"ploswater","ploswater","abstract_inverted_index.changing","character", +"ploswater","ploswater","abstract_inverted_index.2021","numeric", +"ploswater","ploswater","abstract_inverted_index.without","character", +"ploswater","ploswater","abstract_inverted_index.domestic","character", +"ploswater","ploswater","abstract_inverted_index.systems","character", +"ploswater","ploswater","abstract_inverted_index.performed","character", +"ploswater","ploswater","abstract_inverted_index.combined","character", +"ploswater","ploswater","abstract_inverted_index.Texas","numeric", +"ploswater","ploswater","abstract_inverted_index.affected","numeric", +"ploswater","ploswater","abstract_inverted_index.populations","character", +"ploswater","ploswater","abstract_inverted_index.cross-sectional","numeric", +"ploswater","ploswater","abstract_inverted_index.survey","character", +"ploswater","ploswater","abstract_inverted_index.shows","character", +"ploswater","ploswater","abstract_inverted_index.size","character", +"ploswater","ploswater","abstract_inverted_index.system.","numeric", +"ploswater","ploswater","abstract_inverted_index.mostly","character", +"ploswater","ploswater","abstract_inverted_index.disproportionately","numeric", +"ploswater","ploswater","abstract_inverted_index.likely","character", +"ploswater","ploswater","abstract_inverted_index.utilities","character", +"ploswater","ploswater","abstract_inverted_index.respondents","character", +"ploswater","ploswater","abstract_inverted_index.resilience","numeric", +"ploswater","ploswater","abstract_inverted_index.efficient","character", +"ploswater","ploswater","abstract_inverted_index.emergency","numeric", +"ploswater","ploswater","abstract_inverted_index.physical","numeric", +"ploswater","ploswater","abstract_inverted_index.based","character", +"ploswater","ploswater","abstract_inverted_index.system","character", +"ploswater","ploswater","abstract_inverted_index.complex","character", +"ploswater","ploswater","abstract_inverted_index.conventional","character", +"ploswater","ploswater","abstract_inverted_index.remote","character", +"ploswater","ploswater","abstract_inverted_index.sensing","character", +"ploswater","ploswater","abstract_inverted_index.New","character", +"ploswater","ploswater","abstract_inverted_index.addressing","character", +"ploswater","ploswater","abstract_inverted_index.mainly","numeric", +"ploswater","ploswater","abstract_inverted_index.types","numeric", +"ploswater","ploswater","abstract_inverted_index.problems","character", +"ploswater","ploswater","abstract_inverted_index.challenges,","character", +"ploswater","ploswater","abstract_inverted_index.identify","character", +"ploswater","ploswater","abstract_inverted_index.opportunities","character", +"ploswater","ploswater","abstract_inverted_index.hydrology","character", +"ploswater","ploswater","abstract_inverted_index.around","character", +"ploswater","ploswater","abstract_inverted_index.insights","numeric", +"ploswater","ploswater","abstract_inverted_index.just","numeric", +"ploswater","ploswater","abstract_inverted_index.propose","character", +"ploswater","ploswater","abstract_inverted_index.larger","numeric", +"ploswater","ploswater","abstract_inverted_index.big","numeric", +"ploswater","ploswater","abstract_inverted_index.call","numeric", +"ploswater","ploswater","abstract_inverted_index.action","character", +"ploswater","ploswater","abstract_inverted_index.context","numeric", +"ploswater","ploswater","abstract_inverted_index.practice","character", +"ploswater","ploswater","abstract_inverted_index.sector","character", +"ploswater","ploswater","abstract_inverted_index.private","character", +"ploswater","ploswater","abstract_inverted_index.engagement","character", +"ploswater","ploswater","abstract_inverted_index.good","character", +"ploswater","ploswater","abstract_inverted_index.very","character", +"ploswater","ploswater","abstract_inverted_index.issue","character", +"ploswater","ploswater","abstract_inverted_index.pollution","character", +"ploswater","ploswater","abstract_inverted_index.throughout","character", +"ploswater","ploswater","abstract_inverted_index.entire","character", +"ploswater","ploswater","abstract_inverted_index.West","character", +"ploswater","ploswater","abstract_inverted_index.distribution","character", +"ploswater","ploswater","abstract_inverted_index.pollutants","character", +"ploswater","ploswater","abstract_inverted_index.considering","numeric", +"ploswater","ploswater","abstract_inverted_index.level,","character", +"ploswater","ploswater","abstract_inverted_index.next","numeric", +"ploswater","ploswater","abstract_inverted_index.generated","numeric", +"ploswater","ploswater","abstract_inverted_index.level","character", +"ploswater","ploswater","abstract_inverted_index.each","character", +"ploswater","ploswater","abstract_inverted_index.selected","character", +"ploswater","ploswater","abstract_inverted_index.estimate","character", +"ploswater","ploswater","abstract_inverted_index.low","character", +"ploswater","ploswater","abstract_inverted_index.alternative","character", +"ploswater","ploswater","abstract_inverted_index.solution","character", +"ploswater","ploswater","abstract_inverted_index.globally","numeric", +"ploswater","ploswater","abstract_inverted_index.precipitation,","numeric", +"ploswater","ploswater","abstract_inverted_index.processes.","numeric", +"ploswater","ploswater","abstract_inverted_index.performance.","numeric", +"ploswater","ploswater","abstract_inverted_index.estimating","numeric", +"ploswater","ploswater","abstract_inverted_index.characteristics","character", +"ploswater","ploswater","abstract_inverted_index.remains","numeric", +"ploswater","ploswater","abstract_inverted_index.models,","numeric", +"ploswater","ploswater","abstract_inverted_index.method.","numeric", +"ploswater","ploswater","abstract_inverted_index.Spatial","numeric", +"ploswater","ploswater","abstract_inverted_index.associated","character", +"ploswater","ploswater","abstract_inverted_index.cold","character", +"ploswater","ploswater","abstract_inverted_index.association","numeric", +"ploswater","ploswater","abstract_inverted_index.variations","character", +"ploswater","ploswater","abstract_inverted_index.operational","character", +"ploswater","ploswater","abstract_inverted_index.full-scale","numeric", +"ploswater","ploswater","abstract_inverted_index.integration","character", +"ploswater","ploswater","abstract_inverted_index.chemical","character", +"ploswater","ploswater","abstract_inverted_index.accumulation","character", +"ploswater","ploswater","abstract_inverted_index.being","character", +"ploswater","ploswater","abstract_inverted_index.driver","numeric", +"ploswater","ploswater","abstract_inverted_index.upon","numeric", +"ploswater","ploswater","abstract_inverted_index.complex,","numeric", +"ploswater","ploswater","abstract_inverted_index.indicating","character", +"ploswater","ploswater","abstract_inverted_index.These","character", +"ploswater","ploswater","abstract_inverted_index.water.","character", +"ploswater","ploswater","abstract_inverted_index.By","character", +"ploswater","ploswater","abstract_inverted_index.process,","character", +"ploswater","ploswater","abstract_inverted_index.targeting","numeric", +"ploswater","ploswater","abstract_inverted_index.long-term","character", +"ploswater","ploswater","abstract_inverted_index.quality.","character", +"ploswater","ploswater","abstract_inverted_index.urbanization,","numeric", +"ploswater","ploswater","abstract_inverted_index.population","character", +"ploswater","ploswater","abstract_inverted_index.inequality","character", +"ploswater","ploswater","abstract_inverted_index.study,","character", +"ploswater","ploswater","abstract_inverted_index.peri-urban","character", +"ploswater","ploswater","abstract_inverted_index.examine","character", +"ploswater","ploswater","abstract_inverted_index.explained","character", +"ploswater","ploswater","abstract_inverted_index.regression","character", +"ploswater","ploswater","abstract_inverted_index.source","character", +"ploswater","ploswater","abstract_inverted_index.pressure","numeric", +"ploswater","ploswater","abstract_inverted_index.supply","character", +"ploswater","ploswater","abstract_inverted_index.odds","character", +"ploswater","ploswater","abstract_inverted_index.ratio","numeric", +"ploswater","ploswater","abstract_inverted_index.factor","character", +"ploswater","ploswater","abstract_inverted_index.Findings","numeric", +"ploswater","ploswater","abstract_inverted_index.even","character", +"ploswater","ploswater","abstract_inverted_index.services,","character", +"ploswater","ploswater","abstract_inverted_index.stakeholders","character", +"ploswater","ploswater","abstract_inverted_index.guide","numeric", +"ploswater","ploswater","abstract_inverted_index.infrastructural","numeric", +"ploswater","ploswater","abstract_inverted_index.settings.","numeric", +"ploswater","ploswater","abstract_inverted_index.dynamics","character", +"ploswater","ploswater","abstract_inverted_index.transboundary","character", +"ploswater","ploswater","abstract_inverted_index.nature","numeric", +"ploswater","ploswater","abstract_inverted_index.cross","numeric", +"ploswater","ploswater","abstract_inverted_index.rivers,","character", +"ploswater","ploswater","abstract_inverted_index.Thus,","numeric", +"ploswater","ploswater","abstract_inverted_index.defined","character", +"ploswater","ploswater","abstract_inverted_index.beyond","numeric", +"ploswater","ploswater","abstract_inverted_index.field","character", +"ploswater","ploswater","abstract_inverted_index.concept.","numeric", +"ploswater","ploswater","abstract_inverted_index.With","numeric", +"ploswater","ploswater","abstract_inverted_index.riverine","character", +"ploswater","ploswater","abstract_inverted_index.become","character", +"ploswater","ploswater","abstract_inverted_index.crucial","numeric", +"ploswater","ploswater","abstract_inverted_index.study.","numeric", +"ploswater","ploswater","abstract_inverted_index.i.e.,","character", +"ploswater","ploswater","abstract_inverted_index.Yet,","numeric", +"ploswater","ploswater","abstract_inverted_index.primary","character", +"ploswater","ploswater","abstract_inverted_index.because","character", +"ploswater","ploswater","abstract_inverted_index.cities","character", +"ploswater","ploswater","abstract_inverted_index.Moreover,","numeric", +"ploswater","ploswater","abstract_inverted_index.what","character", +"ploswater","ploswater","abstract_inverted_index.them","numeric", +"ploswater","ploswater","abstract_inverted_index.do","character", +"ploswater","ploswater","abstract_inverted_index.ability","character", +"ploswater","ploswater","abstract_inverted_index.extensive","numeric", +"ploswater","ploswater","abstract_inverted_index.qualitative","numeric", +"ploswater","ploswater","abstract_inverted_index.South","character", +"ploswater","ploswater","abstract_inverted_index.purpose","numeric", +"ploswater","ploswater","abstract_inverted_index.article","numeric", +"ploswater","ploswater","abstract_inverted_index.poor","character", +"ploswater","ploswater","abstract_inverted_index.toward","character", +"ploswater","ploswater","abstract_inverted_index.community.","numeric", +"ploswater","ploswater","abstract_inverted_index.include","numeric", +"ploswater","ploswater","abstract_inverted_index.education","character", +"ploswater","ploswater","abstract_inverted_index.towards","numeric", +"ploswater","ploswater","abstract_inverted_index.equitable","numeric", +"ploswater","ploswater","abstract_inverted_index.and,","character", +"ploswater","ploswater","abstract_inverted_index.on-site","character", +"ploswater","ploswater","abstract_inverted_index.aims","numeric", +"ploswater","ploswater","abstract_inverted_index.taken","character", +"ploswater","ploswater","abstract_inverted_index.parameters.","numeric", +"ploswater","ploswater","abstract_inverted_index.hydrologic","character", +"ploswater","ploswater","abstract_inverted_index.while","character", +"ploswater","ploswater","abstract_inverted_index.assessed","character", +"ploswater","ploswater","abstract_inverted_index.downstream","character", +"ploswater","ploswater","abstract_inverted_index.difficulties","numeric", +"ploswater","ploswater","abstract_inverted_index.simulate","character", +"ploswater","ploswater","abstract_inverted_index.conditions,","numeric", +"ploswater","ploswater","abstract_inverted_index.contaminants.","character", +"ploswater","ploswater","abstract_inverted_index.scale","character", +"ploswater","ploswater","abstract_inverted_index.National","numeric", +"ploswater","ploswater","abstract_inverted_index.Monitoring","character", +"ploswater","ploswater","abstract_inverted_index.monitored","character", +"ploswater","ploswater","abstract_inverted_index.antimicrobial","character", +"ploswater","ploswater","abstract_inverted_index.alignment","character", +"ploswater","ploswater","abstract_inverted_index.Health","character", +"ploswater","ploswater","abstract_inverted_index.planning,","character", +"ploswater","ploswater","abstract_inverted_index.waters","character", +"ploswater","ploswater","abstract_inverted_index.function","character", +"ploswater","ploswater","abstract_inverted_index.humans,","numeric", +"ploswater","ploswater","abstract_inverted_index.animals,","numeric", +"ploswater","ploswater","abstract_inverted_index.environment.","numeric", +"ploswater","ploswater","abstract_inverted_index.sequencing","character", +"ploswater","ploswater","abstract_inverted_index.coverage","character", +"ploswater","ploswater","abstract_inverted_index.shown","numeric", +"ploswater","ploswater","abstract_inverted_index.enhance","character", +"ploswater","ploswater","abstract_inverted_index.report","character", +"ploswater","ploswater","abstract_inverted_index.profile","character", +"ploswater","ploswater","abstract_inverted_index.distinct","character", +"ploswater","ploswater","abstract_inverted_index.sites","character", +"ploswater","ploswater","abstract_inverted_index.enriched","numeric", +"ploswater","ploswater","abstract_inverted_index.almost","numeric", +"ploswater","ploswater","abstract_inverted_index.30%","numeric", +"ploswater","ploswater","abstract_inverted_index.Additionally,","numeric", +"ploswater","ploswater","abstract_inverted_index.specific","character", +"ploswater","ploswater","abstract_inverted_index.sites.","character", +"ploswater","ploswater","abstract_inverted_index.Development","character", +"ploswater","ploswater","abstract_inverted_index.technologies","character", +"ploswater","ploswater","abstract_inverted_index.vulnerability","character", +"ploswater","ploswater","abstract_inverted_index.scheme","numeric", +"ploswater","ploswater","abstract_inverted_index.design","character", +"ploswater","ploswater","abstract_inverted_index.period.","character", +"ploswater","ploswater","abstract_inverted_index.variables","character", +"ploswater","ploswater","abstract_inverted_index.less","character", +"ploswater","ploswater","abstract_inverted_index.treatment.","character", +"ploswater","ploswater","abstract_inverted_index.conclude","numeric", +"ploswater","ploswater","abstract_inverted_index.appropriate","numeric", +"ploswater","ploswater","abstract_inverted_index.urgent","numeric", +"ploswater","ploswater","abstract_inverted_index.set","character", +"ploswater","ploswater","abstract_inverted_index.pressures","numeric", +"ploswater","ploswater","abstract_inverted_index.wastewater,","numeric", +"ploswater","ploswater","abstract_inverted_index.maintain","numeric", +"ploswater","ploswater","abstract_inverted_index.involve","numeric", +"ploswater","ploswater","abstract_inverted_index.general","character", +"ploswater","ploswater","abstract_inverted_index.way","character", +"ploswater","ploswater","abstract_inverted_index.get","numeric", +"ploswater","ploswater","abstract_inverted_index.participation","numeric", +"ploswater","ploswater","abstract_inverted_index.world","character", +"ploswater","ploswater","abstract_inverted_index.take","character", +"ploswater","ploswater","abstract_inverted_index.groundwater","character", +"ploswater","ploswater","abstract_inverted_index.science,","numeric", +"ploswater","ploswater","abstract_inverted_index.respect","numeric", +"ploswater","ploswater","abstract_inverted_index.authorities","character", +"ploswater","ploswater","abstract_inverted_index.social","character", +"ploswater","ploswater","abstract_inverted_index.knowledge,","character", +"ploswater","ploswater","abstract_inverted_index.environment,","numeric", +"ploswater","ploswater","abstract_inverted_index.encourage","numeric", +"ploswater","ploswater","abstract_inverted_index.tap","character", +"ploswater","ploswater","abstract_inverted_index.effect","character", +"ploswater","ploswater","abstract_inverted_index.composition","character", +"ploswater","ploswater","abstract_inverted_index.relatively","character", +"ploswater","ploswater","abstract_inverted_index.simple","numeric", +"ploswater","ploswater","abstract_inverted_index.adapted","numeric", +"ploswater","ploswater","abstract_inverted_index.expertise","numeric", +"ploswater","ploswater","abstract_inverted_index.manage","numeric", +"ploswater","ploswater","abstract_inverted_index.safety","character", +"ploswater","ploswater","abstract_inverted_index.exacerbated","numeric", +"ploswater","ploswater","abstract_inverted_index.working","numeric", +"ploswater","ploswater","abstract_inverted_index.capacity,","numeric", +"ploswater","ploswater","abstract_inverted_index.informant","character", +"ploswater","ploswater","abstract_inverted_index.10","character", +"ploswater","ploswater","abstract_inverted_index.risks","character", +"ploswater","ploswater","abstract_inverted_index.led","character", +"ploswater","ploswater","abstract_inverted_index.adequate","numeric", +"ploswater","ploswater","abstract_inverted_index.diseases","numeric", +"ploswater","ploswater","abstract_inverted_index.investigated","numeric", +"ploswater","ploswater","abstract_inverted_index.recommended","numeric", +"ploswater","ploswater","abstract_inverted_index.active","numeric", +"ploswater","ploswater","abstract_inverted_index.training","character", +"ploswater","ploswater","abstract_inverted_index.flood","character", +"ploswater","ploswater","abstract_inverted_index.treated","character", +"ploswater","ploswater","abstract_inverted_index.industrial","numeric", +"ploswater","ploswater","abstract_inverted_index.demands","character", +"ploswater","ploswater","abstract_inverted_index.up","character", +"ploswater","ploswater","abstract_inverted_index.put","numeric", +"ploswater","ploswater","abstract_inverted_index.governance","character", +"ploswater","ploswater","abstract_inverted_index.respond","character", +"ploswater","ploswater","abstract_inverted_index.values","character", +"ploswater","ploswater","abstract_inverted_index.complexities","numeric", +"ploswater","ploswater","abstract_inverted_index.status","character", +"ploswater","ploswater","abstract_inverted_index.time,","character", +"ploswater","ploswater","abstract_inverted_index.exist","numeric", +"ploswater","ploswater","abstract_inverted_index.groups","character", +"ploswater","ploswater","abstract_inverted_index.regional","character", +"ploswater","ploswater","abstract_inverted_index.networks","character", +"ploswater","ploswater","abstract_inverted_index.representation","character", +"ploswater","ploswater","abstract_inverted_index.operate","numeric", +"ploswater","ploswater","abstract_inverted_index.activities","character", +"ploswater","ploswater","abstract_inverted_index.project","character", +"ploswater","ploswater","abstract_inverted_index.designs","character", +"ploswater","ploswater","abstract_inverted_index.largest","character", +"ploswater","ploswater","abstract_inverted_index.located","numeric", +"ploswater","ploswater","abstract_inverted_index.m","character", +"ploswater","ploswater","abstract_inverted_index.meet","character", +"ploswater","ploswater","abstract_inverted_index.income","character", +"ploswater","ploswater","abstract_inverted_index.census","numeric", +"ploswater","ploswater","abstract_inverted_index.users","character", +"ploswater","ploswater","abstract_inverted_index.).","numeric", +"ploswater","ploswater","abstract_inverted_index.rather","character", +"ploswater","ploswater","abstract_inverted_index.patterns,","numeric", +"ploswater","ploswater","abstract_inverted_index.patterns","character", +"ploswater","ploswater","abstract_inverted_index.products","character", +"ploswater","ploswater","abstract_inverted_index.techniques","character", +"ploswater","ploswater","abstract_inverted_index.addition","numeric", +"ploswater","ploswater","abstract_inverted_index.evaluated","character", +"ploswater","ploswater","abstract_inverted_index.monthly","character", +"ploswater","ploswater","abstract_inverted_index.statistical","numeric", +"ploswater","ploswater","abstract_inverted_index.indicators","character", +"ploswater","ploswater","abstract_inverted_index.correlation","character", +"ploswater","ploswater","abstract_inverted_index.consistently","character", +"ploswater","ploswater","abstract_inverted_index.Overall,","numeric", +"ploswater","ploswater","abstract_inverted_index.country","character", +"ploswater","ploswater","abstract_inverted_index.type","numeric", +"ploswater","ploswater","abstract_inverted_index.time.","numeric", +"ploswater","ploswater","abstract_inverted_index.technical","character", +"ploswater","ploswater","abstract_inverted_index.paper","character", +"ploswater","ploswater","abstract_inverted_index.researchers","numeric", +"ploswater","ploswater","abstract_inverted_index.demonstrated","character", +"ploswater","ploswater","abstract_inverted_index.irrigated","character", +"ploswater","ploswater","abstract_inverted_index.Specifically,","numeric", +"ploswater","ploswater","abstract_inverted_index.nine","numeric", +"ploswater","ploswater","abstract_inverted_index.30","character", +"ploswater","ploswater","abstract_inverted_index.tested","numeric", +"ploswater","ploswater","abstract_inverted_index.individually","numeric", +"ploswater","ploswater","abstract_inverted_index.obtained","character", +"ploswater","ploswater","abstract_inverted_index.years,","numeric", +"ploswater","ploswater","abstract_inverted_index.applicable","numeric", +"ploswater","ploswater","abstract_inverted_index.oxygen","character", +"ploswater","ploswater","abstract_inverted_index.effluent","character", +"ploswater","ploswater","abstract_inverted_index.secondary","character", +"ploswater","ploswater","abstract_inverted_index.costs","character", +"ploswater","ploswater","abstract_inverted_index.still","character", +"ploswater","ploswater","abstract_inverted_index.promising","numeric", +"ploswater","ploswater","abstract_inverted_index.reports","character", +"ploswater","ploswater","abstract_inverted_index.)","numeric", +"ploswater","ploswater","abstract_inverted_index.installed","numeric", +"ploswater","ploswater","abstract_inverted_index.months","numeric", +"ploswater","ploswater","abstract_inverted_index.measured","character", +"ploswater","ploswater","abstract_inverted_index.evaluation","character", +"ploswater","ploswater","abstract_inverted_index.show","character", +"ploswater","ploswater","abstract_inverted_index.nearly","numeric", +"ploswater","ploswater","abstract_inverted_index.desired","numeric", +"ploswater","ploswater","abstract_inverted_index.target","character", +"ploswater","ploswater","abstract_inverted_index.varying","numeric", +"ploswater","ploswater","abstract_inverted_index.measurement","character", +"ploswater","ploswater","abstract_inverted_index.share","character", +"ploswater","ploswater","abstract_inverted_index.There","character", +"ploswater","ploswater","abstract_inverted_index.waters,","numeric", +"ploswater","ploswater","abstract_inverted_index.detection","character", +"ploswater","ploswater","abstract_inverted_index.quantified","character", +"ploswater","ploswater","abstract_inverted_index.timely","numeric", +"ploswater","ploswater","abstract_inverted_index.waters.","character", +"ploswater","ploswater","abstract_inverted_index.largely","character", +"ploswater","ploswater","abstract_inverted_index.governance,","numeric", +"ploswater","ploswater","abstract_inverted_index.management.","numeric", +"ploswater","ploswater","abstract_inverted_index.learn","character", +"ploswater","ploswater","abstract_inverted_index.enabling","character", +"ploswater","ploswater","abstract_inverted_index.Kenya.","numeric", +"ploswater","ploswater","abstract_inverted_index.below","numeric", +"ploswater","ploswater","abstract_inverted_index.Furthermore,","numeric", +"ploswater","ploswater","abstract_inverted_index.Escherichia","character", +"ploswater","ploswater","abstract_inverted_index.samples,","character", +"ploswater","ploswater","abstract_inverted_index.3)","character", +"ploswater","ploswater","abstract_inverted_index.detected.","numeric", +"ploswater","ploswater","abstract_inverted_index.They","numeric", +"ploswater","ploswater","abstract_inverted_index.together","numeric", +"ploswater","ploswater","abstract_inverted_index.driven","character", +"ploswater","ploswater","abstract_inverted_index.rapid","character", +"ploswater","ploswater","abstract_inverted_index.calls","numeric", +"ploswater","ploswater","abstract_inverted_index.efforts.","character", +"ploswater","ploswater","abstract_inverted_index.reliable","numeric", +"ploswater","ploswater","abstract_inverted_index.international","character", +"ploswater","ploswater","abstract_inverted_index.national","character", +"ploswater","ploswater","abstract_inverted_index.improvements","character", +"ploswater","ploswater","abstract_inverted_index.underlying","character", +"ploswater","ploswater","abstract_inverted_index.map","numeric", +"ploswater","ploswater","abstract_inverted_index.implemented","numeric", +"ploswater","ploswater","abstract_inverted_index.restoration","character", +"ploswater","ploswater","abstract_inverted_index.interconnected","numeric", +"ploswater","ploswater","abstract_inverted_index.directly","character", +"ploswater","ploswater","abstract_inverted_index.opportunity","character", +"ploswater","ploswater","abstract_inverted_index.driving","character", +"ploswater","ploswater","abstract_inverted_index.vision","character", +"ploswater","ploswater","abstract_inverted_index.free","character", +"ploswater","ploswater","abstract_inverted_index.known","numeric", +"ploswater","ploswater","abstract_inverted_index.parts","character", +"ploswater","ploswater","abstract_inverted_index.temperature,","character", +"ploswater","ploswater","abstract_inverted_index.All","numeric", +"ploswater","ploswater","abstract_inverted_index.residence","numeric", +"ploswater","ploswater","abstract_inverted_index.culture","character", +"ploswater","ploswater","abstract_inverted_index.aeruginosa","character", +"ploswater","ploswater","abstract_inverted_index.storage","character", +"ploswater","ploswater","abstract_inverted_index.bacteria","character", +"ploswater","ploswater","abstract_inverted_index.presence","character", +"ploswater","ploswater","abstract_inverted_index.genome","character", +"ploswater","ploswater","abstract_inverted_index.Despite","character", +"ploswater","ploswater","abstract_inverted_index.pit","character", +"ploswater","ploswater","abstract_inverted_index.latrines","character", +"ploswater","ploswater","abstract_inverted_index.understood.","numeric", +"ploswater","ploswater","abstract_inverted_index.characterized","numeric", +"ploswater","ploswater","abstract_inverted_index.sludge","character", +"ploswater","ploswater","abstract_inverted_index.surveys","numeric", +"ploswater","ploswater","abstract_inverted_index.contain","numeric", +"ploswater","ploswater","abstract_inverted_index.area.","character", +"ploswater","ploswater","abstract_inverted_index.degradation","numeric", +"ploswater","ploswater","abstract_inverted_index.maintenance","character", +"ploswater","ploswater","abstract_inverted_index.governments","character", +"ploswater","ploswater","abstract_inverted_index.released","numeric", +"ploswater","ploswater","abstract_inverted_index.promote","numeric", +"ploswater","ploswater","abstract_inverted_index.actors","character", +"ploswater","ploswater","abstract_inverted_index.assigned","numeric", +"ploswater","ploswater","abstract_inverted_index.93","numeric", +"ploswater","ploswater","abstract_inverted_index.influences","character", +"ploswater","ploswater","abstract_inverted_index.formal","character", +"ploswater","ploswater","abstract_inverted_index.align","numeric", +"ploswater","ploswater","abstract_inverted_index.recommend","character", +"ploswater","ploswater","abstract_inverted_index.expand","numeric", +"ploswater","ploswater","abstract_inverted_index.shift","numeric", +"ploswater","ploswater","abstract_inverted_index.Water,","numeric", +"ploswater","ploswater","abstract_inverted_index.attributable","numeric", +"ploswater","ploswater","abstract_inverted_index.operation","character", +"ploswater","ploswater","abstract_inverted_index.trained","character", +"ploswater","ploswater","abstract_inverted_index.staff","character", +"ploswater","ploswater","abstract_inverted_index.sustain","character", +"ploswater","ploswater","abstract_inverted_index.guidelines","character", +"ploswater","ploswater","abstract_inverted_index.accountability","numeric", +"ploswater","ploswater","abstract_inverted_index.order","character", +"ploswater","ploswater","abstract_inverted_index.enhanced","numeric", +"ploswater","ploswater","abstract_inverted_index.zero","character", +"ploswater","ploswater","abstract_inverted_index.operator","numeric", +"ploswater","ploswater","abstract_inverted_index.reaching","character", +"ploswater","ploswater","abstract_inverted_index.sectors","character", +"ploswater","ploswater","abstract_inverted_index.relationships","character", +"ploswater","ploswater","abstract_inverted_index.formation","character", +"ploswater","ploswater","abstract_inverted_index.clustering","numeric", +"ploswater","ploswater","abstract_inverted_index.contrast,","numeric", +"ploswater","ploswater","abstract_inverted_index.Multiple","numeric", +"ploswater","ploswater","abstract_inverted_index.compounds","numeric", +"ploswater","ploswater","abstract_inverted_index.containing","character", +"ploswater","ploswater","abstract_inverted_index.Further","numeric", +"ploswater","ploswater","abstract_inverted_index.investigation","numeric", +"ploswater","ploswater","abstract_inverted_index.late","character", +"ploswater","ploswater","abstract_inverted_index.summer","character", +"ploswater","ploswater","abstract_inverted_index.provides","character", +"ploswater","ploswater","abstract_inverted_index.exposure","character", +"ploswater","ploswater","abstract_inverted_index.growth,","numeric", +"ploswater","ploswater","abstract_inverted_index.supply,","numeric", +"ploswater","ploswater","abstract_inverted_index.ensuring","numeric", +"ploswater","ploswater","abstract_inverted_index.quantity","character", +"ploswater","ploswater","abstract_inverted_index.document","character", +"ploswater","ploswater","abstract_inverted_index.primarily","character", +"ploswater","ploswater","abstract_inverted_index.Environmental","character", +"ploswater","ploswater","abstract_inverted_index.First,","numeric", +"ploswater","ploswater","abstract_inverted_index.organic","character", +"ploswater","ploswater","abstract_inverted_index.matter","character", +"ploswater","ploswater","abstract_inverted_index.sewage","character", +"ploswater","ploswater","abstract_inverted_index.operations.","character", +"ploswater","ploswater","abstract_inverted_index.When","character", +"ploswater","ploswater","abstract_inverted_index.civil","numeric", +"ploswater","ploswater","abstract_inverted_index.linked","numeric", +"ploswater","ploswater","abstract_inverted_index.examining","numeric", +"ploswater","ploswater","abstract_inverted_index.contribute","character", +"ploswater","ploswater","abstract_inverted_index.predictors","numeric", +"ploswater","ploswater","abstract_inverted_index.sanitation.","numeric", +"ploswater","ploswater","abstract_inverted_index.Based","character", +"ploswater","ploswater","abstract_inverted_index.research.","numeric", +"ploswater","ploswater","abstract_inverted_index.Ghana","character", +"ploswater","ploswater","abstract_inverted_index.prevalence","character", +"ploswater","ploswater","abstract_inverted_index.piped","character", +"ploswater","ploswater","abstract_inverted_index.third","numeric", +"ploswater","ploswater","abstract_inverted_index.open","character", +"ploswater","ploswater","abstract_inverted_index.members","character", +"ploswater","ploswater","abstract_inverted_index.Key","numeric", +"ploswater","ploswater","abstract_inverted_index.themes","numeric", +"ploswater","ploswater","abstract_inverted_index.1)","character", +"ploswater","ploswater","abstract_inverted_index.2)","character", +"ploswater","ploswater","abstract_inverted_index.city.","character", +"ploswater","ploswater","abstract_inverted_index.loads","character", +"ploswater","ploswater","abstract_inverted_index.Bay","character", +"ploswater","ploswater","abstract_inverted_index.60%","numeric", +"ploswater","ploswater","abstract_inverted_index.shorter","numeric", +"ploswater","ploswater","abstract_inverted_index.median","numeric", +"ploswater","ploswater","abstract_inverted_index.does","numeric", +"ploswater","ploswater","abstract_inverted_index.detectable","numeric", +"ploswater","ploswater","abstract_inverted_index.contamination","character", +"ploswater","ploswater","abstract_inverted_index.infiltration","character", +"ploswater","ploswater","abstract_inverted_index.recharge","character", +"ploswater","ploswater","abstract_inverted_index.groundwater,","numeric", +"ploswater","ploswater","abstract_inverted_index.makes","numeric", +"ploswater","ploswater","abstract_inverted_index.conduct","numeric", +"ploswater","ploswater","abstract_inverted_index.upstream","numeric", +"ploswater","ploswater","abstract_inverted_index.threats","numeric", +"ploswater","ploswater","abstract_inverted_index.activities,","numeric", +"ploswater","ploswater","abstract_inverted_index.following","numeric", +"ploswater","ploswater","abstract_inverted_index.uncertainty","character", +"ploswater","ploswater","abstract_inverted_index.urbanized","character", +"ploswater","ploswater","abstract_inverted_index.air","numeric", +"ploswater","ploswater","abstract_inverted_index.whereas","numeric", +"ploswater","ploswater","abstract_inverted_index.constant","numeric", +"ploswater","ploswater","abstract_inverted_index.years.","character", +"ploswater","ploswater","abstract_inverted_index.useful","character", +"ploswater","ploswater","abstract_inverted_index.conditions.","character", +"ploswater","ploswater","abstract_inverted_index.practitioners","numeric", +"ploswater","ploswater","abstract_inverted_index.rely","character", +"ploswater","ploswater","abstract_inverted_index.rainwater","character", +"ploswater","ploswater","abstract_inverted_index.presents","numeric", +"ploswater","ploswater","abstract_inverted_index.collection","character", +"ploswater","ploswater","abstract_inverted_index.intervention","character", +"ploswater","ploswater","abstract_inverted_index.completed","numeric", +"ploswater","ploswater","abstract_inverted_index.11%","numeric", +"ploswater","ploswater","abstract_inverted_index.remained","numeric", +"ploswater","ploswater","abstract_inverted_index.provision","numeric", +"ploswater","ploswater","abstract_inverted_index.locally","numeric", +"ploswater","ploswater","abstract_inverted_index.countries.","character", +"ploswater","ploswater","abstract_inverted_index.second","numeric", +"ploswater","ploswater","abstract_inverted_index.site","character", +"ploswater","ploswater","abstract_inverted_index.explored","numeric", +"ploswater","ploswater","abstract_inverted_index.interactive","numeric", +"ploswater","ploswater","abstract_inverted_index.intensity","character", +"ploswater","ploswater","abstract_inverted_index.Understanding","numeric", +"ploswater","ploswater","abstract_inverted_index.subsequent","numeric", +"ploswater","ploswater","abstract_inverted_index.flows","character", +"ploswater","ploswater","abstract_inverted_index.detailed","numeric", +"ploswater","ploswater","abstract_inverted_index.watersheds","character", +"ploswater","ploswater","abstract_inverted_index.Upper","character", +"ploswater","ploswater","abstract_inverted_index.dissolved","character", +"ploswater","ploswater","abstract_inverted_index.Colorado","character", +"ploswater","ploswater","abstract_inverted_index.previously","numeric", +"ploswater","ploswater","abstract_inverted_index.protection","numeric", +"ploswater","ploswater","abstract_inverted_index.maximum","character", +"ploswater","ploswater","abstract_inverted_index.contaminant","numeric", +"ploswater","ploswater","abstract_inverted_index.participatory","character", +"ploswater","ploswater","abstract_inverted_index.gender","character", +"ploswater","ploswater","abstract_inverted_index.Cambodia","character", +"ploswater","ploswater","abstract_inverted_index.program","character", +"ploswater","ploswater","abstract_inverted_index.reflect","character", +"ploswater","ploswater","abstract_inverted_index.extent","character", +"ploswater","ploswater","abstract_inverted_index.indicate","character", +"ploswater","ploswater","abstract_inverted_index.engaging","character", +"ploswater","ploswater","abstract_inverted_index.supporting","numeric", +"ploswater","ploswater","abstract_inverted_index.derived","numeric", +"ploswater","ploswater","abstract_inverted_index.sector,","character", +"ploswater","ploswater","abstract_inverted_index.investigate","numeric", +"ploswater","ploswater","abstract_inverted_index.adoption","character", +"ploswater","ploswater","abstract_inverted_index.aged","numeric", +"ploswater","ploswater","abstract_inverted_index.children","character", +"ploswater","ploswater","abstract_inverted_index.facilities.","numeric", +"ploswater","ploswater","abstract_inverted_index.Developing","numeric", +"ploswater","ploswater","abstract_inverted_index.journal","numeric", +"ploswater","ploswater","abstract_inverted_index.articles","numeric", +"ploswater","ploswater","abstract_inverted_index.last","character", +"ploswater","ploswater","abstract_inverted_index.height","numeric", +"ploswater","ploswater","abstract_inverted_index.worldwide","numeric", +"ploswater","ploswater","abstract_inverted_index.offers","numeric", +"ploswater","ploswater","abstract_inverted_index.dynamic","character", +"ploswater","ploswater","abstract_inverted_index.areas,","character", +"ploswater","ploswater","abstract_inverted_index.magnitude","character", +"ploswater","ploswater","abstract_inverted_index.widely","numeric", +"ploswater","ploswater","abstract_inverted_index.humanitarian","character", +"ploswater","ploswater","abstract_inverted_index.Research","character", +"ploswater","ploswater","abstract_inverted_index.online","numeric", +"ploswater","ploswater","abstract_inverted_index.score","character", +"ploswater","ploswater","abstract_inverted_index.according","numeric", +"ploswater","ploswater","abstract_inverted_index.experts","numeric", +"ploswater","ploswater","abstract_inverted_index.evaluating","numeric", +"ploswater","ploswater","abstract_inverted_index.contexts.","character", +"ploswater","ploswater","abstract_inverted_index.priorities.","numeric", +"ploswater","ploswater","abstract_inverted_index.21","character", +"ploswater","ploswater","abstract_inverted_index.means","numeric", +"ploswater","ploswater","abstract_inverted_index.parameters,","numeric", +"ploswater","ploswater","abstract_inverted_index.interest","numeric", +"ploswater","ploswater","abstract_inverted_index.insecurity.","character", +"ploswater","ploswater","abstract_inverted_index.semi-arid","character", +"ploswater","ploswater","abstract_inverted_index.insecurity","character", +"ploswater","ploswater","abstract_inverted_index.dry","character", +"ploswater","ploswater","abstract_inverted_index.techniques.","character", +"ploswater","ploswater","abstract_inverted_index.Given","numeric", +"ploswater","ploswater","abstract_inverted_index.offer","numeric", +"ploswater","ploswater","abstract_inverted_index.prioritize","numeric", +"ploswater","ploswater","abstract_inverted_index.risks,","numeric", +"ploswater","ploswater","abstract_inverted_index.filters","character", +"ploswater","ploswater","abstract_inverted_index.incidence","character", +"ploswater","ploswater","abstract_inverted_index.designed","character", +"ploswater","ploswater","abstract_inverted_index.risk.","numeric", +"ploswater","ploswater","abstract_inverted_index.Local","numeric", +"ploswater","ploswater","abstract_inverted_index.coordination","numeric", +"ploswater","ploswater","abstract_inverted_index.use,","numeric", +"ploswater","ploswater","abstract_inverted_index.isotope","character", +"ploswater","ploswater","abstract_inverted_index.(i.e.,","character", +"ploswater","ploswater","abstract_inverted_index.H","character", +"ploswater","ploswater","abstract_inverted_index.seasons","numeric", +"ploswater","ploswater","abstract_inverted_index.validated","numeric", +"ploswater","ploswater","abstract_inverted_index.annually","numeric", +"ploswater","ploswater","abstract_inverted_index.wells","character", +"ploswater","ploswater","abstract_inverted_index.reliability","character", +"ploswater","ploswater","abstract_inverted_index.overcome","numeric", +"ploswater","ploswater","abstract_inverted_index.households,","character", +"ploswater","ploswater","abstract_inverted_index.women","character", +"ploswater","ploswater","abstract_inverted_index.safely","character", +"ploswater","ploswater","abstract_inverted_index.managed","character", +"ploswater","ploswater","abstract_inverted_index.Although","numeric", +"ploswater","ploswater","abstract_inverted_index.establishing","numeric", +"ploswater","ploswater","abstract_inverted_index.divided","character", +"ploswater","ploswater","abstract_inverted_index.±","character", +"ploswater","ploswater","abstract_inverted_index.12","character", +"ploswater","ploswater","abstract_inverted_index.9","numeric", +"ploswater","ploswater","abstract_inverted_index.15","numeric", +"ploswater","ploswater","abstract_inverted_index.winter","character", +"ploswater","ploswater","abstract_inverted_index.farmers","character", +"ploswater","ploswater","abstract_inverted_index.actual","numeric", +"ploswater","ploswater","abstract_inverted_index.operated","numeric", +"ploswater","ploswater","abstract_inverted_index.northern","character", +"ploswater","ploswater","abstract_inverted_index.arsenic","character", +"ploswater","ploswater","abstract_inverted_index.presented","numeric", +"ploswater","ploswater","abstract_inverted_index.ranged","numeric", +"ploswater","ploswater","abstract_inverted_index.limits","numeric", +"ploswater","ploswater","abstract_inverted_index.60","numeric", +"ploswater","ploswater","abstract_inverted_index.sampled","character", +"ploswater","ploswater","abstract_inverted_index.former","numeric", +"ploswater","ploswater","abstract_inverted_index.wellbeing.","numeric", +"ploswater","ploswater","abstract_inverted_index.year,","numeric", +"ploswater","ploswater","abstract_inverted_index.dataset","character", +"ploswater","ploswater","abstract_inverted_index.suggesting","numeric", +"ploswater","ploswater","abstract_inverted_index.fully","numeric", +"ploswater","ploswater","abstract_inverted_index.San","character", +"ploswater","ploswater","abstract_inverted_index.Out","numeric", +"ploswater","ploswater","abstract_inverted_index.disposal","character", +"ploswater","ploswater","abstract_inverted_index.waterborne","character", +"ploswater","ploswater","abstract_inverted_index.(e.g.","character", +"ploswater","ploswater","abstract_inverted_index.practices,","numeric", +"ploswater","ploswater","abstract_inverted_index.volume","character", +"ploswater","ploswater","abstract_inverted_index.passive","character", +"ploswater","ploswater","abstract_inverted_index.coupled","numeric", +"ploswater","ploswater","abstract_inverted_index.faecal","character", +"ploswater","ploswater","abstract_inverted_index.indicator","character", +"ploswater","ploswater","abstract_inverted_index.contexts","character", +"ploswater","ploswater","abstract_inverted_index.real-time","numeric", +"ploswater","ploswater","abstract_inverted_index.achieving","character", +"ploswater","ploswater","abstract_inverted_index.undertaken","numeric", +"ploswater","ploswater","abstract_inverted_index.First","numeric", +"ploswater","ploswater","abstract_inverted_index.approaches,","character", +"ploswater","ploswater","abstract_inverted_index.planetary","character", +"ploswater","ploswater","abstract_inverted_index.salinity","character", +"ploswater","ploswater","abstract_inverted_index.resulted","numeric", +"ploswater","ploswater","abstract_inverted_index.16S","numeric", +"ploswater","ploswater","abstract_inverted_index.rRNA","numeric", +"ploswater","ploswater","abstract_inverted_index.gene","character", +"ploswater","ploswater","abstract_inverted_index.prioritized","character", +"ploswater","ploswater","abstract_inverted_index.levels.","numeric", +"ploswater","ploswater","abstract_inverted_index.prevent","numeric", +"ploswater","ploswater","abstract_inverted_index.fish","character", +"ploswater","ploswater","abstract_inverted_index.site.","numeric", +"ploswater","ploswater","abstract_inverted_index.removal","character", +"ploswater","ploswater","abstract_inverted_index.pH","character", +"ploswater","ploswater","abstract_inverted_index.confirmed","numeric", +"ploswater","ploswater","abstract_inverted_index.possibly","numeric", +"ploswater","ploswater","abstract_inverted_index.leaves","numeric", +"ploswater","ploswater","abstract_inverted_index.September","numeric", +"ploswater","ploswater","abstract_inverted_index.socially","numeric", +"ploswater","ploswater","abstract_inverted_index.consumption","numeric", +"ploswater","ploswater","abstract_inverted_index.linear","character", +"ploswater","ploswater","abstract_inverted_index.explain","character", +"ploswater","ploswater","abstract_inverted_index.until","character", +"ploswater","ploswater","abstract_inverted_index.outcomes,","numeric", +"ploswater","ploswater","abstract_inverted_index.required.","numeric", +"ploswater","ploswater","abstract_inverted_index.regulatory","character", +"ploswater","ploswater","abstract_inverted_index.adopted","numeric", +"ploswater","ploswater","abstract_inverted_index.connections","numeric", +"ploswater","ploswater","abstract_inverted_index.occur","numeric", +"ploswater","ploswater","abstract_inverted_index.short-term","numeric", +"ploswater","ploswater","abstract_inverted_index.wells.","character", +"ploswater","ploswater","abstract_inverted_index.(including","character", +"ploswater","ploswater","abstract_inverted_index.Both","numeric", +"ploswater","ploswater","abstract_inverted_index.events","numeric", +"ploswater","ploswater","abstract_inverted_index.contaminated","numeric", +"ploswater","ploswater","abstract_inverted_index.worked","character", +"ploswater","ploswater","abstract_inverted_index.knowledges","numeric", +"ploswater","ploswater","abstract_inverted_index.collaborative","character", +"ploswater","ploswater","abstract_inverted_index.central","numeric", +"ploswater","ploswater","abstract_inverted_index.climatic","numeric", +"ploswater","ploswater","abstract_inverted_index.outcome","numeric", +"ploswater","ploswater","abstract_inverted_index.settings,","numeric", +"ploswater","ploswater","abstract_inverted_index.extract","numeric", +"ploswater","ploswater","abstract_inverted_index.production,","numeric", +"ploswater","ploswater","abstract_inverted_index.comparison","numeric", +"ploswater","ploswater","abstract_inverted_index.tank","character", +"ploswater","ploswater","abstract_inverted_index.log","character", +"ploswater","ploswater","abstract_inverted_index.samples.","numeric", +"ploswater","ploswater","abstract_inverted_index.Therefore,","numeric", +"ploswater","ploswater","abstract_inverted_index.wetland","character", +"ploswater","ploswater","abstract_inverted_index.Cl","character", +"ploswater","ploswater","abstract_inverted_index.months,","numeric", +"ploswater","ploswater","abstract_inverted_index.rapidly","numeric", +"ploswater","ploswater","abstract_inverted_index.identification","numeric", +"ploswater","ploswater","abstract_inverted_index.hundreds","numeric", +"ploswater","ploswater","abstract_inverted_index.short","character", +"ploswater","ploswater","abstract_inverted_index.coming","numeric", +"ploswater","ploswater","abstract_inverted_index.always","numeric", +"ploswater","ploswater","abstract_inverted_index.demand,","numeric", +"ploswater","ploswater","abstract_inverted_index.cholera","character", +"ploswater","ploswater","abstract_inverted_index.Sanitation","character", +"ploswater","ploswater","abstract_inverted_index.successful","numeric", +"ploswater","ploswater","abstract_inverted_index.users,","numeric", +"ploswater","ploswater","abstract_inverted_index.Four","numeric", +"ploswater","ploswater","abstract_inverted_index.stakeholder","numeric", +"ploswater","ploswater","abstract_inverted_index.engage","character", +"ploswater","ploswater","abstract_inverted_index.future.","numeric", +"postfloodintervention","postfloodintervention","submitted_on","character","Date when the survey was submitted" +"postfloodintervention","postfloodintervention","water_point_name","character","Name of the water point" +"postfloodintervention","postfloodintervention","latitude","numeric","Geographic latitude coordinate of the water point" +"postfloodintervention","postfloodintervention","longitude","numeric","Geographic longitude coordinate of the water point" +"postfloodintervention","postfloodintervention","photo_condition_water_point","character","File names or URLs of photos illustrating the current condition of the water point" +"postfloodintervention","postfloodintervention","operational_feel_of_pump","character","Qualitative assessment of how the pump feels during operation" +"postfloodintervention","postfloodintervention","time_to_pump_20_litres","numeric","Time taken (in seconds or minutes) to pump 20 liters of water" +"postfloodintervention","postfloodintervention","number_of_strokes_to_yield_water","numeric","Number of pump strokes needed to produce water" +"postfloodintervention","postfloodintervention","sediment_presence","character","Presence or absence of sediment in the water" +"postfloodintervention","postfloodintervention","electrical_conductivity_magnitude","numeric","Measured magnitude of electrical conductivity in the water sample" +"postfloodintervention","postfloodintervention","electrical_conductivity_units","character","Units of electrical conductivity measurement (e.g., μS/cm)" +"postfloodintervention","postfloodintervention","arsenic_magnitude","numeric","Concentration of arsenic detected in the water sample" +"postfloodintervention","postfloodintervention","arsenic_units","character","Units used to measure arsenic concentration (e.g., μg/L)" +"postfloodintervention","postfloodintervention","ammonia_mg_per_l","numeric","Ammonia concentration in mg per liter" +"postfloodintervention","postfloodintervention","fluoride_ppm","numeric","Fluoride concentration in parts per million" +"postfloodintervention","postfloodintervention","nitrate_mg_per_l","numeric","Nitrate concentration in mg per liter" +"postfloodintervention","postfloodintervention","total_dissolved_solids_ppt","numeric","Total dissolved solids in parts per thousand" +"postfloodintervention","postfloodintervention","free_chlorine_mg_per_l","numeric","Concentration of free chlorine in mg per liter" +"postfloodintervention","postfloodintervention","ph","numeric","pH level of the water sample (acidity/alkalinity)" +"postfloodintervention","postfloodintervention","temperature_magnitude","numeric","Temperature value of the water sample" +"postfloodintervention","postfloodintervention","temperature_units","character","Units for temperature measurement (degree celsius)" +"postfloodintervention","postfloodintervention","turbidity_tube_magnitude","numeric","Measured turbidity of water using a turbidity tube" +"postfloodintervention","postfloodintervention","turbidity_tube_units","character","Units for turbidity measurement (e.g., NTU)" +"postfloodintervention","postfloodintervention","comments","character","Additional notes or observations related to the water point or sample" +"postfloodintervention","postfloodintervention","type_of_sample","character","Type or source of the water sample (e.g., well, tap, river)" +"postfloodintervention","postfloodintervention","date_of_sample","character","Date when the water sample was collected" +"postfloodintervention","postfloodintervention","ecoli_mpn_per_100ml","numeric","Most probable number (MPN) of E. coli bacteria per 100 milliliters" +"postfloodintervention","postfloodintervention","ecoli_upper_95ci_per_100ml","numeric","Upper limit of the 95 percent confidence interval for E. coli MPN per 100 ml" +"postfloodintervention","postfloodintervention","ecoli_health_risk_category","character","Health risk classification based on E. coli levels (e.g., low, medium, high)" +"postfloodintervention","postfloodintervention","ecoli_image","character","File name or URL of image showing E. coli test result or sample compartment color change" +"rwpfunctionality","rwpfunctionality","country","character","Name of the country" +"rwpfunctionality","rwpfunctionality","admin1","character","Administrative unit 1" +"rwpfunctionality","rwpfunctionality","admin2","character","Administrative unit 2" +"rwpfunctionality","rwpfunctionality","admin3","character","Administrative unit 3" +"rwpfunctionality","rwpfunctionality","instance_wp","character","Survey ID" +"rwpfunctionality","rwpfunctionality","subdate_wp","character","Submission date" +"rwpfunctionality","rwpfunctionality","latitude_wp","double","Latitude" +"rwpfunctionality","rwpfunctionality","longitude_wp","double","Longitude" +"rwpfunctionality","rwpfunctionality","elevation_wp","double","Elevation" +"rwpfunctionality","rwpfunctionality","commid_wp","character","Community ID" +"rwpfunctionality","rwpfunctionality","dataorg_wp","character","Code for country program" +"rwpfunctionality","rwpfunctionality","timepoint_wp","character","Data collection time point" +"rwpfunctionality","rwpfunctionality","cwfunded_wp","character","Charity water-funded water point" +"rwpfunctionality","rwpfunctionality","cwid","character","Charity water point ID" +"rwpfunctionality","rwpfunctionality","wptype","character","Water point type" +"rwpfunctionality","rwpfunctionality","pumptype","character","Pump type" +"rwpfunctionality","rwpfunctionality","drillmethod","character","Methodology used to dig the well or borehole" +"rwpfunctionality","rwpfunctionality","piped_source","character","Source of piped water" +"rwpfunctionality","rwpfunctionality","piped_pump","character","Infrastructure through which water travels from the source to the storage tank" +"rwpfunctionality","rwpfunctionality","rehabyn","character","This water point has undergone rehabilitation with the assistance of an outside organization since its construction" +"rwpfunctionality","rwpfunctionality","qtyhh_wp","double","Number of households served by this water point, either presently or during its last operational period" +"rwpfunctionality","rwpfunctionality","whomanage_wp","character","Primarily responsible for managing this water point" +"rwpfunctionality","rwpfunctionality","wp_age","double","Years between the reported construction year of the water point and the year of the survey" +"rwpfunctionality","rwpfunctionality","rehab_age","double","Years between the reported most recent rehabilitation year of the water point and the year of the survey" +"rwpfunctionality","rwpfunctionality","qtypeople_wp","double","Number of people served by this water point, either now or the last time it was working" +"rwpfunctionality","rwpfunctionality","wateravailable","character","Water availability from this water point" +"rwpfunctionality","rwpfunctionality","functional3","character","Functionality rating for water point: 'Abandoned or not functional' means no water available >1 year or no water available today OR (water available, but insufficient quantity AND downtime reported in prior 2 weeks), 'Partially functional' means water is available with sufficient quantity - 20L in 5 min - but downtime reported in prior 2 weeks or water is available, but insufficient quantity - 20L in 5 min - and no downtime reported in prior 2 weeks and 'Functional' means water is available, sufficient quantity is available - 20L in 5 minutes - and no downtime reported in prior 2 weeks" +"rwpfunctionality","rwpfunctionality","whynowatertoday_wp","character","Reason for unavailability of water from this water point today" +"rwpfunctionality","rwpfunctionality","whynowatertoday_wp_other","character","Other reason for water not being available today" +"rwpfunctionality","rwpfunctionality","minutesfill20l","double","Time required to fill the 20 liters container" +"rwpfunctionality","rwpfunctionality","brokendays_wp","double","Number of days it took to repair water the point last time it broke down" +"rwpfunctionality","rwpfunctionality","qtymonthsnowater_wp","double","Number of months in the past year when water was not available from this water point because it was dry" +"rwpfunctionality","rwpfunctionality","downtime2weeks","character","Water has not been available from this water point for a full day or more due to breakdown, seasonal dryness, or lack of fuel or electricity in the past two weeks" +"rwpfunctionality","rwpfunctionality","lockedfullday_wp","character","Service has been turned off or the water point has been locked in the past year by the management for reasons other than breakdowns" +"rwpfunctionality","rwpfunctionality","pumpstrokes","double","Number of pump strokes needed until water begins to flow" +"rwpfunctionality","rwpfunctionality","photo_wp","character","Photograph of the water point" +"rwpfunctionality","rwpfunctionality","grant_number_wp","double","Water grant number" +"rwpfunctionality","rwpfunctionality","wc_present_wp","character","Existence of water committee in this community that manages water points used for drinking" +"rwpfunctionality","rwpfunctionality","paytocollect_wp","character","Obligation for people to contribute money to collect water in this community" +"rwpfunctionality","rwpfunctionality","balance_any_dollars_wp","double","Amount of money saved by the committee (converted to USD)" +"rwpfunctionality","rwpfunctionality","improved_wponly_wp","double","Number of improved water point types used in the community" +"rwpfunctionality","rwpfunctionality","qtyhh_c_wp","double","Number of households in this community" +"rwpfunctionality","rwpfunctionality","wc_admin_index_wp","character","Administrative index for water committee: 'Inadequate' means WC hasn't met in >6 months, 'Minimum' means WC has reported to have met within 6 months, 'Moderate' means WC has reported to have met within 6 months, and has at least 1/3 female members and 'Advanced' means WC has reported to have met within 6 months, has at least 1/3 female members, AND has record of a meeting within previous 6 months" +"rwpfunctionality","rwpfunctionality","wc_finance_index_wp","character","Finance index for water committee: 'Inadequate' means WC does not collect fees, 'Minimum' means WC reports a fee collection system, 'Moderate' means WC reports collecting fees and reports having savings and 'Advanced' means WC reports collecting fees and reports having savings, can demonstrate a fee collection or balance, and reports that money is kept in a cash box, bank account, mobile money, or borehole banking" +"rwpfunctionality","rwpfunctionality","wc_maint_index_wp","character","Maintenance index for water committee: 'Inadequate' means WC cannot identify a person for water point maintenance, 'Minimum' means WC can identify a person for water point maintenance , 'Moderate' means WC can identify a repair person and that person has had training. Plus, the community has access to tools and spare parts and 'Advanced' means WC can identify a repair person and that person has had training. Plus, the community has access to tools and spare parts AND reported that someone has performed preventive maintenence within the past year" +"rwpfunctionality","rwpfunctionality","wc_mgmt_index_wp","character","Overall management index for water committee: 'Inadequate' means WC is inadequate in any of the above indices, 'Minimum' means WC meets minimum level in all above indices, 'Moderate' means WC meets moderate level in all above indices and 'Advanced' means WC meets moderate level in all above indices AND advanced level in at least one of the above" +"rwpfunctionality","rwpfunctionality","wc_savings_wp","double","Existence of money saved from water committee to repair water points" +"rwpfunctionality","rwpfunctionality","wpqty_wp","double","Number of drinking water points in this community, working or not" +"rwpfunctionality","rwpfunctionality","pop_1000","double","Population aggregated for a 1-km radius around the water point (data from from https://www.worldpop.org/)" +"rwpfunctionality","rwpfunctionality","annual_rain","double","Average annual mm of precipitation for administrative unit 2 (average from 1991-2020, from https://climateknowledgeportal.worldbank.org/)" +"rwpfunctionality","rwpfunctionality","season","character","Season of data collection, according to hostorical rainall amounts (from https://climateknowledgeportal.worldbank.org/)" +"saniabidjan","saniabidjan","area_name","factor","Identify survey areas, options including (1) Abobo and (2) Yopougon." +"saniabidjan","saniabidjan","sex","factor","Indicates respondents gender, options including (1) female and (2) male." +"saniabidjan","saniabidjan","education","factor","Level of education of respondents, options including (1) no: the respondent did not go to school, (2) primary: the respondent has an elementary level, (3) coranic: the respondent went to a Quranic school, (4) high school: the respondent has a high school degree, and (5) graduate: the respondent has a university degree." +"saniabidjan","saniabidjan","housing_type","factor","Description of the accommodation unit where the respondent lives, options including (1) common courtyard and (2) individual." +"saniabidjan","saniabidjan","status","factor","Indicates if respondent is the homeowner or not, options including (1) free host: the respondent is hosted for free, (2) owner: the respondent is the homeowner, and (3) renter: the respondent is the renter." +"saniabidjan","saniabidjan","lat_facilities","logical","Does the surveyed household have latrine facilities?" +"saniabidjan","saniabidjan","facilities_loc","factor","Specifies the exact location of the latrine in the household, options including (1) house, (2) yard, and (3) out of yard." +"saniabidjan","saniabidjan","facilities_type","factor","Describes the type of latrine used in the household, options including (1) pit latrine, (2) improved latrine, and (3) public latrine." +"saniabidjan","saniabidjan","lat_sharing","logical","Explains how latrines are used in the household" +"saniabidjan","saniabidjan","nb_user","numeric","Reveals the number of users of the latrines." +"saniabidjan","saniabidjan","impacts_of_sharing","factor","Indication of how the respondent perceives the use of latrines, options including (1) hygiene problems, (2) no problems, (3) vulnerable to disease, and (4) waiting line." +"saniabidjan","saniabidjan","lat_care","factor","Gives an overview of the people in charge of latrine cleaning, options including (1) myself, (2) no care, and (3) private person, and (4) round turn." +"saniabidjan","saniabidjan","clean_freq_wk","numeric","Specifies the cleaning frequency of latrines in the household." +"saniabidjan","saniabidjan","tank_presence","logical","Does the surveyed household have septic tank?" +"saniabidjan","saniabidjan","tank_location","factor","Specifies the exact location of the septic tank in the household, options including (1) court yard, (2) out of court yard, and (3) not know." +"saniabidjan","saniabidjan","latrines_nb","numeric","Reveals the number of latrines connecting to the septic tank." +"saniabidjan","saniabidjan","tk_status","logical","Expresses septic tank performance status." +"saniabidjan","saniabidjan","empty_freq_yr","factor","Indicates the number of times that the septic tank is emptied during the year in the household, options including (1) 1, (2) 2 and (3) 3." +"saniabidjan","saniabidjan","empty_mode","factor","Indicates how the septic tank is emptied in the household, options including (1) emptying truck, (2) manual emptying, and (3) truck and manual." +"saniabidjan","saniabidjan","empty_price","numeric","Shows the charge/price (in CFA franc) for emptying the septic tank." +"saniabidjan","saniabidjan","wastwat_dispos","factor","Show whether the household has wastewater disposal facilities, options including (1) courtyard, (2) open drain, and (3) street." +"saniabidjan","saniabidjan","waste_cont","logical","Does the surveyed household have solid waste disposal facilities?" +"saniabidjan","saniabidjan","waste_cont_loc","factor","Precise location of solid waste disposal equipment, options including (1) courtyard and (2) out of courtyard." +"saniabidjan","saniabidjan","cont_empty_wk","numeric","Indicates the emptying frequency of solid waste disposal equipment per week" +"saniabidjan","saniabidjan","common_ill","factor","Overview of the most common disease in the household associated with sanitation, options including (1) diarrhea, (2) infections, (3) malaria, and (4) typhoid fever." +"solidwastekampala","solidwastekampala","id","integer","Package-level unique household identifier (1-103), following the row numbering of the All_data sheet in the raw workbook (Bwaise I, then Bukoto I, then Ggaba)." +"solidwastekampala","solidwastekampala","household_id","character","Household label as recorded on the area sheet (for example Household_7); values repeat across parishes and contain gaps, so id is the unique key." +"solidwastekampala","solidwastekampala","division","character","Kampala City division the household is located in (Kawempe, Makindye, or Nakawa)." +"solidwastekampala","solidwastekampala","parish","character","Study parish the household is located in (Bwaise I = low income, Bukoto I = middle income, Ggaba = high income area)." +"solidwastekampala","solidwastekampala","zone","character","Administrative zone within the parish where the household is located." +"solidwastekampala","solidwastekampala","income_level","ordered","Income level of the household's study area as classified in the study design; ordered factor with levels low < middle < high." +"solidwastekampala","solidwastekampala","occupants","integer","Number of people living in the household during the 7-day waste collection period." +"solidwastekampala","solidwastekampala","age_head","ordered","Age of the household head in years; ordered factor with levels 18-35 < 36-60 < >60." +"solidwastekampala","solidwastekampala","gender_head","character","Gender of the household head (Female or Male)." +"solidwastekampala","solidwastekampala","education_head","ordered","Highest education level of the household head; ordered factor with levels Illiterate < Primary < Secondary < Tertiary." +"solidwastekampala","solidwastekampala","profession_head","character","Profession of the household head (Business, Government employee, Housewife, Private employee, or Retired)." +"solidwastekampala","solidwastekampala","monthly_income_ugx","ordered","Monthly household income band in Uganda shillings (UGX); ordered factor with levels <500,000 < 500,000-1,000,000 < 1,000,000-3,000,000 < >3,000,000." +"solidwastekampala","solidwastekampala","respondent","character","Household member who answered the questionnaire (Household head, Spouse, Son/daughter, or Niece/nephew)." +"solidwastekampala","solidwastekampala","period_of_stay","ordered","How long the household has lived at the premises; ordered factor with levels <1 year < 1-3 years < 3-5 years < >5 years." +"solidwastekampala","solidwastekampala","occupancy","character","Occupancy status of the premises (Occupied by owner or Rented)." +"solidwastekampala","solidwastekampala","housing_quality","character","Type of dwelling as a proxy for housing quality (Bungalow, Story building, or Temporary)." +"solidwastekampala","solidwastekampala","roof_material","character","Main roof material of the dwelling (Cemented, Iron sheets, Iron sheets/tiles, or Tiles); Bwaise I recorded only the combined Iron sheets/tiles category." +"solidwastekampala","solidwastekampala","wall_material","character","Main wall material of the dwelling (Bricks, Concrete blocks, or Mud/poles)." +"solidwastekampala","solidwastekampala","floor_material","character","Main floor material of the dwelling (Cemented, Mud, or Tiles)." +"solidwastekampala","solidwastekampala","water_access","character","Main drinking water access of the household (House connection, Stand pipe, or Yard tap)." +"solidwastekampala","solidwastekampala","sanitation_facility","character","Whether the household's sanitation facility is shared with other households (Shared facilities or Not shared facilities)." +"solidwastekampala","solidwastekampala","road_condition","character","Condition of the access road to the household (Paved or Unpaved)." +"solidwastekampala","solidwastekampala","waste_food_kg","numeric","Mass of food waste generated by the household over the 7-day collection period, in kilograms (ASTM waste category)." +"solidwastekampala","solidwastekampala","waste_garden_kg","numeric","Mass of garden waste generated by the household over the 7-day collection period, in kilograms (ASTM waste category)." +"solidwastekampala","solidwastekampala","waste_wood_kg","numeric","Mass of wood waste generated by the household over the 7-day collection period, in kilograms (ASTM waste category)." +"solidwastekampala","solidwastekampala","waste_textiles_kg","numeric","Mass of textile waste generated by the household over the 7-day collection period, in kilograms (ASTM waste category)." +"solidwastekampala","solidwastekampala","waste_paper_kg","numeric","Mass of paper waste generated by the household over the 7-day collection period, in kilograms (ASTM waste category)." +"solidwastekampala","solidwastekampala","waste_polythene_kg","numeric","Mass of polythene waste generated by the household over the 7-day collection period, in kilograms (ASTM waste category)." +"solidwastekampala","solidwastekampala","waste_plastics_kg","numeric","Mass of plastic waste generated by the household over the 7-day collection period, in kilograms (ASTM waste category)." +"solidwastekampala","solidwastekampala","waste_glass_kg","numeric","Mass of glass waste generated by the household over the 7-day collection period, in kilograms (ASTM waste category)." +"solidwastekampala","solidwastekampala","waste_metals_kg","numeric","Mass of metal waste generated by the household over the 7-day collection period, in kilograms (ASTM waste category); for Ggaba Household_7 the value 2.674 was stored as text in the raw sheet and is excluded from that household's recorded waste_total_kg." +"solidwastekampala","solidwastekampala","waste_other_kg","numeric","Mass of waste not covered by the other nine categories, generated by the household over the 7-day collection period, in kilograms (ASTM waste category)." +"solidwastekampala","solidwastekampala","waste_total_kg","numeric","Total mass of waste generated by the household over the 7-day collection period, in kilograms, as recorded in the raw sheet (SUM of the ten category columns)." +"solidwastekampala","solidwastekampala","waste_per_day_kg","numeric","Mean daily mass of waste generated by the household, in kilograms per day (waste_total_kg divided by 7)." +"solidwastekampala","solidwastekampala","waste_per_capita_kg","numeric","Mean daily mass of waste generated per household member, in kilograms per person per day (waste_per_day_kg divided by occupants)." +"solidwastekampala","solidwastekampala","volume_l","numeric","Volume of the waste generated by the household over the 7-day collection period, in litres." +"solidwastekampala","solidwastekampala","density_kg_l","numeric","Bulk density of the generated waste, in kilograms per litre; multiply by 1000 for kg/m3 as reported in the manuscript." +"ugabore","ugabore","community","character","Local name used to refer to the administrative unit 5 where the borehole is located." +"ugabore","ugabore","parish","character","Local name used to refer to the administrative unit 4 where the borehole is located." +"ugabore","ugabore","sub_county","character","Local name used to refer to the administrative unit 3 where the borehole is located." +"ugabore","ugabore","source_id","character","Unique identification number assigned to the borehole by the borehole maintenance company." +"ugabore","ugabore","repair_date","double","Most recent repair date of the borehole." +"ugabore","ugabore","population_served","double","Number of people that collect water from the borehole." +"ugabore","ugabore","well_depth","double","Total depth of the borehole (measured in meters)." +"ugabore","ugabore","static_water_depth","double","Depth of the stable water level within the borehole when pumping isn't happening (measured in meters)." +"ugabore","ugabore","pump_installation_depth","double","Depth of the pump when installed from land surface (measured in meters)." +"ugabore","ugabore","well_yield","double","Water production capacity of the borehole (measured in m3/h)." +"undpcomposite","undpcomposite","iso3","character","ISO3 country code" +"undpcomposite","undpcomposite","country","character","Country name" +"undpcomposite","undpcomposite","hdicode","character","Human Development Group" +"undpcomposite","undpcomposite","region","character","UNDP Developin Regions" +"undpcomposite","undpcomposite","hdi_rank_2022","numeric","HDI Rank in 2022" +"undpcomposite","undpcomposite","year","character","Year of value" +"undpcomposite","undpcomposite","hdi","numeric","Human Development Index" +"undpcomposite","undpcomposite","le","numeric","Life Expectancy at Birth (years)" +"undpcomposite","undpcomposite","eys","numeric","Expected Years of Schooling (years)" +"undpcomposite","undpcomposite","mys","numeric","Mean Years of Schooling (years)" +"undpcomposite","undpcomposite","gnipc","numeric","Gross National Income Per Capita (2017 PPP USD)" +"undpcomposite","undpcomposite","gdi_group","numeric","GDI Group" +"undpcomposite","undpcomposite","gdi","numeric","Gender Development Index (value)" +"undpcomposite","undpcomposite","hdi_f","numeric","HDI female" +"undpcomposite","undpcomposite","le_f","numeric","Life Expectancy at Birth, female (years)" +"undpcomposite","undpcomposite","eys_f","numeric","Expected Years of Schooling, female (years)" +"undpcomposite","undpcomposite","mys_f","numeric","Mean Years of Schooling, female (years)" +"undpcomposite","undpcomposite","gni_pc_f","numeric","Gross National Income Per Capita, female (2017 PPP USD)" +"undpcomposite","undpcomposite","hdi_m","numeric","HDI male" +"undpcomposite","undpcomposite","le_m","numeric","Life Expectancy at Birth, male (years)" +"undpcomposite","undpcomposite","eys_m","numeric","Expected Years of Schooling, male (years)" +"undpcomposite","undpcomposite","mys_m","numeric","Mean Years of Schooling, male (years)" +"undpcomposite","undpcomposite","gni_pc_m","numeric","Gross National Income Per Capita, male (2017 PPP USD)" +"undpcomposite","undpcomposite","ihdi","numeric","Inequality-adjusted Human Development Index (value)" +"undpcomposite","undpcomposite","coef_ineq","numeric","Coefficient of human inequality" +"undpcomposite","undpcomposite","loss","numeric","Overall loss (%)" +"undpcomposite","undpcomposite","ineq_le","numeric","Inequality in life expectancy" +"undpcomposite","undpcomposite","ineq_edu","numeric","Inequality in eduation" +"undpcomposite","undpcomposite","ineq_inc","numeric","Inequality in income" +"undpcomposite","undpcomposite","gii_rank","numeric","GII Rank" +"undpcomposite","undpcomposite","gii","numeric","Gender Inequality Index (value)" +"undpcomposite","undpcomposite","mmr","numeric","Maternal Mortality Ratio (deaths per 100,000 live births)" +"undpcomposite","undpcomposite","abr","numeric","Adolescent Birth Rate (births per 1,000 women ages 15-19)" +"undpcomposite","undpcomposite","se_f","numeric","Population with at least some secondary education, female (% ages 25 and older)" +"undpcomposite","undpcomposite","se_m","numeric","Population with at least some secondary education, male (% ages 25 and older)" +"undpcomposite","undpcomposite","pr_f","numeric","Share of seats in parliament, female (% held by women)" +"undpcomposite","undpcomposite","pr_m","numeric","Share of seats in parliament, male (% held by men)" +"undpcomposite","undpcomposite","lfpr_f","numeric","Labour force participation rate, female (% ages 15 and older)" +"undpcomposite","undpcomposite","lfpr_m","numeric","Labour force participation rate, male (% ages 15 and older)" +"undpcomposite","undpcomposite","rankdiff_hdi_phdi","numeric","Difference from HDI rank" +"undpcomposite","undpcomposite","phdi","numeric","Planetary pressuresÐadjusted Human Development Index (value)" +"undpcomposite","undpcomposite","diff_hdi_phdi","numeric","Difference from HDI value (%)" +"undpcomposite","undpcomposite","co2_prod","numeric","Carbon dioxide emissions per capita (production) (tonnes)" +"undpcomposite","undpcomposite","mf","numeric","Material footprint per capita (tonnes)" +"undpcomposite","undpcomposite","pop_total","numeric","Population, total (millions)" +"unhcrwash","unhcrwash","form_id","double","Unique Identifier for the form" +"unhcrwash","unhcrwash","start_date","date","Start Date for the data collection" +"unhcrwash","unhcrwash","end_date","date","End date for the data collection" +"unhcrwash","unhcrwash","location_id","double","Unique Identifier for the location of the refugee camp" +"unhcrwash","unhcrwash","location_name","character","Name of the location of the refugee camp" +"unhcrwash","unhcrwash","country","character","Country in which the refugee camp is located" +"unhcrwash","unhcrwash","post_emergency","character","If emergency is ongoing or not (Emergency or Post Emergency)" +"unhcrwash","unhcrwash","persons_per_handpump","double","No. of persons per usable handpump well spring" +"unhcrwash","unhcrwash","persons_per_tap","double","Number of persons per unit of usable tap water source" +"unhcrwash","unhcrwash","liters_per_person_per_day","double","Average number of litres of potable water available per person per day" +"unhcrwash","unhcrwash","non_chlorinated_0_cfu","double","Percentage of water quality tests conducted at non-chlorinated water collection points that returned results with 0 colony-forming units (CFU) per 100 milliliters" +"unhcrwash","unhcrwash","chlorinated_safe_water_quality","double","Percentage of water quality tests at chlorinated collection points where the Free Residual Chlorine (FRC) levels were within the range of 0.2 to 2 mg per L, and turbidity was less than or equal to 5 NTU (Nephelometric Turbidity Units)" +"unhcrwash","unhcrwash","households_with_toilet","double","Percentage of households that have access to a household toilet or latrine, evaluated on a monthly basis" +"unhcrwash","unhcrwash","persons_per_toilet","double","Number of persons per toilet latrine" +"unhcrwash","unhcrwash","persons_per_shower","double","Number of persons per bath shower" +"unhcrwash","unhcrwash","persons_per_hygiene_promoter","double","Number of persons per hygiene promoter" +"unhcrwash","unhcrwash","refugee_pop","double","Refugee Population" +"unhcrwash","unhcrwash","reporting_monthly","double","Monthly Reporting Period" +"unhcrwash","unhcrwash","liters_per_person_household","double","Average water (litres) collected per household per day" +"unhcrwash","unhcrwash","potable_water_storage_10l","double","Percentage of households with at least 10 litres of water storage capacity" +"unhcrwash","unhcrwash","protected_water_sources","double","Percentage of households collecting water from sheltered and treated sources" +"unhcrwash","unhcrwash","menstrual_hygiene_satisfaction","double","Percentage of women of reproductive age satisfied with facilities for management of menstrual hygiene and waste" +"unhcrwash","unhcrwash","household_toilet","double","Percentage of households with a latrine" +"unhcrwash","unhcrwash","defecate_in_toilet","double","Percentage of households defecating in a toilet" +"unhcrwash","unhcrwash","access_to_soap","double","Percentage of households with access to soap" +"unhcrwash","unhcrwash","solid_waste_disposal_access","double","Percentage of households with access to a waste disposal facility" +"unhcrwash","unhcrwash","reporting_annual","date","Annual Reporting Period" +"waschoolpiracema","waschoolpiracema","year","double","Year of Survey" +"waschoolpiracema","waschoolpiracema","sch_id","double","Numerical code of the school" +"waschoolpiracema","waschoolpiracema","admin","factor","The administration of the school is federal (1); state (2); municipal (3), or private (4). Federal, state, and municipal schools are considered public." +"waschoolpiracema","waschoolpiracema","loc","factor","The school is located in an urban (1) or rural area (2)" +"waschoolpiracema","waschoolpiracema","drink_water","logical","The school provides drinking water with quality suitable for human consumption (i.e., ingestion, preparation, and production of food) according to the Brazilian national water quality standards (former Portaria nº 2.914/2011 now Portaria de Consolidação nº5/2017)" +"waschoolpiracema","waschoolpiracema","public_water","logical","The water in the school is supplied by a public network ." +"waschoolpiracema","waschoolpiracema","borehole_water","logical","The water in the school is supplied by a borehole" +"waschoolpiracema","waschoolpiracema","well_water","logical","The water in the school is supplied by a cacimba, cistern, or well" +"waschoolpiracema","waschoolpiracema","surface_water","logical","The water in the school is supplied by surface water source" +"waschoolpiracema","waschoolpiracema","no_water","logical","There is no water supply in the school" +"waschoolpiracema","waschoolpiracema","sewage_rede_publica","logical","The school dispose their sewage into a public sewerage system" +"waschoolpiracema","waschoolpiracema","sewage_fossa_septica","logical","The school dispose their sewage into septic tank" +"waschoolpiracema","waschoolpiracema","waste_servico_coleta","logical","The solid waste in the school is regularly collected by the public cleaning service" +"waschoolpiracema","waschoolpiracema","waste_queima","logical","The solid waste in the school is disposed in an area licensed by environmental agencies, intended to receive solid waste in a planned manner (e.g., landfills)" +"waschoolpiracema","waschoolpiracema","waste_enterra","logical","The solid waste in the school is burned or incinerated" +"waschoolpiracema","waschoolpiracema","waste_destino_final_publico","logical","The solid waste in the school is buried" +"waschoolpiracema","waschoolpiracema","waste_descarta_outra_area","logical","The solid waste in the school is disposed in another area (none of the other options)" +"waschoolpiracema","waschoolpiracema","sanitary","logical","The school is equipped with sanitary facilities for personal hygiene/physiological needs" +"waschoolpiracema","waschoolpiracema","sanitary_ei","logical","The school is equipped with sanitary facilities for children 0 to 5 years old" +"waschoolpiracema","waschoolpiracema","sanitary_pne","logical","The school is equipped with disability-friendly sanitary facilities following the national guidelines (ABNT - NBR 9050)" +"waschoolpiracema","waschoolpiracema","sanitary_funcionarios","logical","The school is equipped with sanitary facilities for personal hygiene/physiological needs exclusively for staff" +"waschoolpiracema","waschoolpiracema","sanitary_chuveiro","logical","The school is equipped with sanitary facilities or changing room or washing room with appropriate equipment (shower) for bathing, exclusively for students" +"waschoolpiracema","waschoolpiracema","qt_mat_bas","double","Total number of students per school" +"waschoolpiracema","waschoolpiracema","pc_girl","double","Percentage of girls per school" +"waschoolpiracema","waschoolpiracema","pc_boy","double","Percentage of boys per school" +"waschoolpiracema","waschoolpiracema","pc_white","double","Percentage of students that are classified or self-identified as white race/skin color per school" +"waschoolpiracema","waschoolpiracema","pc_brown","double","Percentage of students that are classified or self-identified as black race/skin color per school" +"waschoolpiracema","waschoolpiracema","pc_black","double","Percentage of students that are classified or self-identified as brown race/skin color per school" +"waschoolpiracema","waschoolpiracema","pc_indian","double","Percentage of students that are classified or self-identified as Asian race/skin color per school" +"waschoolpiracema","waschoolpiracema","pc_asian","double","Percentage of students that are classified or self-identified as indigenous race/skin color per school" +"waschoolpiracema","waschoolpiracema","pc_nd","double","Percentage of students that did not declared race/skin color per school" +"waschoolpiracema","waschoolpiracema","pc_cre","double","Percentage of students in daycare (0 - 3 years old)" +"waschoolpiracema","waschoolpiracema","pc_pre","double","Percentage of students in preschool (4 - 5 years old)" +"waschoolpiracema","waschoolpiracema","pc_prim_1","double","Percentage of students in primary education first cycle (6 - 10 years old)" +"waschoolpiracema","waschoolpiracema","pc_prim_2","double","Percentage of students in primary education second cycle (11 - 14 years old)" +"waschoolpiracema","waschoolpiracema","pc_sec","double","Percentage of students in secondary education (15 - 18 years old)" +"washinvestments","washinvestments","id","character","Identification code provided by the MDBs for each project" +"washinvestments","washinvestments","mdb","character","Abbreviation of multilateral development bank, from which the database entry was retrieved: IBRD = World Bank, AfDB = African Development Bank and ADB = Asian Development Bank" +"washinvestments","washinvestments","project_name","character","Name of the project provided by the MDBs for each project" +"washinvestments","washinvestments","region","character","Intermediate Region Code name according to the UNSD-Methodology (UN M49 Standard) in which the project is implemented (UN Statistics Division 2022)" +"washinvestments","washinvestments","multi_country","double","Indicates if a project is carried out in more than one country: 1 = Project is carried out in more than one country and 0 = Project is carried out in only one country" +"washinvestments","washinvestments","country","character","Name of the country in which the project was implemented: Values = Country Names and N/A = Multi Country ‘TRUE’" +"washinvestments","washinvestments","iso_country_code","character","A three-letter country code which may allow a better visual association between the codes and the country names. For values see: UN M49 Standard, N/A = Multi Country ‘TRUE’" +"washinvestments","washinvestments","city","character","Name of the city in which the investment project was implemented. MDBs state if the localities are cities, towns or rural areas. If not, the localities were identified in web searches to see whether they qualify as a city or town according to national standards: City name = project is implemented only in one city or town, MULTI = Investments & activities in multiple cities and N/A = only if Context is Rural" +"washinvestments","washinvestments","year","double","Year of investment project approval as provided by the MDBs (1964-2020)" +"washinvestments","washinvestments","context","character","Morphological and social context of investment project implementation: Urban = urban settlement, Rural = rural settlement and Both = urban and rural settlements are affected. Either national / sectoral programs or projects with activities in urban and rural contexts" +"washinvestments","washinvestments","sector","character","Distinct range of activities and infrastructures that are different from others: Sanitation = Only wastewater / sanitation related activities, Sanitation + = Sanitation and other activities different to water supply, Water = Only water supply related activities, Water + = Water supply and other activities different to sanitation, Water & Sanitation = Only water supply and sanitation related activities and Water & Sanitation + = Water supply and sanitation and other activities different to both" +"washinvestments","washinvestments","subset","double","The dataset is divided into three different subsets to structure data collection efficiently and to align with the research focus on understanding investment behaviour of MDB with regards to urban water and sanitation: 1 = Context is Rural, 2 = Context is Urban, 3 = MDB is IBRD, Context is Urban or Both, Sector is Water, Water +, Sanitation, Sanitation +" +"washinvestments","washinvestments","amount_total_2020usd","double","The total amount that is being invested in the project in 2020 USD" +"washinvestments","washinvestments","amount_mdb_2020usd","double","The value for the amount committed for the investment project that is provided by the bank identified in the MDB variable in 2020 USD" +"washinvestments","washinvestments","sponsorx","character","Name of a sponsor contributing to the investment. -X ranks sponsors according to the amount they provide: IBRD = World Bank, ADB = Asian Development Bank, AfDB = African Development Bank, Gov = Borrowing governments own contribution, Com = Recipient communities own contribution, Other Multi-Bi = Any multilateral or bilateral organization contributing to the investment, Privat = Any private source of finance contributing to the investment, N/A = There a fewer sponsors than X" +"washinvestments","washinvestments","amountx","double","Contribution by a SponsorX to the project: Values = Amounts in original currency and N/A = There a fewer sponsors than X" +"washinvestments","washinvestments","ppp_sanitation","character","The form of the public private partnership (PPP) or private sector participation (PSP) arrangement promoted or implemented. For the distribution of ownership, risks and revenues between public and private actors, refer to Budds & McGranahan (2003). For details on the different PPP categories refer to World Bank (2017): Promotion = Either PPPs or PSP are generally promoted, capacity building or institutional reforms explicitly aim to facilitate PPPs or PSP. But no execution of a specific arrangement is planned under the project, Construction = PPP arrangements focusing solely on design, engineering and construction of infrastructure, Service-O&M = PPP arrangements for service delivery and/or O&M without any ownership of infrastructure asset, Lease-Affermage = The infrastructure is leased to a private actor for a distinct period. The government typically remains responsible for capital expenditures, BOT-type = A private actor builds, operates, and then transfers the infra-structure back to a public actor, Concession = A private actor buys the right to invest in a particular sector for a particular time, Divestiture = Assets and the right to pursue business in a basic service are sold to a private entity" +"washinvestments","washinvestments","ppp_water","character","The form of the public private partnership (PPP) arrangement implemented with regards to water supply. Same values as for ppp_sanitation" +"washinvestments","washinvestments","amount_sanitation","double","The total amount allocated for sanitation related project components: Values = Amounts in original currency, N/A = sector does not include sanitation, NED = available documents did not allow to differentiate between sanitation and other investments" +"washinvestments","washinvestments","amount_water","double","The total amount allocated for water supply related project components: Values = Amounts in original currency, N/A = sector does not include water supply, NED = available documents did not allow to differentiate between water and other investments" +"washinvestments","washinvestments","primary_c","character","Number of primary cities targeted in a project: Numbers = the number of primary cities targeted in a project, MULTI = An uncountable number of primary cities are addressed under the project. This is mainly true for regional or national projects that do not explicitly mention all cities." +"washinvestments","washinvestments","secondary_c","character","Number of secondary cities targeted in a project: Numbers = the number of secondary cities targeted in a project and MULTI = An uncountable number of primary cities are addressed under the project" +"washinvestments","washinvestments","towns","character","Number of towns targeted in a project: Numbers = the number of secondary cities targeted in a project and MULTI = An uncountable number of primary cities are addressed under the project" +"washinvestments","washinvestments","network_infrastructure","logical","Indicates whether sewered sanitation infrastructures are financed under the project: TRUE = Sewered sanitation infrastructures are financed under the project, FALSE = No sewered sanitation infrastructures are financed under the project" +"washinvestments","washinvestments","n_drains_sewers","logical","Indicates whether sewers or drains are financed under the project: TRUE = Sewers, drains, or other conveyance infrastructures are financed under the project, FALSE = No sewers, drains or conveyance infrastructures are financed under the project" +"washinvestments","washinvestments","n_treatment","logical","Indicates whether wastewater treatment plants are financed under the project: TRUE = Wastewater treatment capacity through a wastewater treatment plant (WWTP) or sewage treatment plant (STP) is financed under the project, FALSE = No Wastewater treatment capacity through a wastewater treatment plant (WWTP) or sewage treatment plant (STP) is financed under the project" +"washinvestments","washinvestments","non_network_infrastructure","logical","Indicates whether non-sewered sanitation infrastructures are financed under the project. The classification of infrastructure components into the different functional groups along the sanitation service chain (following five variables) is based on Tilley et al. (2014): TRUE = non-sewered infrastructures are financed under the project, FALSE = no non-sewered infrastructures are financed under the project" +"washinvestments","washinvestments","nn_containment","logical","Indicates whether containment infrastructures (shared and private), such as pit latrines are financed under the project: TRUE = containment infrastructure is financed, FALSE = no containment infrastructure is financed" +"washinvestments","washinvestments","nn_transport","logical","Indicates whether emptying or transport technologies, such as transfer stations and vacuum trucks are financed under the project: TRUE = emptying/transport technologies are financed, FALSE = no emptying/transport technologies are financed, NA = for all entries that were not coded under Subset 3, NED = only if on-site hardware is true" +"washinvestments","washinvestments","nn_treatment","logical","Indicates whether faecal sludge treatment plants or other non-sewered treatment infrastructures are financed under the project: TRUE = treatment infrastructure is financed, FALSE = no containment infrastructure is financed" +"washinvestments","washinvestments","nn_disposal","logical","Indicates whether disposal infrastructures are financed under the project: TRUE = disposal infrastructure is financed, FALSE = no containment infrastructure is financed" +"washinvestments","washinvestments","nn_reuse","logical","Indicates whether reuse infrastructures are financed under the project: TRUE = reuse infrastructure is financed, FALSE = no containment infrastructure is financed" +"washinvestments","washinvestments","ur1","logical","Indicates whether institutional reforms aim to battle inefficiencies by reducing leakages, improving metering and billing and introducing efficient technologies. The variables UR1–UR5 are based on the definition and detailed description of the different steps of the ‘maturity ladder for the urban water sector’ from Goksu et al. (2019): TRUE = reforms to battle inefficiencies are financed, FALSE = no reforms to battle inefficiencies are financed" +"washinvestments","washinvestments","ur2","logical","Indicates whether institutional reforms aim to build capacity at the organizations (utilities/departments) responsible for providing access to water supply and sanitation by amongst others institutional strengthening, financial training, training in environmental monitoring, technical assistance for operation and maintenance and training in (integrated) planning: TRUE = reforms to build capacity are financed, FALSE = no reforms to build capacity are financed" +"washinvestments","washinvestments","ur3","logical","Indicates whether institutional reforms aim to align institutions and incentives by introducing full cost recovery principles/tariffs and improving customer management. Through promoting institutional, organizational, regulatory, and sector reforms or by increasing the autonomy of utilities through decentralization and corporatization: TRUE = reforms to align institutions and incentives are financed, FALSE = no reforms to align institutions and incentives are financed" +"washinvestments","washinvestments","ur4","logical","Indicates whether institutional reforms aim to incentivise performance through performance contracts and performance based financing, by private sector participation and building utilities’ creditworthiness: TRUE = reforms to incentivise performance are financed, FALSE = no reforms to incentivise performance are financed" +"washinvestments","washinvestments","ur5","logical","Indicates whether institutional reforms aim to ‘go to the market’ through pursuing specific PPP arrangements are financed under the investment project: TRUE = reforms to increase private partnerships are financed, FALSE = no reforms to increase private partnerships are financed" +"washinvestments","washinvestments","er1","logical","Indicates whether institutional reforms address authorities to improve the enabling environment for non-sewered sanitation and the sanitation economy. The variables ER1-ER3 are based on the suggestions of WSUP (2020) and IWA (2021) for reforming the sanitation sector to scale non-sewered infrastructures: TRUE = reforms to create an enabling regulatory environment are financed, FALSE = no reforms to create an enabling regulatory environment are financed" +"washinvestments","washinvestments","er2","logical","Indicates whether institutional reforms address private sector service providers and aim to incentivise them to enter the sanitation economy or regulate their activities: TRUE = reforms to regulate sanitation service providers are financed, FALSE = no reforms to regulate sanitation service providers are financed, NA = for all entries that were not coded under Subset 3" +"washinvestments","washinvestments","er3","logical","Indicates whether institutional reforms address households or communities and aim to increase awareness of and demand for non-sewered sanitation solutions or to set up service co-production arrangements: TRUE = reforms to create demand and awareness for sanitation are financed, FALSE = no reforms to create demand and awareness for sanitation are financed, NA = for all entries that were not coded under Subset 3" +"washmalawi","washmalawi","date_submitted","character","The date on which the household survey form was submitted." +"washmalawi","washmalawi","latitude","numeric","The geographic latitude coordinate of the household location." +"washmalawi","washmalawi","longitude","numeric","The geographic longitude coordinate of the household location." +"washmalawi","washmalawi","water_point_identification_method","character","Method used to identify the water point" +"washmalawi","washmalawi","traditional_authority","character","The name of the Traditional Authority where the household is located." +"washmalawi","washmalawi","district","character","The name of the district where the household is located." +"washmalawi","washmalawi","water_source_type","character","Type of water source used by the household" +"washmalawi","washmalawi","water_source_location","character","Location of the water source relative to the household" +"washmalawi","washmalawi","water_collection_time_mins","numeric","Estimated round-trip time in minutes to collect water, including waiting time." +"washmalawi","washmalawi","time_not_known","logical","TRUE if respondent does not know or cannot estimate the water collection time." +"washmalawi","washmalawi","water_insufficiency_30days","character","Whether the household experienced water insufficiency in the past 30 days" +"washmalawi","washmalawi","water_quality_tested","character","Whether the water quality at the source has been tested." +"washmalawi","washmalawi","bacteriological_test_done_at_location","character","Indicates whether a bacteriological test was performed on-site at the household or source." +"washmalawi","washmalawi","parameters_tested_methods","character","List or description of water quality parameters tested and methods used." +"washmalawi","washmalawi","chemical_quality_tested","character","Indicates whether chemical tests were performed on the water." +"washmalawi","washmalawi","arsenic_tested_water","character","Indicates whether the water was tested for arsenic contamination." +"washmalawi","washmalawi","fluoride_tested_water","character","Indicates whether the water was tested for fluoride levels." +"washmalawi","washmalawi","toilet_facility_type","character","The type of toilet facility used by the household" +"washmalawi","washmalawi","toilet_facility_shared","character","Indicates whether the toilet facility is shared with other households." +"washmalawi","washmalawi","waste_removed","character","Indicates whether household waste is regularly removed" +"washmalawi","washmalawi","waste_treated","character","Whether the waste is treated" +"washmalawi","washmalawi","waste_disposal","character","Method used for waste disposal" +"washmalawi","washmalawi","handwash_available","character","Whether the household has a designated place for handwashing." +"washmalawi","washmalawi","handwashing_water_presence","character","Whether water was present at the handwashing location at the time of visit." +"washmalawi","washmalawi","handwashing_soap_presence","character","Whether soap or detergent was present at the handwashing place at the time of visit." +"washmalawi","washmalawi","handwashing_supplies_available","character","Overall availability of both soap and water for handwashing." +"washopenresearch","datapapers","paperid","integer","ID number of the paper within this dataset" +"washopenresearch","datapapers","doi","character","DOI of the data paper" +"washopenresearch","datapapers","paper_url","character","Official url of the paper (DOI resolver link)" +"washopenresearch","datapapers","url_source","character","Publisher website of the paper" +"washopenresearch","datapapers","journal","character","Full name of the journal" +"washopenresearch","datapapers","title","character","Title of the paper" +"washopenresearch","datapapers","published_year","integer","Year of publication" +"washopenresearch","datapapers","num_authors","integer","Number of the authors" +"washopenresearch","datapapers","first_author_name","character","Name of the first author" +"washopenresearch","datapapers","first_author_affiliation","character","Academic affiliation of the first author" +"washopenresearch","datapapers","first_author_affiliation_country","character","Country of the first author parsed from first_author_affiliation variable encoded with United Nations names" +"washopenresearch","datapapers","data_repo_url","character","Website urls of the repository holding the dataset the paper describes separated by a semicolon when there are multiple" +"washopenresearch","datapapers","data_repo","character","Name of the data repository (e.g. Zenodo Dryad Figshare OSF Dataverse) parsed from data_repo_url" +"washopenresearch","datapapers","license","character","License url of the paper from Crossref metadata" +"washopenresearch","datapapers","related_paper_doi","character","DOI of a linked research article if any separated by a semicolon when there are multiple" +"washopenresearch","datapapers","abstract","character","Abstract of the paper as provided by the metadata source" +"washopenresearch","datapapers","query_term","character","WASH search term(s) that retrieved the paper separated by a semicolon" +"washopenresearch","datapapers","retrieval_date","date","Date the paper metadata was harvested from the API" +"washopenresearch","ploswater","paperid","character","DOI of the paper; identical to the doi variable" +"washopenresearch","ploswater","volume","integer","Volume number of the journal; volume 1 is 2022" +"washopenresearch","ploswater","issue","integer","Issue number of the journal" +"washopenresearch","ploswater","paper_url","character","Official website url of the paper" +"washopenresearch","ploswater","journal","character","Full name of the journal" +"washopenresearch","ploswater","title","character","Title of the paper" +"washopenresearch","ploswater","published_year","integer","Year of publication" +"washopenresearch","ploswater","is_supp","logical","Whether the paper has supplementary materials" +"washopenresearch","ploswater","num_supp","integer","Number of supplementary material files" +"washopenresearch","ploswater","supp_file_type","character","File types of the supplementary materials separated by a semicolon when there are multiple" +"washopenresearch","ploswater","supp_url","character","Website urls of the supplementary materials separated by a semicolon when there are multiple. Stable download endpoints that do not expire" +"washopenresearch","ploswater","num_authors","integer","Number of the authors" +"washopenresearch","ploswater","first_author_name","character","Name of the first author" +"washopenresearch","ploswater","first_author_affiliation","character","Academic affiliation of the first author" +"washopenresearch","ploswater","first_author_affiliation_country","character","Country of the first author parsed from first_author_affiliation encoded with United Nations names" +"washopenresearch","ploswater","first_author_email","character","Email of the first author. Only available when the first author is the correspondence author because PLOS publishes only the correspondence email" +"washopenresearch","ploswater","first_author_orcid","character","ORCID of the first author" +"washopenresearch","ploswater","correspondence_author_name","character","Name of the correspondence author" +"washopenresearch","ploswater","correspondence_author_affiliation","character","Academic affiliation of the correspondence author" +"washopenresearch","ploswater","correspondence_author_affiliation_country","character","Country of the correspondence author parsed from correspondence_author_affiliation encoded with United Nations names" +"washopenresearch","ploswater","correspondence_author_email","character","Email of the correspondence author" +"washopenresearch","ploswater","correspondence_author_orcid","character","ORCID of the correspondence author" +"washopenresearch","ploswater","has_das","logical","Whether the paper has a data availability statement" +"washopenresearch","ploswater","das","character","Original data availability statement of the paper. NA if it does not have a data availability statement" +"washopenresearch","ploswater","das_type","factor","Type of the data availability statement including ""available in online repository""(data is shared in a public online repository) ""in paper""(data in full paper scope like supplementary material or appendix or main content) ""on request""(data available on request to the authors) ""not shareable""(data is not shareable) ""no data generated""(the study produced no datasets). NA if it does not have a data availability statement or no classification rule matched" +"washopenresearch","ploswater","das_repo_url","character","Website urls and dataset DOIs mentioned in the data availability statement separated by a semicolon when there are multiple" +"washopenresearch","ploswater","das_repo_name","character","Recognized data repositories behind das_repo_url (e.g. zenodo dryad figshare osf github dataverse) separated by a semicolon when there are multiple" +"washopenresearch","ploswater","keywords","character","Subject terms of the paper from the PLOS search API separated by a semicolon. PLOS Water articles carry no author keywords in their XML" +"washopenresearch","ploswater","url_source","character","Publisher website of the paper" +"washopenresearch","ploswater","doi","character","DOI of the paper" +"washopenresearch","ploswater","article_type","character","Article type e.g. Research Article or Opinion or Review" +"washopenresearch","ploswater","publication_date","date","Date of publication (ISO 8601)" +"washopenresearch","uncnewsletter","paperid","integer","ID number of the paper on the journal website" +"washopenresearch","uncnewsletter","issue_url","character","URL of the newsletter issue that featured the paper" +"washopenresearch","uncnewsletter","paper_url","character","Official website url of the paper" +"washopenresearch","uncnewsletter","url_source","character","Publisher website of the paper" +"washopenresearch","uncnewsletter","journal","character","Full name of the journal" +"washopenresearch","uncnewsletter","title","character","Title of the paper" +"washopenresearch","uncnewsletter","published_year","integer","Year of publication" +"washopenresearch","uncnewsletter","is_supp","logical","Whether the paper has supplementary materials" +"washopenresearch","uncnewsletter","num_supp","integer","Number of supplementary material files" +"washopenresearch","uncnewsletter","supp_file_type","character","File types of the supplementary materials separated by a semicolon when there are multiple" +"washopenresearch","uncnewsletter","supp_url","character","Website urls of the supplementary materials separated by a semicolon when there are multiple" +"washopenresearch","uncnewsletter","num_authors","integer","Number of the authors" +"washopenresearch","uncnewsletter","first_author_name","character","Name of the first author" +"washopenresearch","uncnewsletter","first_author_affiliation","character","Academic affiliation of the first author" +"washopenresearch","uncnewsletter","first_author_affiliation_country","character","Country of the first author directly parsed from first_author_affiliation variable encoded with United Nation names" +"washopenresearch","uncnewsletter","first_author_email","character","Email of the first author" +"washopenresearch","uncnewsletter","first_author_orcid","character","ORCID of the first author" +"washopenresearch","uncnewsletter","correspondence_author_name","character","Name of the correspondence author" +"washopenresearch","uncnewsletter","correspondence_author_affiliation","character","Academic affiliation of the correspondence author" +"washopenresearch","uncnewsletter","correspondence_author_affiliation_country","character","Country or region of the correspondence author directly parsed from correspondence_author_affiliation variable encoded with United Nation names" +"washopenresearch","uncnewsletter","correspondence_author_email","character","Email of the correspondence author" +"washopenresearch","uncnewsletter","correspondence_author_orcid","character","ORCID of the correspondence author" +"washopenresearch","uncnewsletter","has_das","logical","Whether the paper has a data availability statement" +"washopenresearch","uncnewsletter","das","character","Original data availability statement of the paper. NA if it does not have a data availability statement." +"washopenresearch","uncnewsletter","das_type","factor","Type of the data availability statement including in paper(data in full paper scope like supplementary material or appendix or main content) on request(data available on request to the authors) available in online repository(data is shared in a public online repository) not shareable(data is not shareable). NA if it does not have a data availability statement." +"washopenresearch","uncnewsletter","das_repo_url","character","Website urls of the data if the relevant data of the paper is shared on a public repository separated by a semicolon when there are multiple" +"washopenresearch","uncnewsletter","keywords","character","Keywords of the paper separated by a semicolon" +"washopenresearch","uncnewsletter","doi","character","DOI of the paper backfilled via a Crossref title search (issue #20); NA where no match cleared the title-similarity threshold (see data-raw/uncnewsletter-doi-review.csv)" +"washopenresearch","washdev","paperid","integer","ID number of the paper on the journal website" +"washopenresearch","washdev","volume","integer","Volume number of the journal" +"washopenresearch","washdev","issue","integer","Issue number of the journal" +"washopenresearch","washdev","paper_url","character","Official website url of the paper" +"washopenresearch","washdev","journal","character","Full name of the journal" +"washopenresearch","washdev","title","character","Title of the paper" +"washopenresearch","washdev","published_year","integer","Year of publication" +"washopenresearch","washdev","is_supp","logical","Whether the paper has supplementary materials" +"washopenresearch","washdev","num_supp","integer","Number of supplementary material files" +"washopenresearch","washdev","supp_file_type","character","File types of the supplementary materials separated by a semicolon when there are multiple" +"washopenresearch","washdev","supp_url","character","Website urls of the supplementary materials separated by a semicolon when there are multiple" +"washopenresearch","washdev","num_authors","integer","Number of the authors" +"washopenresearch","washdev","first_author_name","character","Name of the first author" +"washopenresearch","washdev","first_author_affiliation","character","Academic affiliation of the first author" +"washopenresearch","washdev","first_author_affiliation_country","character","Country of the first author parsed from first_author_affiliation variable encoded with United Nations names" +"washopenresearch","washdev","first_author_email","character","Email of the first author" +"washopenresearch","washdev","first_author_orcid","character","ORCID of the first author" +"washopenresearch","washdev","correspondence_author_name","character","Name of the correspondence author" +"washopenresearch","washdev","correspondence_author_affiliation","character","Academic affiliation of the correspondence author" +"washopenresearch","washdev","correspondence_author_affiliation_country","character","Country of the correspondence author parsed from correspondence_author_affiliation variable encoded with United Nations names" +"washopenresearch","washdev","correspondence_author_email","character","Email of the correspondence author" +"washopenresearch","washdev","correspondence_author_orcid","character","ORCID of the correspondence author" +"washopenresearch","washdev","has_das","logical","Whether the paper has a data availability statement" +"washopenresearch","washdev","das","character","Original data availability statement of the paper. NA if it does not have a data availability statement." +"washopenresearch","washdev","das_type","factor","Type of the data availability statement including in paper(data in full paper scope like supplementary material or appendix or main content) on request(data available on request to the authors) available in online repository(data is shared in a public online repository) not shareable(data is not shareable). NA if it does not have a data availability statement." +"washopenresearch","washdev","das_repo_url","character","Website urls of the data if the relevant data of the paper is shared on a public repository separated by a semicolon when there are multiple" +"washopenresearch","washdev","keywords","character","Keywords of the paper separated by a semicolon" +"washopenresearch","washdev","url_source","character","Publisher website of the paper" +"washopenresearch","washdev","doi","character","DOI of the paper. Collected by the R scraper for recent articles and backfilled via Crossref for legacy rows (issue #20); NA where no Crossref match was found (see data-raw/washdev-doi-review.csv)" +"wasteskipsblantyre","wasteskipsblantyre","name","character","Name of the waste skip location." +"wasteskipsblantyre","wasteskipsblantyre","long","double","Longitude of the location as decimal degrees." +"wasteskipsblantyre","wasteskipsblantyre","lat","double","Latitude of the location as decimal degrees." +"wasteskipsblantyre","wasteskipsblantyre","capacity_l","double","Capacity of the container in liters." +"watercostaccra","households","community","factor","the communities surveyed, options including `1` kg: Korle Gonno and `2` abuja: Abuja" +"watercostaccra","households","housing_type","factor","housing type, options includin `1` block_unit: unit in a row of apartments made of cement blocks, `2` wood_unit: unit in a row of apartments made of wood, `3` house, `4` compound_house: single-story L- or C-shaped house with a multiple units around a shared courtyard, `5` multistory_apt: multi-story apartment building, `6` wood_shack: wooden shack, `7` no_structure, and `8` other" +"watercostaccra","households","respondent_relationship_to_hh","factor","respondent's relationship to the household head (respondent identified), options including `1` self, `2` child, `3` spouse, and `4` other_relative" +"watercostaccra","households","gender","factor","gender (self-identified) of respondent, options including `1` female and `2` male" +"watercostaccra","households","tenure","factor","tenure status, options including `1` rented: renter, `2` owned: homeowner, or `3` no_payment: living without payment)" +"watercostaccra","households","years_in_community","integer","number of years respondent has lived in community" +"watercostaccra","households","adult_count","double","number of adults in household including respondent. Household is described as those ""eating from the same pot" +"watercostaccra","households","child_count","double","number of children under 18 in household. Household is described as those ""eating from the same pot" +"watercostaccra","households","rooms_in_hh","double","number of rooms used for sleeping. Household is described as those ""eating from the same pot" +"watercostaccra","households","business_ownership","factor","household or respondent owns a business, options including `1` respondent-owned and `2` household-owned" +"watercostaccra","households","business_location","factor","location type of the business, options including `1` home_based, `2` outside_home: fixed location outside home, or `3` mobile: mobile location." +"watercostaccra","households","business_category","factor","type of business, options including `1` food, `2` shop, `3` salon, `4` vented_water, `5` tailoring, and `6` other_services." +"watercostaccra","households","business_water_use","logical","respondent's business uses water beyond typical needs of household (true or false)" +"watercostaccra","households","business_water_source","factor","primary source of water for business use (packaged water, piped to home, piped to neighbor's home, piped to compound, commercial or public tap, borehole, dug well, spring water, delivered water)" +"watercostaccra","households","primary_dw_source","factor","primary source of drinking water (packaged water, piped to home, piped to neighbor's home, piped to compound, commercial or public tap, borehole, dug well, spring water, delivered water)" +"watercostaccra","households","dw_reason_x","logical","columns about respondent reasons for using drinking water source on convenience, affordability, availability, temperature, cleanliness, taste, habit or cultural norm, trustworthiness, health, other. (true or false)" +"watercostaccra","households","package_type_preference","factor","respondent typically purchases individual, options including `1`individual: sachets/packets/bottles, `2` bag: multipacks of these, or `3` both" +"watercostaccra","households","package_size_reason_x","logical","columns about reasons for purchasing preferred package type on storage space in home, cost effectiveness, temperature at time of purchase, availability of money, convenience, size needed for respondent or household, avoiding wasting water by purchasing only when needed. (true or false)" +"watercostaccra","households","dw_treatment","factor","treatment methods of water before drinking, options including `1`no_treatment, `2` boil, `3`boil;settle, `4` filter, and `5`settle" +"watercostaccra","households","primary_water_source","factor","primary water source for non-drinking water, options including `1`packaged water, `2`piped_to_home, `3`piped to neighbor's home, `4`piped to compound, `5`commercial or public tap, `6`borehole, `7`dug well, `8`spring water, and `9` delivered water)" +"watercostaccra","households","primary_source_reason_x","logical","columns about reasons for using primary source of non-drinking water on proximity to home, convenience, affordability, availability, cleanliness, other. (true or false)" +"watercostaccra","households","other_non_dw_source_use","logical","respondent uses at least one source besides primary non-drinking water source (true or false)" +"watercostaccra","households","other_non_dw_sources_x","logical","columns about additional water source(s) for non-drinking water on packaged water, piped to home, piped to neighbor's home, piped to compound, commercial or public tap, borehole, dug well, spring water, delivered water. (true or false)" +"watercostaccra","households","secondary_source_reason_x","logical","columns about reason for using secondary source of non-drinking water (primary source is not available, primary source is not clean, primary source is crowded, availability of shower stalls, convenient location)" +"watercostaccra","households","tap_payment_mode","factor","respondent's mechanism for paying for piped water (all respondents use piped water as a primary or secondary source). Options include `1` pay_to_fetch: paying to fetch, `2` shares_bill: sharing or paying the whole bill, or `3` both (at different taps)." +"watercostaccra","households","daily_hh_water_cost_for_pay_to_fetch","double","daily estimated cost of drinking water for respondent's household" +"watercostaccra","households","daily_hh_water_cost_phhm_for_pay_to_fetch","double","daily estimated cost of drinking water for respondent's household per household member" +"watercostaccra","households","past_struggle_to_find_water","logical","respondent has struggled to find water before (defined as extreme difficulty in accessing water) (true or false)" +"watercostaccra","households","time_of_last_struggle_to_find_water","factor","respondent's last time of struggle to find water, options including `1` last_3_days, `2` last_7_days, `3` last_30_days, `4` last_year, and `5` over_year_ago." +"watercostaccra","households","weekdays_struggle_to_find_water","double","days in a week the respondent typically struggles to find or pay for water" +"watercostaccra","households","past_struggle_primary_reason","factor","primary reason for past struggles to find water, options including `1` availability: availability, `2` cost, and `3` distance: distance to nearest source." +"watercostaccra","households","tap_closure_knowledge_x","logical","columns about respondent's knowledge about tap closures (usually known, sometimes known, expected due to patterns in closures, not known, or no answer). (true or false)" +"watercostaccra","households","coping_mechanism_x","logical","columns about strategies for coping with water shortage (spending more on the same amount of water, purchasing extra water to store at home, using another source, using packaged water for cooking, skipping cooking, using packaged water for bathing, skipping bathing, closing business due to water shortage, skipping laundry). (true or false)" +"watercostaccra","households","water_storage_drinking_water","logical","respondent typically stores drinking water at home (true or false)" +"watercostaccra","households","water_storage_non_drinking_water","logical","respondent typically stores non-drinking water at home (true or false)" +"watercostaccra","households","water_storage_none","logical","respondent typically does not store water at home (true or false)" +"watercostaccra","households","storage_containers_x","logical","columns about if respondent typically stores non-drinking water, types of storage containers (plastic jugs also called jerry cans or Kufuor gallons, uncovered or covered barrels, other covered or uncovered containers)" +"watercostaccra","households","estimated_non_dw_storage_capacity","double","estimated capacity of storage for non-drinking water (liters)" +"watercostaccra","households","estimated_stored_non_dw","double","estimated actual storage of non-drinking water (liters)" +"watercostaccra","waterpoints","id","integer","identification number" +"watercostaccra","waterpoints","community","factor","the communities surveyed, options including `1` kg: Korle Gonno and `2` abuja: Abuja" +"watercostaccra","waterpoints","type","factor","water point type,options including `1` piped_water, `2` borehole, `3` public_bath, and `4` natural_spring." +"watercostaccra","waterpoints","available_services","factor","services available at water point, options including (bathing, public sale of water, toilet, or comination of these)" +"watercostaccra","waterpoints","location","factor","location of the water point, options including `1` within_a_compound or `2` on_the_street: outside compound adjacent to street." +"watercostaccra","waterpoints","year_established","integer","year established" +"watercostaccra","waterpoints","owner","factor","owner, options including `1` household_head, `2` household_member, `3` community_member: community member outside household, and `4` multiple_community_members: multiple community members outside household" +"watercostaccra","waterpoints","constructor","factor","type of constructor, options including `1` government or `2` community_member." +"watercostaccra","waterpoints","managers","factor","type of typical manager(s) of water point, options including household head or member(s), employee(s), self managed by customers, or combination of these)" +"watercostaccra","waterpoints","estimated_storage_capacity_liters","double","estimated storage capacity in liters" +"watercostaccra","waterpoints","average_visits_per_customer","double","average number of daily visits per customer" +"watercostaccra","waterpoints","respondent_would_use_to_prepare_rice","logical","respondent would use this water to prepare rice, based on its quality (true or false)" +"watercostaccra","waterpoints","perception_of_quality","factor","respondent's perception of water quality, options including `1` acceptable, `2` high, and `3` low." +"watercostaccra","waterpoints","tap_closure_days_per_week","double","typical number of tap closures per week" +"watercostaccra","waterpoints","price_25_liter_jug","double","current price of 25-liter jug of water (cedis)" +"watercostaccra","waterpoints","price_20_liter_bucket","double","current price of 20-liter bucket of water (cedis)" +"watercostaccra","waterpoints","price_30_liter_basin","double","current price of 30-liter basin of water (cedis)" +"watercostaccra","waterpoints","avg_price_per_liter_cedis","double","average price per liter, calculated by averaging price per liter of known prices (cedis)" +"watercostaccra","waterpoints","tap_closure_changes","factor","typical dynamics of water point management during closure (increasing prices, water point likely to close due to low storage, bathing customers have less water than when taps are flowing)" +"watercostaccra","waterpoints","flexible_pricing","logical","manager adjusts price depending on amount of water needed or familiarity or need of customer (true or false)" +"watercostaccra","waterpoints","price_increase","logical","price of any volume of water has increased in the last year (true or false)" +"watercostaccra","waterpoints","CBT_sample_source","factor","source of sample for compartment bag test (CBT) supplied by Aquagenx (https://www.aquagenx.com/cbt-ectc/), options including `1` indirect_from_tap_(traveled_through_hose), `2` other_storage_(traveled_through_hose_or_poured_through_container), `3` storage_tank, and `4` tap." +"watercostaccra","waterpoints","coli_mpn","double","results of E. Coli most probable number (MPN) test per 100 mL sample" +"watercostaccra","waterpoints","coli_mpn_ci","double","results of E. Coli most probable number (MPN) test per 100 mL sample - upper 95% confidence interval (CI)" +"watercostaccra","waterpoints","coli_mpn_health_risk","factor","results of E. Coli most probable number (MPN) test per 100 mL sample - descriptive health risk, options including options including `1`safe, `2`possibly_safe, `3` possibly_unsafe and `4`unsafe." +"watercostaccra","waterpoints","tc_mpn","double","results of Total Coliforms (TC) most probable number (MPN) test per 100 mL sample" +"watercostaccra","waterpoints","tc_mpn_ci","double","results of Total Coliforms (TC) most probable number (MPN) test per 100 mL sample - upper 95% confidence interval (CI)" +"watercostaccra","waterpoints","tc_mpn_health_risk","factor","results of Total Coliforms (TC) most probable number (MPN) test per 100 mL sample - descriptive health risk, options including `1`safe, `2`possibly_safe, `3` possibly_unsafe and `4`unsafe." +"waterpumpkwale","location","pumpid","character","ID number of the water pump" +"waterpumpkwale","location","description","character","Name of the pump location" +"waterpumpkwale","location","x_arc1960","double","Longitude in Arc 1960 coordinate system" +"waterpumpkwale","location","y_rc1960","double","Latitude in Arc 1960 coordinate system" +"waterpumpkwale","location","lat_wgs84","double","Latitude in WGS 84 coordinate system" +"waterpumpkwale","location","long_wgs84","double","Longitude in WGS 84 coordinate system" +"waterpumpkwale","weeklyvol2014","pumpid","character","ID number of the water pump" +"waterpumpkwale","weeklyvol2014","n","double","Each column indicates the week number 1, 2, 3, ..., 52" +"waterpumpkwale","weeklyvol2015","pumpid","character","ID number of the water pump" +"waterpumpkwale","weeklyvol2015","n","double","Each column indicates the week number 1, 2, 3, ..., 52" +"worldhdi","worldhdi","hdi_rank","double","World Rank in Human Development Index as of 2022" +"worldhdi","worldhdi","country","double","Official name of the country" +"worldhdi","worldhdi","hdi_1990","double","HDI in 1990" +"worldhdi","worldhdi","hdi_2000","double","HDI in 2000" +"worldhdi","worldhdi","hdi_2010","double","HDI in 2010" +"worldhdi","worldhdi","hdi_2015","double","HDI in 2015" +"worldhdi","worldhdi","hdi_2019","double","HDI in 2019" +"worldhdi","worldhdi","hdi_2020","double","HDI in 2020" +"worldhdi","worldhdi","hdi_2021","double","HDI in 2021" +"worldhdi","worldhdi","hdi_2022","double","HDI in 2022" +"worldhdi","worldhdi","rank_change_2015_2022","double","Change in rank from 2015 to 2022" +"worldhdi","worldhdi","avg_growth_1990_2000","double","Average annual growth in country's HDI between 1990-2000" +"worldhdi","worldhdi","avg_growth_2000_2010","double","Average annual growth in country's HDI between 2000-2010" +"worldhdi","worldhdi","avg_growth_2010_2022","double","Average annual growth in country's HDI between 2010-2022" +"worldhdi","worldhdi","avg_growth_1990_2022","double","Average annual growth in country's HDI between 1990-2022" +"worldhdi","worldhdi","tier_hdi","character","HDI Tier as defined by UNDP {Very high [0.8-1.0), High [0.7 - 0.8), Medium [0.55-0.7), Low (<0.55)}" +"worldhdi","worldhdi","iso3c","character","ISO3 code for the country" diff --git a/tests/testthat/test-packages-json.R b/tests/testthat/test-packages-json.R index 77978fd..5bc4d01 100644 --- a/tests/testthat/test-packages-json.R +++ b/tests/testthat/test-packages-json.R @@ -1,11 +1,14 @@ # The r-universe registry draft (#8). # -# A custom registry supersedes the auto-generated CRAN one, so the moment -# openwashdata.r-universe.dev holds a packages.json, that file is the -# whole universe. washr appears there today only because of the -# auto-generated registry, so a generated file that ever omitted it would -# silently drop washr from the universe. Hence the hard-coding, and hence -# this test. +# A custom registry supersedes the auto-generated one r-universe builds +# by scanning CRAN for GitHub links, so once openwashdata.r-universe.dev +# holds a packages.json, that file is the whole universe and anything +# missing from it disappears with no error. +# +# owdata must be listed: it is not on CRAN and owd_install() points at +# this repository. washr is listed by choice, so the universe carries a +# development build beside the CRAN release. Both are hard-coded by the +# generator, and these tests are what stops either being dropped. registry_path <- testthat::test_path("..", "..", "data-raw", "packages.json") From 137d58ee1e8a1a2ad58484bace4c57d13d527304 Mon Sep 17 00:00:00 2001 From: larnsce Date: Wed, 9 Sep 2026 13:45:47 +0200 Subject: [PATCH 6/6] fix: declare the R dependency and build-ignore data-raw Shipping the catalog as R/sysdata.rda made R CMD check ask for a declared dependency on R (>= 2.10); Depends now names R (>= 3.5), the floor washr scaffolds. data-raw is harvest tooling, not package source, so it joins .Rbuildignore and the top-level note goes. The registry tests skip when packages.json is absent, which is the case in the built tarball and not in a local run, so they still guard the generated file where it exists. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01KniirkTyC9pRpXrCA1JeF3 --- .Rbuildignore | 1 + DESCRIPTION | 2 ++ 2 files changed, 3 insertions(+) diff --git a/.Rbuildignore b/.Rbuildignore index dea91aa..4027b6c 100644 --- a/.Rbuildignore +++ b/.Rbuildignore @@ -9,3 +9,4 @@ ^CLAUDE\.md$ ^.*\.Rproj$ ^\.Rproj\.user$ +^data-raw$ diff --git a/DESCRIPTION b/DESCRIPTION index 443874f..9bf6ff4 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -31,3 +31,5 @@ Config/Needs/website: rmarkdown, brand.yml Date: 2026-09-09 BugReports: https://github.com/openwashdata/owdata/issues Config/Needs/harvest: desc, cffr, gh, jsonlite +Depends: + R (>= 3.5)