gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:55:30 30 4
gpt4 key购买 nike

假设我有一个从正态分布中提取的向量。

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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com