我有一个XTS对象,每天10分钟的数据。 NA
表示该小时数据的其余部分无效。然后我需要"回填"下一小时的第一个数据点(示例中为9)的无效数据。
示例:
y <- as.xts(c(3,4,NA,8,5,4,9,5,8),as.POSIXct(c("2010-01-05 08:00", "2010-01-05 08:10", "2010-01-05 08:20", "2010-01-05 08:30", "2010-01-05 08:40", "2010-01-05 08:50", "2010-01-05 09:00", "2010-01-05 09:10", "2010-01-05 09:20"), format = "%Y-%m-%d %H:%M"))
期望的输出:
y1 <- as.xts(c(3,4,9,9,9,9,9,5,8),as.POSIXct(c("2010-01-05 08:00", "2010-01-05 08:10", "2010-01-05 08:20", "2010-01-05 08:30", "2010-01-05 08:40", "2010-01-05 08:50", "2010-01-05 09:00", "2010-01-05 09:10", "2010-01-05 09:20"), format = "%Y-%m-%d %H:%M"))
我相信我已经使用ave
功能完成了一半(建议作为对我提出的类似问题的回答here)
y1 <- ave(y, format(as.POSIXct(index(y),format="%Y-%m-%d %H:%M"),"%H"), FUN= ?)
这应该允许我应用函数按小时计算的数据,但这是我卡住的地方。
答案 0 :(得分:2)
#make all values after NA also NA until next hour
y2 <- do.call(c,
tapply(y, trunc(index(y), "hours"),
FUN = function(x) x * cumprod(NA^is.na(x))))
y2 <- as.xts(na.locf(y1, fromLast = TRUE))
# [,1]
#2010-01-05 08:00:00 3
#2010-01-05 08:10:00 4
#2010-01-05 08:20:00 9
#2010-01-05 08:30:00 9
#2010-01-05 08:40:00 9
#2010-01-05 08:50:00 9
#2010-01-05 09:00:00 9
#2010-01-05 09:10:00 5
#2010-01-05 09:20:00 8
答案 1 :(得分:1)
我们可以尝试
y2 <- ave(y, cumsum(is.na(y)), format(index(y)-1, "%H"),
FUN = function(x) if(any(is.na(x))) tail(x,1) else x)
identical(y1, y2)
#[1] TRUE
注意:不使用其他包: - )