2013-03-17 27 views
7

私はxts/zooオブジェクトにする必要があります。それぞれは異なる期間にわたって異なる変数の測定値を有する。私は、すべての尺度を常に含む単一の時系列を作成し、欠落した日付/変数の組み合わせについてはNAsを作成したいと考えています。それ、どうやったら出来るの? 人工的な例:時系列を連結/マージする(R)

library(xts) 
x<-cbind(a=1:3,b=3:1) 
rownames(x) = as.character(Sys.Date()-1:3) 

y<-cbind(a=5:7,c=3:1) 
rownames(y) = as.character(Sys.Date()-5:7) 

xs=as.xts(x) 
ys=as.xts(y) 

#now what? 

#desired outcome looks like: 
      a b c 
2013-03-10 7 NA 1 
2013-03-11 6 NA 2 
2013-03-12 5 NA 3 
2013-03-14 3 1 NA 
2013-03-15 2 2 NA 
2013-03-16 1 3 NA 

# regular merge looks like that (adding an a.1 variable) 
merge(xs,ys) 
      a b a.1 c 
2013-03-10 NA NA 7 1 
2013-03-11 NA NA 6 2 
2013-03-12 NA NA 5 3 
2013-03-14 3 1 NA NA 
2013-03-15 2 2 NA NA 
2013-03-16 1 3 NA NA 

# simple concatenation ignores variable names and looks like that 
c(xs,ys) 
      a b 
2013-03-10 7 1 
2013-03-11 6 2 
2013-03-12 5 3 
2013-03-14 3 1 
2013-03-15 2 2 
2013-03-16 1 3 

# so what should I do? 
+0

もし 'xs'と' ys'の両方が 'a'の値を持っていれば? –

+0

私の目的ではxsが"勝ち "、ysの関連するデータポイントはスロー/無視されます。 私は他の振舞いにも開いています – amit

+0

'xts'は'内側 '、 '外側'、 '左'を行う 'merge'関数を持っています'と'右の 'マージ。しかし、あなたの問題はそれらの「any」に固有の問題ではありません。あなた自身の関数を書く*必要があります。 – Arun

答えて

4

これは一般的な解決策ではありません。しかし、この例のために動作します:

cbind(rbind(xs[,1],ys[,1]), cbind(xs[,-1],ys[,-1])) 
      a b c 
2013-03-10 7 NA 1 
2013-03-11 6 NA 2 
2013-03-12 5 NA 3 
2013-03-14 3 1 NA 
2013-03-15 2 2 NA 
2013-03-16 1 3 NA 

だけcbind.xtsがちょうどmerge.xtsであることを思い出させます。 S君は、このソリューションに問題がysxsがincommonいくつかの日付を持っている場合、我々はYを交換する場合、あなたは、あなたの最終xts object.For例では、インデックスを重複しているということですmerge

merge(rbind(xs[,1],ys[,1]), merge(xs[,-1],ys[,-1])) 
      a b c 
2013-03-10 7 NA 1 
2013-03-11 6 NA 2 
2013-03-12 5 NA 3 
2013-03-14 3 1 NA 
2013-03-15 2 2 NA 
2013-03-16 1 3 NA 

を使用して同じ結果を得ることができます:

rownames(y) = as.character(Sys.Date()-3:5) 

あなたは、それが有効なxtsオブジェクトをそのSA anot必ずそうイム2013-03-14のための重複インデックスを取得します。

merge(rbind(xs[,1],ys[,1]), merge(xs[,-1],ys[,-1])) 
      a b c 
2013-03-12 7 NA 1 
2013-03-13 6 NA 2 
2013-03-14 3 1 3 
2013-03-14 5 NA NA 
2013-03-15 2 2 NA 
2013-03-16 1 3 NA 

EDITソリューションの一般化:

inter <- intersect(names(ys), names(xs)) 
diffx <- setdiff(names(xs),inter) 
diffy <- setdiff(names(ys),inter) 

merge(rbind(xs[,inter],ys[,inter]), merge(xs[,diffx],ys[,diffy])) 


      a b c 
