检查R中变量的值(v)的前一个/连续数字

Kit*_*asi 2 r

如果我有以下变量:

numbers<-c(1,2,3,-5,4,5,6,-5,1,2,1,1,1,1,7,1,1,1,8,1,1,1,1,1,1,1,1,1,1,9,10,11,12,13,14,15,1,1,1,5
,5,5,5,5,5,5,5,5,5,5,5,5,5,5,78,78,78,78,78,78,78,3,3,3,3,3,3,3,3,3,3,3,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,0,0,0,0,0,-5,0,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,0,0,0,0,-5,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-5,-5,0,0)
Run Code Online (Sandbox Code Playgroud)

我首先要找到所有-5值:

index<-which(numbers == -5)
[1]   4   8  95 101 135 150 151
value<-numbers[which(numbers == -5)]
[1] -5 -5 -5 -5 -5 -5 -5
Run Code Online (Sandbox Code Playgroud)

我现在要做的是检查发生-5的位置之前和之后5个值,看看是否所有值都等于0,如果是这样,那么保持它的起始索引()如果不从以下位置删除它:indexindex

因此,在以下情况下,期望的结果将是:

r
95 101 135
Run Code Online (Sandbox Code Playgroud)

好吧,我设法用两个独立的for循环解决问题,一个if条件和一个临时列表2(一个元素保存索引号一个值)和一个变量用于存储结果.

但是我确定有更好/更短/更快的结果吗?任何建议?在最好的情况下,如果可能的话,我更喜欢基础R答案.

Rol*_*and 6

which(
  stats::filter(numbers == 0L,#logical vector 
                c(rep(1, 5), 0, rep(1, 5)) #sum 5 preceding and following logical values
  ) == 10L & #10 TRUE values?
    numbers == -5L
)
#[1]  95 101 135
Run Code Online (Sandbox Code Playgroud)