[英]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.