簡體   English   中英

找到可能完全為正的 R 向量中第一個負數的位置

[英]Find the position of first negative number in a R vector that may be entirely positive

假設我有一個從正態分布中提取的向量。

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返回錯誤的原因是它期望輸入的長度大於零。

您搜索第一個否定的第一種方法在計算上非常昂貴,因為您可能必須遍歷向量的每個元素。 二項式搜索可能是一種更快的方法。

第二種和第三種方法很好,第二種方法比第三種方法快,因為在第三種方法中,您將遍歷向量兩次,一次找到小於或等於 0 的任何元素,然后找到第一個。

最終,解決方案中給出的方法將是最快的,因為which返回一個排序列表,因此min沒有做任何有用的事情,因為最小值始終是第一個元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM