在 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
我希望 "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