回填矢量以每小时为基础持续NA

时间:2016-06-09 08:10:01

标签: r xts

我有一个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= ?)

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

2 个答案:

答案 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

注意:不使用其他包: - )