每小时回填向量到最后一个 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
我有一个包含每日 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