2016-05-19 7 views
0

私はそれに約50,000の数字を持つベクトルを持っています。私は、ベクトル内の他の数が< =指定されたthresoldである各値を計算したいと思います。そして、最大値を返します。 R各値のカウント私のベクトルの他の数が指定されたthresoldの下にある

は今、私は
n <- 50000 
s <- 100000 
win <- 1000 # my thresold 
pos <- sample(s,n,replace=T) 
m <- max(sapply(pos,function(x){sum(abs(pos-x)<=win)})) 

をやっているしかし、それは非常に非常に遅いです...そして、私は何をする必要があるというN = 1,000,000回(シミュレーション)。このことをスピードアップする考えはありますか?

は、ここで私が何をしたいの例です:

だが、私は、ベクターの多くの数が勝利= 20の最小距離であるかを計算することができ、POSでの各値について

pos <-c(2,6,20,23,24,56,64,75,95,100) 

を言ってみましょう。 だから:

2 : 2,6,20 
6 : 2,6,20,23,24 
20: 2,6,20,23,24 
23: 6,20,23,24 
24: 6,20,23,24 
56: 56,64,75 
64: 56,64,75 
75: 56,64,75,95 
95: 75,95,100 
100: 95,00 

そして、私はこれらのサブセット= 5(グループ6および20)の最大長

おかげ

+0

申し訳ありませんがコードに間違いがありました(良い位置にない括弧)。今すぐ動作します –

+2

@mtoto + 20間隔内の 'pos'ベクトルの各数値ごとに、その周りのすべての値(小と大の両方)が必要です。次に、どの値がその周りに最大のグループを持っているかを確認します。 –

+2

おそらく 'findInterval(pos + win、pos) - findInterval(pos-win、pos)'ですか?極限でいくつかの問題がありましたが、 'pos-win'と' pos + win'の間にいくつの数値があるのでしょうか(posはソートされなければならないことに注意してください)。 – nicola

答えて

2

はこれを試してみてくださいしたい:

#you need to sort the vector before 
#(take a copy if you don't want to lose the original) 
pos<-sort(pos) 
findInterval(pos+win,pos) - findInterval(pos-win,pos*(1+.Machine$double.eps)) 

最後の行がすべきposの各要素について、pos-winpos+winの間の要素の数を指定します。因子1+.Machine$double.epsは、エッジケース(@DavidArenburgへのtx)を処理するために必要です。

関連する問題