2013-03-10 7 NA 1 
2013-03-11 6 NA 2 
2013-03-12 5 NA 3 
2013-03-14 3 1 NA 
2013-03-15 2 2 NA 
2013-03-16 1 3 NA 
+0

まあ、私の単純な例の背後にある本当のケースは、各時系列には複数の変数(変数の数さえも)が含まれていて、その名前はあらかじめわからないものです。私は、列や変数名を明示的に指定せずにこれらのオブジェクトを「連結」する簡単な方法を探して、「欠損値」にNAを与え、同じ変数の観測値を適切に「積み重ね」ます。 – amit

+0

@amit私に見えます更新。私は一般化を試みた。これはうまくいくはずです。 – agstudy

+0

それは今よりはるかによく見えます。私はまだ簡単なものを見つけたいと思っていました。ありがとう。 – amit

2

What you want => merge(data.frame(x,d),data.frame(y,d),by=c("d","a"),all=T

あなたはここで、ベクトル/行列に名前を付けないdata.frameを使用する必要がありますあなたが望むものを、一般的なソリューションです。完全な外部結合を持つ1つのライナーです(マージを参照)

x<-cbind(a=1:3,b=3:1) 
d= as.character(Sys.Date()-1:3) 
DT1 = data.frame(x,d) 
#DT1 
# a b   d 
#1: 1 3 2013-03-16 
#2: 2 2 2013-03-15 
#3: 3 1 2013-03-14 

y<-cbind(a=5:7,c=3:1) 
d = as.character(Sys.Date()-5:7) 
DT2 = data.frame(y,d) 
#DT2 
# a b   d 
#1: 1 3 2013-03-12 
#2: 2 2 2013-03-11 
#3: 3 1 2013-03-10 
merge(DT1,DT2,by=c("d","a"),all=T) 
#   d a b c 
#1 2013-03-10 7 NA 1 
#2 2013-03-11 6 NA 2 
#3 2013-03-12 5 NA 3 
#4 2013-03-14 3 1 NA 
#5 2013-03-15 2 2 NA 
#6 2013-03-16 1 3 NA 
+0

ここでOPは 'xts'オブジェクトを使用しています。彼らは行列です。 – agstudy

+0

全く同じ...彼が望むのは結合です...それは – statquant

+0

のためのdata.frameです。私はちょうどあなたが上記のようにソリューションがあることをデータフレームのために知っていた。特定の "by"パラメータは十分に一般的ではありませんが、それはなくても動作します。唯一の注意点は、結果がxtsオブジェクトではないということです。さらに、xtsに変換するコマンドがいくつか必要です。 – amit

1

ok。これについて考えていたのです。最終的には、このようなデータフレーム/ xtsを1つに「マージ」する必要があり、2つのデータフレームをマージするだけでなく、すべての日付/ var組み合わせの大きな行列を作成するということが1つのステップでは理にかなっています。この大きな行列にすべての観測データをオブジェクトごとに差し込みます。次のようにコードは(それについてのコメントを取得させていただき、そしてもちろんの保証のいずれかの種類、なし、使用すること自由に感じます)になります。

alltogether = function(dlist) { 
    all.vars = unique(unlist(lapply(dlist,colnames))) 
    all.obs = unique(unlist(lapply(dlist,rownames)))  
    res = array(NA,dim=c(length(all.obs),length(all.vars)), 
      dimnames=list(all.obs,all.vars)) 
    for(d in dlist) { 
      res[rownames(d),colnames(d)]=d 
    } 
    return(res) 
} 

alltogether.xts = function(xlist) { 
    dlist = lapply(xlist,as.matrix) 
    res = alltogether(dlist) 
    xres = as.xts(res) 
    return(xres) 
} 
0

私は(数値配列に変換すると言うでしょう(ts1)、as.numeric(ts2)と連結し、cbind(ts1、ts2)と連結してから時系列に戻ってから、時系列に戻ります。

+0

それは完全に質問に答える –