R/process_levels.R

Defines functions process_levels

Documented in process_levels

#' Process lake elevation, area, volume data for calcs
#'
#' Processes CSLS lake level data for water/solute balance calculations. Ensures
#' no gaps in daily lake elevation data from CSLSdata::lake_levels, uses
#' CSLSdata::elev_area_vol to convert daily elevations to areas and volumes,
#' then summarizes to desired time step (daily or monthly).
#'
#' If using with non-CSLS data, will need an alternate way to get lake level,
#' lake area, and lake volume data into the format outputted by this function.
#'
#' @param start_date start date of analysis period (POSIX).
#' @param end_date end date of analysis period (POSIX).
#' @param dt time step at which to summarize data. Defaults to "day" for daily
#'           time step, can also be "month" for monthly time step.
#'
#' @return df, a data frame with the following columns:
#'   \item{lake}{name of lake, i.e., "Pleasant", "Long", and "Plainfield"}
#'   \item{date}{date of observation (POSIX). If monthly time step, monthly
#'               summary is assigned to first day of the month}
#'   \item{level_m}{mean lake elevation (mamsl) for the time step (daily or
#'                  monthly)}
#'   \item{area_m2}{mean lake area (m2) for the time step (daily or monthly)}
#'   \item{vol_m3}{mean lake volume (m3) for the time step (daily or monthly)}
#'   \item{dV_m3}{change in lake volume (m3) for the time step (daily or
#'                monthly)}
#'
#' @importFrom magrittr %>%
#' @importFrom rlang .data
#' @importFrom dplyr filter mutate select group_by arrange summarise lag
#' @importFrom lubridate floor_date
#' @importFrom stats approxfun
#'
#' @export

process_levels <- function(start_date, end_date, dt = "day"){
  # Get lake levels (elevations)
  lake_levels  <- CSLSdata::lake_levels %>%
                  select(.data$date, .data$lake, .data$level_m)

  # Interpolate any missing records (to daily time step)
  lake_levels <- interpolate_values(lake_levels, "lake", "level_m",
                                    start_date, end_date)

  # Convert daily elevations to areas and volumes
  elev_area_vol       <- CSLSdata::elev_area_vol
  daily_elev_area_vol <- NULL
  for (lake in unique(lake_levels$lake))  {
    this_elev_area_vol  <- elev_area_vol %>% filter(.data$lake == !!lake)
    f_elev_area         <- approxfun(x = this_elev_area_vol$elev_m,
                                     y = this_elev_area_vol$area_m2)
    f_elev_vol          <- approxfun(x = this_elev_area_vol$elev_m,
                                     y = this_elev_area_vol$vol_m3)
    these_levels        <- lake_levels %>%
                           filter(.data$lake == !!lake) %>%
                           mutate(area_m2 = f_elev_area(.data$level_m),
                                  vol_m3 = f_elev_vol(.data$level_m))
    daily_elev_area_vol <- rbind(daily_elev_area_vol, these_levels)
  }
  daily_elev_area_vol   <- daily_elev_area_vol %>%
                           group_by(.data$lake) %>%
                           arrange(.data$date) %>%
                           mutate(dV_m3 = .data$vol_m3 - lag(.data$vol_m3)) %>%
                           ungroup()

  # Finalize data frame based on time step
  if (dt == "day") {
    # Daily time step
    df <- daily_elev_area_vol
  } else if (dt == "month") {
    # Monthly time step
    df <- daily_elev_area_vol %>%
          group_by(lake = .data$lake,
                   date = floor_date(.data$date, unit = "month")) %>%
          summarise(level_m = mean(.data$level_m),
                    area_m2 = mean(.data$area_m2),
                    vol_m3 = mean(.data$vol_m3),
                    dV_m3 = sum(.data$dV_m3, na.rm = TRUE)) %>%
          ungroup()
  }

  return(df)
}
WDNR-Water-Use/CSLSchem documentation built on July 3, 2020, 10:51 a.m.