在R中同时对齐多个zoo对象

在R中同时对齐多个zoo对象,r,zoo,R,Zoo,考虑以下动物园对象: 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"),

考虑以下动物园对象:

 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])
请注意,实际上,我有10个变量要与x对齐。 我知道
zoo
包中的函数
na.locf
,但我不知道如何在多个zoo对象的上下文中调整它

我有没有办法有效地做到这一点

谢谢大家!

试试这个:

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))
一年一次的时间可能更可取,但如果时间与
x.zoo
时间相同对您很重要,则添加以下内容:

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

time(out)另一种选择,使用@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
库(lubridate)
#将x.zoo中的日期舍入到最近的月份

索引(x.zoo)在此上下文中如何定义“最近的”
lubridate::round_date
可能会有帮助。这些还不是动物园对象。很抱歉,我跳过了一些代码行。。你可以用
read.zoo(x)
代替
zoo(x[,-1],order.by=x[,1])
。“结果数据的column index.column(默认情况下是第一个)被解释为索引/时间,其余的列是相应的数据。”我想知道您预期的结果:为什么
z
中的最后三个日期不匹配?
> 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
time(out) <- time(x.zoo)
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