3

有谁为什么以下代码的结果不同?

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"

是这个还是兼容性的原因?xts 和 zoo 的 cbind 没有这个功能。

我总是接受这一点,但现在我的代码充满了以下内容:

ca<-colnames(a)
cb<-colnames(b)
out <- cbind(a,b)
colnames(out) <- c(ca,cb)
4

2 回答 2

2

这正是该cbind.ts方法的作用。stats:::cbind.ts您可以通过、stats:::.cbind.ts和看到相关代码stats:::.makeNamesTs

我无法解释为什么它会有所不同,因为我没有写它,但这里有一个解决方法。

cbts <- function(...) {
  dots <- list(...)
  ists <- sapply(dots,is.ts)
  if(!all(ists)) stop("argument ", which(!ists), " is not a ts object")
  do.call(cbind,unlist(lapply(dots,as.list),recursive=FALSE))
}
于 2013-08-28T13:32:58.217 回答
0

我认为您对为什么会发生这种情况感兴趣。

看一下 的主体stats:::.cbind.ts,它是对时间序列进行列绑定的函数,表明命名是由 执行的.makeNamesTs。看一下stats:::.make.Names.Ts就会发现名称直接来自您传递给的参数cbind,并且没有明显的方法可以影响这一点。例如,尝试:

cbind(ts(a),ts(b, start = 2))

您会发现start第二个时间序列的规范出现在各个列的名称中。

至于为什么会这样……我帮不了你!

于 2013-08-28T13:33:16.660 回答