获取两个值的索引,这些值在R中用零括起来

时间:2018-09-21 04:47:27

标签: r

我有一个向量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 :(得分:4)

好的情况

如果您是经典案例,那么

  1. 您的向量按升序排序,
  2. 它不包含0,
  3. 它没有绑定值,

您可以简单地执行以下操作:

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

如果条件1不成立,但条件2和3仍然成立,则可以

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

akrun's answer基本相同。

糟糕的情况

一旦向量x包含0或并列/重复值,事情就会变得棘手,因为:

在这种情况下,您必须调整Ronak Shah's answer才能排除0。但是请注意,如果存在重复的值,which可能会给您多个索引。

答案 1 :(得分:4)

另一种方式可能是:

#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

答案 2 :(得分:3)

我们可以尝试

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

如果未排序,则

x1 <- sort(x)
match(x1[rle(sign(x1))$lengths[1] + 0:1], x)