根据条件过滤向量

i94*_*xoe 8 r vector filter

我正在尝试过滤整数向量。
我的条件是连续两个元素之间的距离至少应为100;如果不是,请删除该元素,然后查看下一个候选元素。
这是一个例子:

set.seed(42)
input <- sort(sample(1:1000, 20))
head(input, 20)


[1] 24  49  74 128 146 153 165 228 303 321 356 410 532 561 601 622 634 839 882 997
Run Code Online (Sandbox Code Playgroud)

如果我从第一个元素开始24,我想保持与第一个元素的距离至少为100。
在这种情况下,它将为128

然后,从128重复相同的过程。
结果应为:

24 128 228 356 532 634 839 997
Run Code Online (Sandbox Code Playgroud)

我设法创建了一个快速且肮脏的循环,可以给出正确的结果,但是我可以猜到,对于非常大的向量来说,效率不是很高。

result <- integer(length(input))
result[1] <- input[1]
for(i in seq_along(input)[-1]) {
  if(is.na(input[2])) break

  if(input[2] - input[1] < 100) {
    input <- input[-2]
  } else {
    result[i] <- input[2]
    input <- input[-1]
  }
}

result <- result[result != 0]
Run Code Online (Sandbox Code Playgroud)

什么是获得预期结果的有效方法?可以使用向量化吗?

Ony*_*mbu 6

unique(Reduce(function(x,y)ifelse(y-x>=100,y,x),input,accumulate = T))
[1]  24 128 228 356 532 634 839 997
Run Code Online (Sandbox Code Playgroud)

  • 朋友不允许朋友使用`ifelse()`进行标量比较,或`T`进行TRUE`:`unique(Reduce(function(x,y)if(y-x&gt; = 100)y else x,input ,累积= TRUE))` (4认同)