我必须使用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?
答案 0 :(得分: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
。您可以使用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
和xs
有一些日期,那么您的最终xts
对象中将有重复的索引。例如,如果我们替换y:
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
答案 1 :(得分:2)
What you want => merge(data.frame(x,d),data.frame(y,d),by=c("d","a"),all=T
)
你应该使用data.frame而不是名称向量/矩阵,这里是一个通用的解决方案,你想要的只是一个带有完全外连接的单行(看看?合并)
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
答案 2 :(得分:1)
确定。花了一些时间思考这个。因为最终我需要将许多这样的数据帧/ xts“合并”成一个,而不仅仅合并其中两个,我认为一步完成所有这一切是有意义的:创建一个包含所有日期/变量组合的大矩阵。然后逐个对象插入所有观察到的数据的大矩阵。代码如下所示(很乐意对其进行评论,并且可以随意使用,当然没有任何保证):
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)
}
答案 3 :(得分:0)
我想把它转换成数值数组(as.numeric(ts)),用cbind(ts1,ts2)连接它然后回到时间序列ts(c(as.numeric) (TS1),as.numeric(TS2))