R/regularize_activity.R

Defines functions regularize_activity

Documented in regularize_activity

#' Regularize activity data
#'
#' \code{regularize_activity} regularizes the timestamps within the
#'   \code{$acticity_data} of an \code{activity} object (column 'ts') to
#'   regular intervals for each animal_tag. The interval is defined by the
#'   parameter \code{minutes}. The following steps are performed:
#'
#'   \enumerate{
#'     \item Round each timestamp to the nearsed regular timestamp.
#'     \item When several data points occur with the same regularized timestamp,
#'        aggregate these by calculating the mean of the activity values.
#'     \item Insert data points for missing regularized timestamps with
#'       NA-activity values .
#'     }
#'
#' @param activity An object of class \code{activity}.
#' @param act.reg_minutes The regular interval in minutes.
#' @return The original activity object with regularized timestamps for its
#'   \code{$acticity_data} in column 'ts'.
#' @examples
#' activity_data <- regularize_activity(data = activity_data, minutes = 5)
#' @import data.table
#' @export


regularize_activity <- function(activity,
                                act.reg_minutes = NULL) {
  # Type check
  if(!is(activity, "activity")){
    stop("Please provide an object of class 'activity'")
  }

  # Change in activity object those parameters that have been provided through
  # the function call
  pars <- as.list(match.call())
  activity <- set_parameters(x = activity, parameters = pars)

  # Extract parameters from activity object
  parameters <- get_parameters(x = activity, parameters = c("act.reg_minutes",
                                                            "act.available_act"))
  minutes <- parameters$act.reg_minutes
  available_act <- parameters$act.available_act
  # Get activity data from activity object
  activity_data <- activity$activity_data

  activity_data[, ts := as.POSIXct(round(as.numeric(ts)/(minutes*60))*(minutes*60),
                                   origin=(as.POSIXlt('1970-01-01')))]

  calculate_mean <- function(x) {as.integer(mean(x, na.rm =T))}

  if (nrow(activity_data[,.N, by = .(animal_tag, ts)][N!=1,.N, by = .(N)]) >0 ){
    activity_data <- activity_data[, lapply(.SD, calculate_mean),
                                   .SDcols = available_act,
                                   by = .(animal_tag,ts) ]
  }

  setkey(activity_data, animal_tag, ts)
  activity_data <-
    activity_data[setkey(activity_data[, seq(min(ts),max(ts),
                                             by = paste(minutes," min", sep = "")),
                                       by = animal_tag], animal_tag, V1)]
  activity_data <- split_animaltag(activity_data)

  col_req <-  c("animal_tag", "animal_id", "tag_code", "ts", available_act)
  col_oth <- names(activity_data)[!names(activity_data) %in% col_req]
  setcolorder(activity_data, c(col_req, col_oth))
  activity$activity_data <- activity_data[order(animal_tag, ts)]
  return(activity)
}
maxkroeschel/activitytools documentation built on July 31, 2023, 1:34 p.m.