【问题标题】:Aligning multiple zoo objects at once in R在R中一次对齐多个动物园对象
【发布时间】:2013-10-15 20:49:43
【问题描述】:

考虑以下动物园对象:

 x <- data.frame(Date = seq(as.Date("2013-02-01"), length=6, by="1 month") - 1, x = seq(6))
 y <- data.frame(Date = seq(as.Date("2013-02-01"), length=4, by="1 month"), y = seq(4))
 z <- data.frame(Date = seq(as.Date("2012-11-01"), length=9, by="1 month"), z = seq(9))

 x.zoo = zoo(x[,-1], order.by = x[,1])
 y.zoo = zoo(y[,-1], order.by = y[,1])
 z.zoo = zoo(z[,-1], order.by = z[,1])

请注意,这 3 个动物园对象的长度不同。 我想根据变量 "x" 的日期对齐所有对象:换句话说,我想创建一个包含日期列(对象 x 的索引)的新数据框,并且用最接近的可用观察值填充每个变量。

这是我正在寻找的结果:

         Date x  y  z
 1 2013-01-31 1  1  4
 2 2013-02-28 2  2  5
 3 2013-03-31 3  3  6
 4 2013-04-30 4  4 NA
 5 2013-05-31 5 NA NA
 6 2013-06-30 6 NA NA

请注意,实际上,我有 10 个变量要与 x 对齐。 我知道zoo 包中的na.locf 函数,但我不确定如何在多个动物园对象的上下文中调整它。

有没有我可以有效地做到这一点?

谢谢!

【问题讨论】:

  • 在这种情况下,您如何定义“最接近”? lubridate::round_date 可能会有所帮助
  • 那些还不是动物园对象。
  • 对不起,我跳过了一些代码行。。刚刚修复它。
  • 您可以使用read.zoo(x) 代替zoo(x[,-1], order.by = x[,1])。 “结果数据的 index.column 列(默认为第一列)被解释为索引/时间,其余列为对应数据。”
  • 我想知道您的预期结果:为什么z 中的最后三个日期不匹配?

标签: r zoo


【解决方案1】:

试试这个:

xx.zoo <- aggregate(x.zoo, as.yearmon)
yy.zoo <- aggregate(y.zoo, as.yearmon)
zz.zoo <- aggregate(z.zoo, as.yearmon)
out <- merge(x = xx.zoo, y = yy.zoo, z = zz.zoo, all = c(TRUE, FALSE, FALSE))

或者如果你不想写出来:

L <- setNames(list(x.zoo, y.zoo, z.zoo), c("x", "y", "z"))
all. <- c(TRUE, rep(FALSE, length(L) - 1))  # all FALSE except first
out <- do.call(merge, c(lapply(L, aggregate, as.yearmon), all = list(all.)))

给出:

> out
         x  y z
Jan 2013 1 NA 3
Feb 2013 2  1 4
Mar 2013 3  2 5
Apr 2013 4  3 6
May 2013 5  4 1
Jun 2013 6 NA 2

yearmon 时间可能更可取,但如果时间与 x.zoo 时间相同对您很重要,请添加以下内容:

time(out) <- time(x.zoo)

更新:小幅改进。

【讨论】:

    【解决方案2】:

    另一种选择,使用@Ricardo Saporta 对round_date 的建议:

    library(lubridate)
    
    # round dates in x.zoo to nearest month
    index(x.zoo) <- round_date(index(x.zoo), "month")
    
    # merge
    xyz <- merge(x = x.zoo, y = y.zoo, z = z.zoo, all = c(TRUE, FALSE, FALSE))
    
    # make data frame from original x dates and data from zoo object
    data.frame(Date = x$Date, coredata(xyz))
    
    #         Date x  y z
    # 1 2013-01-31 1  1 4
    # 2 2013-02-28 2  2 5
    # 3 2013-03-31 3  3 6
    # 4 2013-04-30 4  4 7
    # 5 2013-05-31 5 NA 8
    # 6 2013-06-30 6 NA 9
    

    【讨论】:

      猜你喜欢
      • 2012-02-27
      • 1970-01-01
      • 1970-01-01
      • 2011-12-14
      • 2012-02-27
      • 1970-01-01
      • 2019-09-09
      • 1970-01-01
      • 2015-02-16
      相关资源
      最近更新 更多