跨 NA 和 NULL 行回滚 xts

标签 r xts

我需要从 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/

相关文章:

r - 扩展 xts 对象的索引

r - 向 Shiny figure 添加多个 react 性 geom_lines

r - 如何使用 ggplot2 在一行中添加多个线条样式?

r - x 和 y 变量都在回归中删失

r - 将列名称分配给 R 表的第一列

r - 逐行对列表中的 xts 元素求和

r - 读取带有日期和时间的csv

r - 将 nberDates() 更改为 R 中的时间序列以进行子集化

r - xts 将数据帧转换为字符

r - 将列中的多种日期格式转换为单一形式