R 检测滚动窗口中的最后一个非零值
我有一个系列如下-R 检测滚动窗口中的最后一个非零值,r,xts,R,Xts,我有一个系列如下- set.seed(107) test <- as.xts(rep(0,1000),Sys.Date()-1:1000) test[sample(1000,50)] <- abs(100 * (1+rnorm(50))) set.seed(107) 使用lappy和自定义函数测试,您还可以查看rollappy以了解类似的功能 #input set.seed(107) test <- as.xts(rep(0,1000),Sys.Date()-1:1000
set.seed(107)
test <- as.xts(rep(0,1000),Sys.Date()-1:1000)
test[sample(1000,50)] <- abs(100 * (1+rnorm(50)))
set.seed(107)
使用lappy
和自定义函数测试,您还可以查看rollappy
以了解类似的功能
#input
set.seed(107)
test <- as.xts(rep(0,1000),Sys.Date()-1:1000)
test[sample(1000,50)] <- abs(100 * (1+rnorm(50)))
#rolling calculations
lookbackPeriod = 20
rollNonZeroTS =
do.call(rbind,lapply(1:nrow(test),function(x) {
#for rows < lookbackPeriod, return NA
if(x < lookbackPeriod) {
windowTS=xts(NA,as.Date(index(test[x])))
return(windowTS)
}else{
#for each date create a rolling window of length equal to lookbackPeriod, here = 20
windowTS=test[(x-lookbackPeriod):x];
# subset for non zero values and choose last value
windowTS=tail(windowTS[windowTS!=0],1);
#if all values are zero in rolling window, output NA else last value
windowTS=xts(ifelse(length(windowTS)==0,NA,windowTS),as.Date(index(test[x])))
return(windowTS)
}
} ))
我编写了这个小函数来解决这个问题:
runLevel <- function(x,lagperiod){
temp <- stats::lag(x,0:lagperiod)
out <- x
out[] <- apply(temp,1,function(x) {
len <- length(x[x!=0])
if (len>0) {
head(x[x!=0],1)
} else {NA}
})
return(out)
}
runlevelhi,。谢谢你的回复。它起作用了。但我自己写了一个函数,我也会在这里发布,更简洁一点。逻辑是一样的,很高兴你能解决它。请务必留意rollply
以便在将来进行简单的窗口操作是的,确实如此。我会的!谢谢:-)
runLevel <- function(x,lagperiod){
temp <- stats::lag(x,0:lagperiod)
out <- x
out[] <- apply(temp,1,function(x) {
len <- length(x[x!=0])
if (len>0) {
head(x[x!=0],1)
} else {NA}
})
return(out)
}
set.seed(107)
test <- as.xts(rep(0,1000),Sys.Date()-1:1000)
test[sample(1000,50)] <- abs(100 * (1+rnorm(50)))
runLevel(test,20)