检查R

时间:2015-11-20 10:12:24

标签: 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)

我首先要找到所有-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

我现在要做的是检查 -5之前和之后的 5值 -5 的位置,看看所有值是否等于 0 如果是这样的话,请保留它的起始索引(index),如果不从index删除它:

因此,在以下情况中,所需的结果将是:

r
95 101 135

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

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:4)

尝试

index[sapply(index, function(x) all(!numbers[setdiff(pmax(1,
       x-5):pmin(x+5, length(numbers)), x)]))]
#[1]  95 101 135