簡體   English   中英

在R中一次對齊多個Zoo對象

[英]Aligning multiple zoo objects at once in R

考慮以下動物園對象:

 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])

請注意,這三個動物園對象的長度不同。 我想相對於變量“ x”的日期對齊所有對象:換句話說,我想創建一個包含Date列(對象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函數,但是我不確定如何在多個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))

或者,如果您不想將其寫出來:

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)

更新:較小的改進。

一種替代方法,使用@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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM