发布
社区首页 >问答首页 >连接/合并时间序列(在R中)

连接/合并时间序列(在R中)
EN

Stack Overflow用户
提问于 2013-03-17 17:19:25
回答 4查看 13.5K关注 0票数 7

我必须xts/zoo对象。每种方法在不同的时间跨度内都有不同变量的度量。我想创建一个单一的时间序列,包含所有时间的所有度量,并使用NAs来查找缺少的日期/变量组合。我该怎么做?人工示例:

代码语言:javascript
代码运行次数:0
复制
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?
EN

回答 4

Stack Overflow用户

发布于 2013-03-17 17:52:06

这不是一个通用的解决方案。但适用于此示例:

代码语言:javascript
代码运行次数:0
复制
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获得相同的结果

代码语言:javascript
代码运行次数:0
复制
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

这个解决方案的问题是,如果ysxs有一些相同的日期,那么在最后的xts object.For示例中,如果我们替换y:

代码语言:javascript
代码运行次数:0
复制
rownames(y) = as.character(Sys.Date()-3:5)

您得到的是2013-03-14的重复索引,所以我不确定它是否是一个有效的xts对象。

代码语言:javascript
代码运行次数:0
复制
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是解决方案的概括:

代码语言:javascript
代码运行次数:0
复制
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
票数 4
EN

Stack Overflow用户

发布于 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)

代码语言:javascript
代码运行次数:0
复制
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
EN

Stack Overflow用户

发布于 2013-03-17 21:05:08

好的。我花了一些时间思考这个问题。因为最终我需要将许多这样的数据帧/xts“合并”成一个,而不仅仅是合并其中的两个,我认为在一个步骤中完成所有这一切是有意义的:创建一个包含所有日期/变量组合的大矩阵。然后将所有观察到的数据逐个插入到这个大矩阵中。代码看起来像这样(我很乐意得到关于它的评论,并且可以随意使用,当然没有任何形式的保证):

代码语言:javascript
代码运行次数:0
复制
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)
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15459205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档