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