Скользящий подсчет наблюдений в объективе XTS по столбцам - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь создать объект 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 голосов
/ 05 октября 2018

Это решает проблему.Я использую простой старый 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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...