每小时回填向量到最后一个 NA

Back-fill vector to last NA on an hourly basis

我有一个包含每日 10 分钟数据的 XTS 对象。 NA 表示该小时的其余数据无效。然后我需要 "back fill" 下一个小时的第一个数据点(示例中的 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 函数完成了一半(作为对我问过的类似问题的回答所建议的

y1 <- ave(y, format(as.POSIXct(index(y),format="%Y-%m-%d %H:%M"),"%H"), FUN= ?)

这应该允许我应用按小时分解的数据的函数,但这就是我卡住的地方。

我们可以试试

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

注意:没有使用额外的包:-)

#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