X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=R%2Futils.R;fp=R%2Futils.R;h=0000000000000000000000000000000000000000;hb=469529710f56c790ae932b45d13fed2e34bcabf2;hp=3777f2d8a51d57b0246849ec352434a758589731;hpb=4c59ec9aefef8ea5464723a293b3aa39ee02dc60;p=talweg.git diff --git a/R/utils.R b/R/utils.R deleted file mode 100644 index 3777f2d..0000000 --- a/R/utils.R +++ /dev/null @@ -1,97 +0,0 @@ -#' @title dateIndexToInteger -#' -#' @description Transform a (potential) date index into an integer (relative to data) -#' -#' @param index Date (or integer) index -#' @param data Object of class \code{Data} -#' -#' @export -dateIndexToInteger = function(index, data) -{ - index = index[1] - if (is.numeric(index)) - index = as.integer(index) - if (is.integer(index)) - return (index) - if (inherits(index, "Date") || is.character(index)) - { - tryCatch(dt <- as.POSIXct(index), error=function(e) stop("Unrecognized index format")) - #TODO: tz arg to difftime ? - integerIndex <- round( (as.numeric( difftime(dt, data$getTime(1)) ))[1] ) + 1 - if (integerIndex > 0 && integerIndex <= data$getSize()) - { - #WARNING: if series start at date >0h, result must be shifted - date1 = as.POSIXlt(data$getTime(1)[1]) - date2 = as.POSIXlt(data$getTime(2)[1]) - shift = (date1$year==date2$year && date1$mon==date2$mon && date1$mday==date2$mday) - return (integerIndex + ifelse(shift,1,0)) - } - stop("Date outside data range") - } - stop("Unrecognized index format") -} - -#' @title integerIndexToDate -#' -#' @description Transform an integer index to date index (relative to data) -#' -#' @param index Date (or integer) index -#' @param data Object of class \code{Data} -#' -#' @export -integerIndexToDate = function(index, data) -{ - index = index[1] - if (is.numeric(index)) - index = as.integer(index) - if (!is.integer(index)) - stop("'index' should be an integer") - as.Date( data$getTime(index)[1] ) -} - -#' @title getSimilarDaysIndices -#' -#' @description Find similar days indices in the past -#' -#' @param index Day index (numeric or date) -#' @param limit Maximum number of indices to return -#' @param same_seaon Should the indices correspond to day in same season? -#' -#' @export -getSimilarDaysIndices = function(index, limit, same_season) -{ - index = dateIndexToInteger(index) - - #TODO: mardi similaire à lundi mercredi jeudi aussi ...etc - if (!same_season) - { - #take all similar days in recent past - nb_days = min( (index-1) %/% 7, limit) - return ( rep(index,nb_days) - 7*seq_len(nb_days) ) - } - - #Look for similar days in similar season (+/- 30 days) - days = c() - i = index - while (i >= 1 && length(days) < limit) - { - if (i < index) - { - days = c(days, i) - #look in the "future of the past" - for (j in 1:4) - days = c(days, i+7*j) - } - #...and in the "past of the past" - for (j in 1:4) - { - if (i - 7*j >= 1) - days = c(days, i-7*j) - } - # TODO: exact computation instead of -364 - # 364 = closest multiple of 7 to 365 - drift along the years... but not so many years so OK - i = i - 364 - } - - return ( days[1:min(limit,length(days))] ) -}