Получить индексы двух значений, которые заключены в ноль в R - PullRequest
0 голосов
/ 21 сентября 2018

У меня есть вектор x:

x <- c(-1,-0.5,-0.1,-0.001,0.5,0.6,0.9)

Я хочу, чтобы индекс ближайшего отрицательного значения равнялся нулю, а ближайшее положительное значение равнялось нулю.В этом случае 4 и 5. x не обязательно сортируется.

Я могу сделать это, установив числа в NA:

# negative numbers only
tmp <- x
tmp[x > 0] <- NA
which.max(tmp)
# positive numbers only
tmp <- x
tmp[x < 0] <- NA
which.min(tmp)

Но это кажется неуклюжим.Любые советы?

Ответы [ 3 ]

0 голосов
/ 21 сентября 2018

Другой способ может быть:

#closest positive value to zero.
which(x == min(x[x > 0]))
#[1] 5

#closest negative value to zero
which(x == max(x[x < 0]))
#[1] 4
0 голосов
/ 21 сентября 2018

Мы можем попробовать

rle(sign(x))$lengths[1] + 0:1
#[1] 4 5

, если он не отсортирован, тогда

x1 <- sort(x)
match(x1[rle(sign(x1))$lengths[1] + 0:1], x)
0 голосов
/ 21 сентября 2018

хороший сценарий

Если вы находитесь в классическом случае, где

  1. ваш вектор отсортирован в порядке возрастания,
  2. он не включает 0,
  3. он не имеет связанных значений,

, вы можете просто сделать следующее:

findInterval(0, x, TRUE) + 0:1

Если условие 1 не выполняется, но условия 2 и 3 все еще выполняются, вы можете сделать

sig <- order(x)
sig[findInterval(0, x[sig], TRUE) + 0:1]

ответ Акруна в основном такой же.

плохой сценарий

Все становится сложнее, когда ваш вектор x содержит0 или связанные / повторные значения, потому что:

В этой ситуацииВы должны адаптировать ответ Ронака Шаха , который позволяет исключить 0. Но помните, что which может датьВы несколько индексов, если есть повторяющиеся значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...