我有一个向量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 :(得分:4)
如果您是经典案例,那么
您可以简单地执行以下操作:
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或并列/重复值,事情就会变得棘手,因为:
findInterval
在存在0时将精确定位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)