XTS目标中按列的观测值的滚动计数

时间:2018-10-05 06:49:35

标签: r xts

我正在尝试创建一个XTS对象,该对象包含另一个XTS对象中包含的观测值的滚动计数,其中观测值不等于NA或0。

XTS对象看起来像这样:

Date         Col1    Col2    Col3
2015-06-30   1.25    1.58    NA
2015-07-31   58.7    1.87    0
2015-08-31   NA      71.8    0 
2015-09-30   15.4    78.1    0
2015-10-31   7.25    62.4    15
2015-11-30   1.0     11.5    78

所需的输出如下:

Date         Col1    Col2    Col3
2015-06-30   1       1       NA
2015-07-31   2       2       NA
2015-08-31   NA      3       NA 
2015-09-30   1       4       NA
2015-10-31   2       5       1
2015-11-30   3       6       2

1 个答案:

答案 0 :(得分:1)

这可以解决问题。我正在使用普通的旧for循环来完成此任务。有人可能会说它不应该在R中使用,因为它很慢,但是,有时很难找到一个没有它的优雅而直接的解决方案。

library(xts)
x <- read.table(text = "Date         Col1    Col2    Col3
2015-06-30   1.25    1.58    NA
2015-07-31   58.7    1.87    0
2015-08-31   NA      71.8    0 
2015-09-30   15.4    78.1    0
2015-10-31   7.25    62.4    15
2015-11-30   1.0     11.5    78", header = TRUE)


xtbl <- xts(x[,-1], order.by = as.Date(x[[1]]))

roll_count <- function(y) {
  y <- is.na(y) | y == 0
  y <- as.numeric(!y)
  for(i in seq_along(y)[-1]) {
    if(y[i] != 0) {
      y[i] <- y[i-1] + y[i]  
    }
  }
  y[y == 0] <- NA
  y
}

res <- apply(xtbl, 2, roll_count)
as.xts(res, order.by = index(xtbl))