我有一个向量 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)

但这似乎很笨拙。有小费吗?

最佳答案

好场景

如果你在经典案例中,哪里

  • 你的向量按升序排序,
  • 不包含 0,
  • 它没有绑定(bind)值,

  • 您可以简单地执行以下操作:
    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 或绑定(bind)/重复值,事情就会变得棘手,因为:
  • 重复值挑战基于排序的方法,因为像“快速排序”这样的排序方法不稳定(如果您不知道什么是稳定排序,请参阅 What is stability in sorting algorithms and why is it important?);
  • findInterval 将在 0 存在时精确定位 0。

  • 在这种情况下,您必须调整 Ronak Shah's answer,它允许您排除 0。但请注意,如果存在重复值,which 可能会为您提供多个索引。

    关于r - 获取 R 中括号为零的两个值的索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52436759/

    10-10 12:30