diff --git a/R/make_periodic.R b/R/make_periodic.R new file mode 100644 index 0000000000000000000000000000000000000000..77cc7bdd6116224182df6b0f92c723ba4244a5d2 --- /dev/null +++ b/R/make_periodic.R @@ -0,0 +1,46 @@ +## Do this in a separate tmp.R file to check the documentation +#library(devtools) +#document() +#load_all(as.package("../../onlineforecast")) +#?make_periodic + +#' Make an forecast matrix with a periodic time signal. +#' +#' This function creates a data.frame with k-steps-ahead values of a periodic time signal, +#' such that it can be added to a data.list and used inputs to a forecast model. +#' +#' @param time vector of times of class "POSIXct" "POSIXt". +#' @param kseq vector of integers, representing the desired "k-steps ahead". +#' @param period a numeric setting the length of the period in seconds. +#' @param offset a numeric setting an offset in the period start in seconds. +#' @param tstep step time of k in seconds. +#' @return Returns a forecast matrix (data.frame) with rownames = times, colnames = k1, k2, k3, ... +#' The content of the data frame is the hour of day. +#' @keywords periodic lags data.frame +#' @seealso make_tday +#' @examples +#' # Create a time sequence of 30 min sample period +#' tseq <- seq(ct("2019-01-01"), ct("2019-02-01 12:00"), by=1800) +#' +#' # Make the three hourly periodic sequence +#' make_periodic(tseq, 1:10, 3*3600) +#' +#' # With an offset of one hour +#' make_periodic(tseq, 1:10, 3*3600, 3600) +#' +#' @export + +make_periodic <- function(time, kseq, period, offset=0, tstep=NA){ + # If tstep not given, then take it from time assuming same k-step is the sampling period + if(is.na(tstep)){ + tstep <- as.numeric(time[2] - time[1], units="secs") + } + # The time of day (in the specified units) + tday <- sapply(kseq, function(k){ + tk <- time + k * tstep - offset + as.numeric(tk,units="secs") %% period + }) + # set row and column names + nams(tday) <- paste0('k', kseq) + return( as.data.frame(tday) ) +} diff --git a/R/make_tday.R b/R/make_tday.R index ab21fd5fe3f39f1ca67eea060911100bff5b50d5..049736a3c118ef4900b297b4a1265dfbf1a3c2bd 100644 --- a/R/make_tday.R +++ b/R/make_tday.R @@ -4,38 +4,42 @@ #load_all(as.package("../../onlineforecast")) #?make_tday -#' Make an hour-of-day data.frame with k-step ahead columns. +#' Make an hour-of-day forecast matrix #' #' This function creates a data.frame with k-steps-ahead values of hour of day, #' such that it can be added to a data.list and used inputs to a forecast model. #' #' @param time vector of times of class "POSIXct" "POSIXt". -#' @param kseq vector of integers, respresenting the desired "k-steps ahead". +#' @param kseq vector of integers, representing the desired "k-steps ahead". #' @param tstep step time of k in seconds. -#' @param units to return in, e.g. "hours" or "mins" -#' @return Returns a data.frame with rownames = times, colnames = k1, k2, k5, ... -#' The content of the data frame is the hour of day, following the setup in "onlineforecast" setup. +#' @return Returns a forecast matrix (data.frame) with rownames = times, colnames = k1, k2, k3, ... +#' The content of the data frame is the hour of day. #' @keywords hourofday lags data.frame +#' @seealso make_periodic #' @examples -#' # Create a time sequence +#' # Create a time sequence of 30 min sample period #' tseq <- seq(ct("2019-01-01"), ct("2019-02-01 12:00"), by=1800) #' -#' # Make the time of day sequence +#' # Make the time of day sequence (assuming time between k steps is same as for tseq) #' make_tday(tseq, 1:10) #' -#' # With 0.5 hour steps and in minutes -#' make_tday(tseq, 1:10, tstep=1800, units="mins") +#' # With 0.5 hour steps, kstep in hours +#' make_tday(tseq, 1:10, tstep=3600) #' #' #' @export -make_tday <- function(time, kseq, tstep=3600, units="hours"){ - ## The time of day (in the specified units) +make_tday <- function(time, kseq, tstep=NA){ + # If tstep not given, then take it from time assuming same k-step is the sampling period + if(is.na(tstep)){ + tstep <- as.numeric(time[2] - time[1], units="secs") + } + # The time of day (in the specified units) tday <- sapply(kseq, function(k){ tk <- time + k * tstep - as.numeric( tk - trunc(tk, units="days"), units=units) + as.numeric( tk - trunc(tk, units="days"), units="hours") }) - ## set row and column names + # set row and column names nams(tday) <- paste0('k', kseq) return( as.data.frame(tday) ) }