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