2013-03-17 47 views
7

Xts/zoo nesneleri kullanmam gerekiyor. Her birinin farklı bir zaman dilimi boyunca farklı değişkenlere sahip ölçümleri vardır. Tüm ölçümleri içeren tek bir zaman dizisi oluşturmak istiyorum, NA'lar eksik tarih/değişken kombinasyonları ile. bunu nasıl yaparım? yapay örnek:birleştirme/birleştirme zaman dizileri (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

ne olur? xs' ve 'ys' her ikisi de' a' için –

+0

değerine sahipse, xs "kazanırsa" dır ve ys içindeki ilgili veri noktası atılır/yoksayılır. Diğer davranışlara da açığım. – amit

+0

'xts'' iç', 'dış'' sola' 'birleştirme işlevine sahiptir ve 'sağ' birleştirir. Ama senin problemin, onların hiçbirine özgü değil. * kendi fonksiyonunuzu yazmanız gerekir *. – Arun

cevap

4

Bu genel bir çözüm değildir. Ama bu örneğin çalışır:

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 

Sadece cbind.xts sadece merge.xts olduğunu hatırlatır. S Eğer 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 

biz y değiştirirseniz bu çözümdeki sorun, ys ve xs incommon bazı tarihler varsa, nihai xts object.For örnekte endeksi çoğaltılmış olmasıdır kullanarak aynı sonucu alabilirsiniz :

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

Sen 2013-03-14 için yinelenen endeksi olsun, bu yüzden geçerli xts nesne sa o anot emin im.

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 

DÜZENLEME çözümün bir genelleme:

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

kuyu, basit örneğimin arkasındaki gerçek durum, her zaman dizisinin çoklu değişkenler (hatta değişkenlerin sayısı) içermesi ve isimlerinin zamanın önünde bilmediğim bir şey olmasıdır. Ben sütunları veya değişken isimleri açıkça belirtmeden, bu nesneleri "bitiştirmek" için basit bir yol arıyoruz, böylece "eksik değerler" NA verilir ve aynı değişkenlerin gözlemleri uygun şekilde "yığılmış" – amit

+0

@ amit görebilirsiniz güncelleştirme. Genelleme denedim. Bu çalışmalı. – agstudy

+0

Tamam. şimdi çok daha iyi görünüyor.Hala daha basit bir şey bulmayı umuyordum. Teşekkürler. – amit

2

What you want => merge(data.frame(x,d),data.frame(y,d),by=c("d","a"),all=T) Sen vektörler/matris adı değil data.frame kullanmalıdır

, burada ne istediğinizi, genel çözüm sadece bir dış birleştiriciye sahip olan bir tek astardır (bakınız? Birleştirme)

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

Burada OP 'xts' nesnesini kullanıyor. Onlar matriks. – agstudy

+0

Hepsi aynı ... istediği bir şey ... bu data.frame – statquant

+0

için teşekkürler. Veri çerçeveleri için yukarıda yaptığınız gibi bir çözüm buldum. özel "by" parametresi yeterince genel değil, ama olmadan çalışır. tek uyarı, sonucun bir xts nesnesi olmaması ve bir xts – amit

1

ok. Bu konuda biraz zaman geçirdim. çünkü nihayetinde bu gibi birçok veri çerçevesini/xts'i "birleştirmek" gerekiyor ve sadece iki tanesiyle birleşmiyor, bütün bunları tek adımda gerçekleştirmenin mantıklı olduğunu düşündüm: tüm tarih/var kombinasyonlarının büyük bir matrisini oluşturmak. daha sonra bu büyük matrise bütün gözlenen veriyi, nesneye göre nesneye takmak.

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

Bir sayısal diziye dönüştürmek söyleyebilirim (: Kod aşağıdaki gibi (Üzerinde yorumlar almak için mutlu olacak ve tabii ki, herhangi bir garanti olmadan, kullanmaktan çekinmeyin) görünüyor as.numeric (ts)), cbind (ts1, ts2) ile birleştirin ve sonra zaman serisine geri dönün, ts (c (as.numeric (ts1), as.numeric (ts2))

+0

tamamen soru soruyor –