【问题标题】:Merge xts objects recursively递归合并 xts 对象
【发布时间】:2014-05-07 06:04:40
【问题描述】:

我想创建并合并多个 xts 对象

实际数据来自一个列表(每个时间序列长度可以变化)并转换为 xts。 为了重现性,问题类似于以下

x=xts()
for(i in 1:3){
    n=round(runif(1, 2, 5))
    x=merge(x, x=xts(rnorm(n-1), as.Date(2:n)))
}
x

#                       x       x.1        x.2
# 1970-01-03 01:00:00 0.3130791 0.7817730 0.06623756
# 1970-01-04 01:00:00        NA 0.4827522 0.94823558
# 1970-01-05 01:00:00        NA 0.2411705         NA

如您所见,我需要一个初始的空 xts 对象来开始递归。尽管:

xts(1:3, as.Date(1:3))
#            [,1]
# 1970-01-02    1
# 1970-01-03    2
# 1970-01-04    3

当将生成的 xts 对象与空对象合并时,假定后者具有基于时间的索引。

为了避免时间添加,我可以创建初始 xts 项目,并为其提供明确的虚拟数据。

x= xts(1, as.Date(1))
for(i in 1:3){
    n=round(runif(1, 2, 5))
    x=merge(x, x=xts(rnorm(n-1), as.Date(2:n)))
}
x=x[,-1]
if(all(is.na(x[1,]))) x=x[-1,]
x
#                   x.1         x.2       x.3
# 1970-01-03 -0.5098130 -0.57121953 -1.259878
# 1970-01-04 -0.9984952 -0.26467168 -2.413181
# 1970-01-05  3.0207324 -1.06862153        NA
# 1970-01-06         NA  0.05542239        NA

这行得通,但我必须添加额外的代码来清除虚拟数据,而且很可能,除了虚拟列之外,您还会获得额外的假日期行。

你有一个更聪明的想法来递归合并 xts 对象吗?

【问题讨论】:

    标签: r list recursion merge xts


    【解决方案1】:

    您可以使用do.call 将 xts 对象列表的所有元素合并在一起。

    require(xts)
    #lets create list of xts objects.
    LL <- lapply(1:4, FUN = function(i) xts(1:6, as.Date(1:6) + i))
    
    #merge them all together
    merged.xts <- do.call("merge", LL)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-15
      • 2017-09-16
      • 2012-08-31
      • 1970-01-01
      • 2019-05-08
      • 2012-08-19
      • 2020-11-06
      • 2017-12-08
      相关资源
      最近更新 更多