在R矢量中找到第一个负数的位置,该矢量可能完全为正

时间:2015-08-17 16:10:23

标签: r

假设我有一个正态分布的矢量。

RandomVector<-rnorm(10,mean=1,sd=1)
> RandomVector
[1]  1.18186018  0.53810223  0.33888370  0.46593762  2.33963330 -0.08779368     -0.65178144 -0.61384231 -0.74351425
[10] -0.51577616

我想在向量中找到第一个数字&lt; = 0的位置。最简单的方法是使用哪个。

FirstNegative<-min(which(RandomVector<=0))

但是,在某些情况下,向量可能没有负数,在这种情况下,()将返回长度为零的向量。

> RandomVector
 [1] 1.20150245 0.58668248 1.65633049 1.63277953 0.51134272 0.76385987 0.89085391 0.06504819 0.18011920 0.02400666

这会给你一个错误。

> FirstNegative<-min(which(RandomVector<0))
Warning message:
In min(which(RandomVector < 0)) :
  no non-missing arguments to min; returning Inf

以下是我提出的这个问题的解决方案。所有这些都有效,但我想尽可能避免使用if / else语句。有人能想到更简洁的方式吗?

for (j in 1:length(RandomVector)) {
        if (RandomVector[j]<=0) {
            FirstNegative<-j
            break;
            }

...替代地

WhichNegative<-which(RandomVector<=0)
if (length(WhichNegative)>0) {
    FirstNegative<-min(WhichNegative)
    }

基本相同的想法,但仍使用if语句

 if (any(RandomVector<=0)==TRUE) {
     FirstNegative<-min(which(RandomVector<=0))
     }

我问的原因是因为这个检查将针对大量长度的矢量。另外,我只是好奇。

1 个答案:

答案 0 :(得分:6)

<强>解决方案

您可以使用:

FirstNegative <- which(RandomVector <= 0)[1]

将返回小于或等于零的第一个元素的位置,或者如果不适用则返回NA。然后你可以抓住NA并做任何你想做的事。

<强>注释

min返回错误的原因是因为它需要长度大于零的输入。

您搜索第一个底片的第一种方法计算成本非常高,因为您可能需要遍历向量的每个元素。二项搜索可能是一种更快捷的方法。

第二种和第三种方法都很好,第二种方法比第三种更快,因为在第三种方法中你将经过两次矢量,一次找到任何小于或等于零的元素,然后找到第一种。

最终,解决方案中给出的方法将是最快的,因为which返回排序列表,因此min没有做任何有用的事情,因为最小值始终是第一个元素