2015-07-02 74 views
4

我有一個排序的向量x和另一個向量y(不一定是相同的長度)。對於y的每個條目,我想找到x的最大條目的索引小於或等於y的條目。找到一個向量中的最大元素小於另一個向量中的值R

例如,如果

x <- c(2,4,8,9,12) 
y <- c(5,10) 

我想返回的x指數的y每個條目:

  • 2(因爲4的x的最大條目小於5)和
  • 4.

我可以很容易地通過循環在y上,但我想知道是否有一種方法來對此進行矢量化。所以,我可以向量化:

for (k in 1:length(y)){ 
    max(which(x < y[k])) 
} 

回答

4

假設x進行排序,在findInterval功能將工作:

findInterval(y,x) 
# 2 4 
1

如果向量進行排序,您可以使用二進制搜索。檢查x的中間值,如果y小於該值,則轉到左側的中間值。反之亦然。繼續這樣做,你會得到小於或等於最大值。然後找到條目號。

+1

我覺得OP意味着,y的載體,你想找到X爲y各值對應的條目,所以通過Y,我的意思是值Y [i] ,其中i是與您當時正在處理的y號碼對應的索引。 – ksivakumar

+0

哦,我明白了,謝謝。我誤解了。 – Frank

2

使用矢量化:

x <- c(2,4,8,9,12) 
y <- c(5,10) 

largest_less_than<-function(x,y){ 
    which(x == max(x[x < y])) 
} 

largest_less_than <- Vectorize(largest_less_than, vectorize.args = 'y') 

largest_less_than(x = x, y = y) 
相關問題