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))

start2 番目の時系列の仕様がそれぞれの列の名前に表示されていることがわかります。

なぜそうなのかについては...私はあなたを助けることができません!

于 2013-08-28T13:33:16.660 に答える