Удалить изолированные элементы вектора

У меня есть вектор целых чисел, и я хочу отфильтровать его, удалив компоненты, которые "изолированы". Что я имею в виду под "изолированным"? те компоненты, которые не лежат в 4-окрестности другого компонента. Компоненты в векторе упорядочены все больше, и повторений нет.

Например, если у меня есть c(1,2,3,8,15,16,17) то мне нужно исключить 8 потому что не находится в 4-окрестности другого элемента.

Я пытался подать заявку

   for (p in 1:(length(index)-2))
      if((index[p+1]>3+index[p])&(index[p+2]>3+index[p+1])){index[p+1]<-0}


    index<-index[index!=0]

где index мой вектор интереса, но есть некоторые проблемы с логическим условием. Не могли бы вы дать мне несколько советов?

Заранее спасибо.

Ответы

Ответ 1

Вы можете достичь этого с помощью сочетания outer и colSums, т.е.

x[colSums(abs(outer(x, x, '-')) >= 4) == length(x)-1]
#[1] 8

Чтобы исключить значения, мы можем сделать,

i1 <- colSums(outer(x, x, FUN = function(i, j) abs(i - j) >= 4)) == length(x) - 1
x[!i1]
#[1]  1  2  3 15 16 17

где,

x <- c(1,2,3,8,15,16,17)

Ответ 2

Мы сохраняем значения, где предыдущее или следующее различие меньше или равно 4:

v <- c(1,2,3,8,15,16,17)
v[c(FALSE, diff(v) <= 4) | c(diff(v) <= 4, FALSE)]