Я пытаюсь отфильтровать вектор целых чисел.
Мое условие состоит в том, что расстояние между двумя последовательными элементами должно быть не менее 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]
Что было бы эффективным способом получить ожидаемый результат? Можно ли это сделать с помощью векторизации?