[R] behaviour of .cbind.ts

Vaidotas Zemlys mpiktas at gmail.com
Wed Aug 28 16:20:01 CEST 2013


Hi,

Does anyone why the following code produces different results?

a <- cbind(1:10,1:10)
b <- a
colnames(a) <- c("a","b")

colnames(b) <- c("c","d")


colnames(cbind(a,b))
> [1] "a" "b" "c" "d"

colnames(cbind(ts(a),ts(b)))
> [1] "ts(a).a" "ts(a).b" "ts(b).c" "ts(b).d"

Is this or compatibility reasons? Cbind for xts and zoo does not have this feature. I checked the code for stats:::.cbind.ts and the offending piece of code is the following:

        ns <- sum(nsers)
        x <- matrix(, n, ns)
        cs <- c(0, cumsum(nsers))
        nm <- character(ns)
        for (i in 1L:nser) if (nsers[i] > 1) {
            cn <- colnames(sers[[i]])
            if (is.null(cn)) 
                cn <- 1L:nsers[i]
            nm[(1 + cs[i]):cs[i + 1]] <- paste(nmsers[i], cn, 
                sep = ".")
        }
        else nm[cs[i + 1]] <- nmsers[i]

Where nsers is the output of .makeNamesTs and nm is the names of the final cbinded object. There is quite an effort to make the names of cbinded ts object different from the result of cbinded matrix, or data.frame where the resulting name is simply concatenated vector of colnames of objects which are cbinded. I am interested to know why is that? In my experience, there is always a good reason for they way R behaves precisely it does, so in this case maybe I'm missing something. For my current needs I'm using the following function:

cbts <- function(...) {
    dots <- list(...)
    cnames <- unlist(lapply(dots,function(l){
        if(is.null(dim(l)))""
        else colnames(l)
        
    }))
    out <- do.call("cbind",dots)
    colnames(out) <- cnames
    out
}

I need this behaviour because I routinely pass ts objects to dynlm, or operate on ts objects based on their names, so anything that changes the original name is an inconvenience I need to work around.


I've already asked this question on stackoverflow, but did not get answers I needed: http://stackoverflow.com/questions/18488816/why-cbind-for-ts-objects-behaves-different-from-cbind-for-matrices-and-data-fram

Vaidotas Zemlys



More information about the R-help mailing list