Удалить изолированные элементы вектора - PullRequest
0 голосов
/ 25 февраля 2019

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

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

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

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

v <- c(1,2,3,8,15,16,17)
v[c(FALSE, diff(v) <= 4) | c(diff(v) <= 4, FALSE)]
0 голосов
/ 25 февраля 2019

Вы можете достичь этого с помощью комбинации 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...