我正在尝试过滤整数向量。
我的条件是连续两个元素之间的距离至少应为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)
什么是获得预期结果的有效方法?可以使用向量化吗?
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)