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)