我必须xts/zoo对象。每种方法在不同的时间跨度内都有不同变量的度量。我想创建一个单一的时间序列,包含所有时间的所有度量,并使用NAs来查找缺少的日期/变量组合。我该怎么做?人工示例:
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?
发布于 2013-03-17 17:52:06
这不是一个通用的解决方案。但适用于此示例:
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
和xs
有一些相同的日期,那么在最后的xts
object.For示例中,如果我们替换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
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
发布于 2013-03-17 18:08:16
What you want => merge(data.frame(x,d),data.frame(y,d),by=c("d","a"),all=T
)
你应该使用data.frame而不是名称向量/矩阵,这是一个通用的解决方案,你想要的只是一个带有完整外连接的一行(看看?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-17 21:05:08
好的。我花了一些时间思考这个问题。因为最终我需要将许多这样的数据帧/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)
}
https://stackoverflow.com/questions/15459205
复制相似问题