r - 找到可能完全为正的 R 向量中第一个负数的位置

标签 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

我想找到向量中第一个数字 <=0 的位置。最简单的方法是使用 which。

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

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

> 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))
     }

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

最佳答案

解决方案

你可以使用:

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

这将返回小于或等于零的第一个元素的位置,如果不适用,则返回 NA。然后,您可以捕获 NA 并做任何您想做的事情。

评论

min 返回错误的原因是它期望输入的长度大于零。

您搜索第一个负数的第一种方法在计算上非常昂贵,因为您可能必须遍历向量的每个元素。二项式搜索可能是一种更快的方法。

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

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

关于r - 找到可能完全为正的 R 向量中第一个负数的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32055004/

相关文章:

r - 构建 R 包——错误 : example requires a value

r - 在 Markdown PDF 中,如何在 for 循环的每次迭代后添加分页符?

r - 如何绘制 R 中的对数返回数据,在 x 轴上显示日期

r - 用 rChart 标记以上点

r - 使用 R 中的线迹创建堆叠条形图的辅助轴

r - 使用 dplyr 将列名作为参数传递给函数

r - 从 data.table 中获取排序的唯一值向量的最快方法是什么?

R 连接到汤森路透 Eikon

r - 在 R 中查找数据框中的所有唯一字符

r - 将 r 中的日 yield 转换为月 yield