Skip to content
Snippets Groups Projects
as.data.list.R 3.34 KiB
Newer Older
  • Learn to ignore specific revisions
  • pbac's avatar
    pbac committed
    # Do this in a separate file to see the generated help:
    # library(devtools)
    # document()
    # load_all(as.package("../../onlineforecast"))
    # ?as.data.list
    # ?as.data.list.data.frame
    
    
    #' These functions will convert the object into a data.list.
    #'
    #' A data.list is simply a list of vectors and data.frames. For the use in the 
    #' onlineforecast package the following format must be kept:
    #' 
    #'   - t: A vector of time.
    #' 
    #'   - vectors with same length as t: Holds observations and values synced to time t.
    #' 
    #'   - data.frames with number of rows as time t: Holds forecasts in each column named by \code{kxx} where \code{xx} is the
    #'                                                horizon, e.g. \code{k0} is synced as observations, and \code{k1} is one-step ahead.
    #'
    #' @title Convert to data.list class
    #' @param object The object to be converted into a data.list
    #' @return a value of class data.list
    
    pbac's avatar
    pbac committed
    #' @seealso \code{For specific detailed info see the children, e.g. \link{onlinefocast:::as.data.list.data.frame} }
    
    pbac's avatar
    pbac committed
    #' 
    
    pbac's avatar
    pbac committed
    #' @rdname as.data.list
    
    pbac's avatar
    pbac committed
    #' @export
    
    pbac's avatar
    pbac committed
        UseMethod("as.data.list")
    }
    
    
    #' Convert a data.frame into a data.list
    #'
    #' The convention is that columns with forecasts are postfixed with \code{.kxx} where
    #' \code{xx} is the horizon. See the examples.
    #'
    #' @title Convertion of data.frame into data.list
    
    #' @param object The data.frame to be converted.
    
    pbac's avatar
    pbac committed
    #' @return a data.list
    #' @seealso as.data.list
    #' @examples
    #' # Convert a dataframe with time and two observed variables
    #' X <- data.frame(t=1:10, x=1:10, y=1:10)
    #' as.data.list(X)
    #'
    #' # Convert a dataframe with time, forecast and an observed variable
    
    #' X <- data.frame(t=1:10, x.k1=1:10, x.k2=10:1, yobs=1:10, y.k1=1:10, y.k2=1:10)
    
    pbac's avatar
    pbac committed
    #' as.data.list(X)
    #'
    #' # Can be converted back and forth
    #' X
    #' as.data.frame(as.data.list(X))
    #'
    
    pbac's avatar
    pbac committed
    #' @rdname as.data.list
    
    pbac's avatar
    pbac committed
    #' @export
    
    pbac's avatar
    pbac committed
    
    
    pbac's avatar
    pbac committed
    as.data.list.data.frame <- function(object) {
        X <- object
        #TEST
        #grep("\\.[hk][[:digit:]]+$", c("Ta.k1","Ta.k2","I.h1"))
        # Check which columns hold forecasts and must be returned as data.frames in the data.list
        inmsfor <- grep("\\.[hk][[:digit:]]+$", names(X))
        #
        if(length(inmsfor) > 0){
            # Find the names of them
            nmsfor <- unique(unlist(
                getse(strsplit(names(X)[inmsfor], "\\."), 1)
            ))
            # Group all in a list
            # Note that "u.k2y" is matched, but it maybe shouldn't be: grep("\\.k[:digit:]*", c("ij.k1","i","u.k2y"))
            L <- lapply(nmsfor, function(nm){
                return(inmsfor[grep(pst("^",nm), names(X)[inmsfor])])
            })
            names(L) <- nmsfor
            # The vectors (time t, and observations)
            Lobs <- as.list((1:ncol(X))[-inmsfor])
            names(Lobs) <- names(X)[-inmsfor]
        }else{
            # No forecasts found
            L <- list()
            # The vectors (time t, and observations)
            Lobs <- as.list((1:ncol(X)))
            names(Lobs) <- names(X)
        }
        #
        # Combine and sort like the order they came in
        L <- c(L, Lobs)
        L <- L[order(unlist(getse(L, 1)))]
        #
        # Make the data.list
        val <- lapply(L, function(i) {
            tmp <- X[ ,i]
            if(!is.null(dim(tmp))){
                # Its a forecast, hence a data.frame, remove "name." from the column names
                names(tmp) <- getse(strsplit(names(tmp), "\\."), 2)
            }
            return(tmp)
        })
        class(val) <- "data.list"
        return(val)
    }