首页 > 解决方案 > 根据条件过滤向量

问题描述

我正在尝试过滤整数向量。
我的条件是 2 个连续元素之间的距离至少应为 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

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

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

24 128 228 356 532 634 839 997

我设法创建了一个快速而肮脏的循环,它给出了正确的结果,但我可以猜测它对于非常大的向量不会很有效......

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]

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

标签: rvectorfilter

解决方案


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

推荐阅读