在 r 中的 xts 上进行最后一次观察(locf)? (不像 na.approx?)

Last observation carried forward (locf) on xts in r? (not like na.approx?)

我希望 "Last Observation Carried Forward (LOCF)" 从一个 xts 时间序列到另一个包含我想使用的时间戳的 xts 序列。我试过 na.locf,但 xout 似乎不起作用,正如我从 na.approx 得知的那样。

如有任何建议,我们将不胜感激!

举个例子:

我有两个xts时间序列数据集。一个是我的数据,另一个是我想使用的时间戳。

xts_with_data <- as.xts(read.zoo(text='
2016-07-01 00:00:10,   1.0
2016-07-01 00:00:14,   2.0
2016-07-01 00:00:20,   3.0
2016-07-01 00:00:29,   4.0
2016-07-01 00:00:34,   5.0
2016-07-01 00:00:39,   6.0
', sep=',', index=1, tz='', format="%Y-%m-%d %H:%M:%S"))
names(xts_with_data) <- c('x')

xts_with_timestamps <- as.xts(read.zoo(text='
2016-07-01 00:00:15,   0.0
2016-07-01 00:00:20,   0.0
2016-07-01 00:00:30,   0.0
2016-07-01 00:00:35,   0.0
2016-07-01 00:00:38,   0.0
', sep=',', index=1, tz='', format="%Y-%m-%d %H:%M:%S"))

我要的是这个:

                    [,1]
2016-07-01 00:00:15    2
2016-07-01 00:00:20    3
2016-07-01 00:00:30    4
2016-07-01 00:00:35    5
2016-07-01 00:00:38    5

(即来自 xts_with_timestamps 的时间戳和来自 xts_with_data 的相应 locf)。

我想我可以像这样用 xout 来做(这对 na.approx 很好用):

na.locf(xts_with_data, xout = index(xts_with_timestamps))

但这只是 returns 我原来的 xts_with_data

有什么建议吗?

提前致谢。

在应用na.locf()之前使用merge()加入两个系列是一种方法。

xts_all <- merge(xts_with_data, xts_with_timestamps)[,-2]
na.locf(xts_all)[index(xts_with_timestamps)]

#                     x
# 2016-07-01 00:00:15 2
# 2016-07-01 00:00:20 3
# 2016-07-01 00:00:30 4
# 2016-07-01 00:00:35 5
# 2016-07-01 00:00:38 5

似乎 xout 适用于 na.approx() 但不适用于 na.locf() 的原因似乎是后者有一个 xts 方法似乎不正确传递额外的参数。但是,您可以强制使用默认方法,从而恢复对 xout

的支持
na.locf.default(xts_with_data, xout=index(xts_with_timestamps))
# or
na.locf(zoo(xts_with_data), xout=index(xts_with_timestamps))

#                     x
# 2016-07-01 00:00:15 2
# 2016-07-01 00:00:20 3
# 2016-07-01 00:00:30 4
# 2016-07-01 00:00:35 5
# 2016-07-01 00:00:38 5