我需要从 n 天前的 xts 对象中获取数据行,如果 n 个周期前的行不存在或填充有 NA,则向后跳。
这是一个示例数据集。
require(xts)
set.seed(1)
ddf <- data.frame('1m' = rnorm(25), '3m' = rnorm(25))
xxd <- xts(ddf, seq(as.Date('2013-07-27'), length.out = 25, by='day'))
xxd[sample(1:25, 8), ] <- NA
xxd <- xxd[-sample(1:25, 3), ]
xts
对象 xxd
没有 8 月 19 日,也没有 8 月 18 日,而 8 月 17 日都是NA
,所以我想得到8 月 16 日之前。为了做到这一点,我已经编写了一些东西,通过分配到一个环境来使用它,但这看起来不太 R(或非常实用)——正确的方法是什么做这个?
rewindX <- function(Xts, dayRew = 1)
{
flipDates <- function(dayRew)
{
assign('newX', Xts[index(last(Xts)) - dayRew], envir = outXenv)
if(!length(which(!is.na(outXenv$newX))))
{
dayRew <- dayRew + 1
flipDates(dayRew)
}
}
outXenv <- new.env(parent = .GlobalEnv)
flipDates(dayRew)
return(outXenv$newX)
}
因此,为了倒回,我给出 rewindX(xxd, 1)
并获得一行。
这里有两个例子:
> rewindX(xxd, 1)
X1m X3m
2013-08-16 0.9189774 -0.7074952
> rewindX(xxd, 10)
X1m X3m
2013-08-08 -0.6212406 -0.0593134
非常感谢您的指导。
最佳答案
您正在寻找na.locf
Generic function for replacing each NA with the most recent non-NA prior to it.
所以在你的例子中:
set.seed(1)
ddf <- data.frame('1m' = rnorm(25), '3m' = rnorm(25))
xxd <- xts(ddf, seq(as.Date('2013-07-27'), length.out = 25, by='day'))
xxd[sample(1:25, 8), ] <- NA
xxc <- na.locf(xxd)
xxc["2013-08-16/"] ## 19 to 17 are equal to 16
X1m X3m
2013-08-16 0.1437715 -0.7767766
2013-08-17 0.1437715 -0.7767766
2013-08-18 0.1437715 -0.7767766
2013-08-19 0.1437715 -0.7767766
2013-08-20 -0.7970895 0.5767188
关于跨 NA 和 NULL 行回滚 xts,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17896060/