7

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

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?
4

4 に答える 4

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 を使用して同じ結果を得ることができます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

このソリューションの問題は、との日付が共通していない場合、最終的なオブジェクトにインデックスが重複することです。ysたとえば、 y を置き換えると:xsxts

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

の重複したインデックスが得られるので、それが有効なオブジェクト2013-03-14であるかどうかはわかりません。xts

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

ソリューションの一般化を編集します。

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
于 2013-03-17T09:52:06.430 に答える
2

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

ベクトル/マトリックスに名前を付けるのではなく、data.frameを使用する必要があります。これが一般的な解決策です。必要なのは、完全な外部結合を備えた1つのライナーだけです(?mergeを見てください)

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
于 2013-03-17T10:08:15.847 に答える
1

わかった。これについて考えるのに時間を費やしました。最終的には、そのような多くのデータフレーム/xts を 1 つに「マージ」する必要があり、そのうちの 2 つをマージするだけでなく、これらすべてを 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)
}
于 2013-03-17T13:05:08.303 に答える