XTS objective 中观察值的滚动计数(按列)

Rolling count of observations in XTS objective by columns

我正在尝试创建一个 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

这解决了问题。我正在使用普通的旧 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))