假设我有一个从正态分布中提取的向量。
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/