我怎样才能在 zoo 或 xts 上使用 na.fill 的 maxgap?
How Can I us maxgap with na.fill on an zoo or xts?
我想在最大间隙为 3 的 xts 中用 0 填充 NA。
library(xts)
# make sample xts with gaps
x <- zoo(1:20, Sys.Date() + 1:20)
x[2:4] <- NA # Short run of NA's
x[10:16] <- NA # Long run of NA's
#This is what I want to do, but it does not work
na.fill(x, 0, maxgap=3)
maxgap 参数被忽略,所有 NA 都填充为 0,我希望它能像 na.approx
澄清@RLave 的问题,我想替换每个长度为 3 或更短的 NA 系列。长度为 4 或更长的 NA 系列应保持不变。期望的行为应与 na.approx
相同
我对 zoo 不是很熟悉,所以不能说它提供的函数或参数是否会为您开箱即用。也就是说,利用 na.fill
的 ix
参数,您可以编写一个简单的包装函数来提供您想要的功能。也许是这样的:
f <- function(object, fill = 0, maxgap = Inf, ...) {
rr <- rle(is.na(object))
ii <- rep(rr$values == FALSE | rr$lengths > maxgap, rr$lengths)
na.fill(object, fill, ix = ii)
}
f(x, 0, maxgap = 3)
## 2019-01-17 2019-01-18 2019-01-19 2019-01-20 2019-01-21 2019-01-22 2019-01-23
## 1 0 0 0 5 6 7
## 2019-01-24 2019-01-25 2019-01-26 2019-01-27 2019-01-28 2019-01-29 2019-01-30
## 8 9 NA NA NA NA NA
## 2019-01-31 2019-02-01 2019-02-02 2019-02-03 2019-02-04 2019-02-05
## NA NA 17 18 19 20
zoo 中有一个未记录和未导出的 .fill_short_gaps
是这样使用的:
zoo:::.fill_short_gaps(x, fill = numeric(length(x)), maxgap = 3)
给予:
2019-01-17 2019-01-18 2019-01-19 2019-01-20 2019-01-21 2019-01-22 2019-01-23
1 0 0 0 5 6 7
2019-01-24 2019-01-25 2019-01-26 2019-01-27 2019-01-28 2019-01-29 2019-01-30
8 9 NA NA NA NA NA
2019-01-31 2019-02-01 2019-02-02 2019-02-03 2019-02-04 2019-02-05
NA NA 17 18 19 20
使用 imputeTS 包有一个非常简单的方法可以做到这一点:
library("imputeTS")
na_replace(x, fill = 0 , maxgap = 3)
这适用于 xts 时间序列对象作为输入 x,以及动物园系列、向量或正常时间序列。
我想在最大间隙为 3 的 xts 中用 0 填充 NA。
library(xts)
# make sample xts with gaps
x <- zoo(1:20, Sys.Date() + 1:20)
x[2:4] <- NA # Short run of NA's
x[10:16] <- NA # Long run of NA's
#This is what I want to do, but it does not work
na.fill(x, 0, maxgap=3)
maxgap 参数被忽略,所有 NA 都填充为 0,我希望它能像 na.approx
澄清@RLave 的问题,我想替换每个长度为 3 或更短的 NA 系列。长度为 4 或更长的 NA 系列应保持不变。期望的行为应与 na.approx
相同我对 zoo 不是很熟悉,所以不能说它提供的函数或参数是否会为您开箱即用。也就是说,利用 na.fill
的 ix
参数,您可以编写一个简单的包装函数来提供您想要的功能。也许是这样的:
f <- function(object, fill = 0, maxgap = Inf, ...) {
rr <- rle(is.na(object))
ii <- rep(rr$values == FALSE | rr$lengths > maxgap, rr$lengths)
na.fill(object, fill, ix = ii)
}
f(x, 0, maxgap = 3)
## 2019-01-17 2019-01-18 2019-01-19 2019-01-20 2019-01-21 2019-01-22 2019-01-23
## 1 0 0 0 5 6 7
## 2019-01-24 2019-01-25 2019-01-26 2019-01-27 2019-01-28 2019-01-29 2019-01-30
## 8 9 NA NA NA NA NA
## 2019-01-31 2019-02-01 2019-02-02 2019-02-03 2019-02-04 2019-02-05
## NA NA 17 18 19 20
zoo 中有一个未记录和未导出的 .fill_short_gaps
是这样使用的:
zoo:::.fill_short_gaps(x, fill = numeric(length(x)), maxgap = 3)
给予:
2019-01-17 2019-01-18 2019-01-19 2019-01-20 2019-01-21 2019-01-22 2019-01-23
1 0 0 0 5 6 7
2019-01-24 2019-01-25 2019-01-26 2019-01-27 2019-01-28 2019-01-29 2019-01-30
8 9 NA NA NA NA NA
2019-01-31 2019-02-01 2019-02-02 2019-02-03 2019-02-04 2019-02-05
NA NA 17 18 19 20
使用 imputeTS 包有一个非常简单的方法可以做到这一点:
library("imputeTS")
na_replace(x, fill = 0 , maxgap = 3)
这适用于 xts 时间序列对象作为输入 x,以及动物园系列、向量或正常时间序列。