2017-03-04 174 views
0

我有一個關於在向量中查找索引值的問題。查找與R中的值最接近的索引

比方說,我有一個向量如下:

vector <- c(1,2,4,6,8,10) 

而且,讓我們說我有值「5」。我想在「向量」中找到最大索引,使其小於或等於值5.在上例中,此索引將爲3(因爲4小於或等於5)。類似地,如果代替我有一個載體如:

vector <- c(1,2,4,5,6,8,10) 

然後如果我找到大於或等於5以下的值,該指數將現在是4代替3.

然而,我還想先找到最後這個指標發生的時間。例如,如果我有一個載體如:

vector <- c(1,1,2,2,4,5,5,5,5,6,8,10) 

然後第一次發生這種索引將是6和此指數發生最後一次將9.

是否有一個短,單線方法,這將允許我執行此任務?到目前爲止,我一直在使用函數max(which(....)),但是我發現這種方法對於大型數據集來說效率極低,因爲它會直接列出數百/數千個值,所以我想找到一個如果可能的話,更有效的方法可以放在一條線上。

在此先感謝。

+0

如果對'vector'進行排序,請參閱'?findInterval' - 用「left.open = TRUE」調用一次,用「left」調用一次。open = FALSE「應該給出兩個索引(加上一些」if「操作來區別'<'從'<=' –

回答

3

您可以使用下面的代碼:

min(max(which(vector <= 5)), min(which(vector == 5))) 

首先,它會搜索所有指數,其中vector小於或等於5 which功能,那麼它需要中最大的一個。

其次,它搜索vector等於5並且取最小值的所有索引。

第三,它需要第一這兩個指數的

+0

是否有另一種方法來做到這一點,使得」min「(或」max「)是在「which」函數裏面?我其實有一個非常類似的代碼 - 我遇到的問題是我有一個非常大的數據集,所以會發生什麼是「哪個」函數返回數以千計的值然後「max」函數取最大值,因爲我迭代了數百次,這導致我的程序運行速度很慢,所以我正在尋找一種更有效的方法來完成這項任務 – ThePlowKing

+0

對於'min'部分,你可以簡單地使用'which(vector == 5)[1]',但我不確定它會減少運行時間 – Pop

2

您可以使用:

my_ind <- function(vec, num){ 
    ind <- which.max(vec == num) # Check for equality first 
    if(ind == 1L && vec[1L] != num){ 
    ind <- which.min(vec < num) - 1L 
    } 
    ind 
} 

my_ind(c(1,2,4,6,8,10), 5L) # 3 
my_ind(c(1,2,4,5,6,8,10), 5L) # 4 
my_ind(c(1,1,2,2,4,5,5,5,5,6,8,10), 5L) # 6 
my_ind(c(5,8,10), 5L) # 1 
my_ind(c(6,8,10), 5L) # 0 - returns 0 if all(vec > 5L) 
2

感謝所有那些誰回答,我居然發現了一個極短的,單行法做到這一點通過下載一個包BBmisc。它具有稱爲which.lastwhich.first的功能,並且它們執行我需要的操作。再次感謝您花時間回覆,我很感激。

+0

請參閱這裏瞭解該函數的__c__源代碼 - https://github.com/berndbischl /BBmisc/blob/95a625fe0bd92413910f8c4f8f9c79c801a96af9/src/which_first.c#L14 – Rentrop

0

我沒有看到這裏需要包。它看起來像構造which(x == max(x[x <= 5]))會爲你工作。

x <- c(1, 2, 4, 6, 8, 10) 
which(x == max(x[x <= 5])) 
# [1] 3 

x <- c(1, 2, 4, 5, 6, 8, 10) 
which(x == max(x[x <= 5])) 
# [1] 4 

x <- c(1, 1, 2, 2, 4, 5, 5, 5, 5, 6, 8, 10) 
which(x == max(x[x <= 5])) 
# [1] 6 7 8 9 

要找到倍數指數的最小/最大指數,請使用head/tail

​​
+0

假設I'v e理解了這個問題 –

相關問題