ami*_*mit 7 merge r concatenation xts
我必须使用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?
Run Code Online (Sandbox Code Playgroud)
这不是一个通用的解决方案。但适用于这个例子:
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
Run Code Online (Sandbox Code Playgroud)
只是提醒一下,这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
Run Code Online (Sandbox Code Playgroud)
这个解决方案的问题是,如果ys和xs有一些共同的日期,您的最终对象中将会有重复的索引xts。例如,如果我们替换 y :
rownames(y) = as.character(Sys.Date()-3:5)
Run Code Online (Sandbox Code Playgroud)
您得到 的重复索引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
Run Code Online (Sandbox Code Playgroud)
编辑解决方案的概括:
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
Run Code Online (Sandbox Code Playgroud)