2016-05-31 1 views
1

私は、数百の数字の最大長のリストから短い数字系列を特定する汎用アルゴリズムを探しています。これは、質量分析(ms1)データから一連の質量を同定するために使用されます。例えば数値シリーズを識別する一般的なアルゴリズムはありますか?

、次のリストを与え、私はこれらの数字の3は、一連N + 1、N +2に適合することを特定したいと思いますが、等

426.24 <= N 
427.24 <= N + 1/x 
371.10 
428.24 <= N + 2/x 
851.47 
451.16 

一連のフォーマットの全てです。 N、N + 1/x、N + 2/x、N + 3/x、N + 4/xなどであり、xは整数である(この例ではx = 1)。私はこの制約が問題を非常に扱いやすくすると思う。 Rでこれに取り組むためのすばやく/効率的な方法の提案はありますか?

+1

私はこれがRの質問ではないと思います。あなたがアルゴリズムを持っていて、Rで効率的に実装する方法を知りたければ、それは理にかなっています。とにかくNを知っていますか?すべての値からNを引くことができます。また、要件が何であるかは明確ではありませんか? –

+0

Nは系列の最初の数として経験的に決定することができる。すべての値からNを差し引いて重複した値を探すのは、実際にはかなり良い解決策です。 –

+0

この例では、 'diff(sort(x))'を見れば、それは明らかです。しかし、他の値がシリーズ値と重なっているとうまくいきません。 – Gregor

答えて

2

このルーチンは、1から10までのxを使用して系列を生成します(それを増やすことができます)。元の番号リストに含まれているものの数を確認します。

N = c(426.24,427.24,371.1,428.24,851.24,451.16) 
N0 = N[1] 
x = list(1,2,3,4,5,6,7,8,9,10) 
L = 20 

Series = lapply(x, function(x){seq(from = N0, by = 1/x,length.out = L)}) 
countCoincidences = lapply(Series, function(x){sum(x %in% N)}) 

結果:あなたが見ることができるように

unlist(countCoincidences) 
[1] 3 3 3 3 3 3 3 3 3 2 

、X = 1が3つの偶然を持つことになります使用。 x = 9になるまで、すべてのxについて同じことが起こります。ここでは、あなたが望むものがどれかを決める必要があります。

+0

私はこの方針がより簡単で、+/-実験誤差を容易に確認できるので、この方法を採用しました。 –

2

算術シーケンスを探しているので、差異kは一定です。したがって、ベクトルをループして、シーケンスから各値を減算することができます。シーケンスがある場合、ベクトルから2番目の項を減算すると、-k,0、およびkの値が得られます。したがって、ベクトル値とそれとは反対の値-1の一致を探してシーケンスを見つけることができます。ベクトル:

x <- c(426.24, 427.24, 371.1, 428.24, 851.47, 451.16) 

unique(lapply(x, function(y){ 
    s <- (x - y) %in% (y - x); 
    if(sum(s) > 1){x[s]} 
})) 

# [[1]] 
# NULL 
# 
# [[2]] 
# [1] 426.24 427.24 428.24 
+0

このアプローチは本当にいいです。しかし、実験誤差(〜10ppmまで)を説明するためにいくつかの調整を行う必要があります。この根本的に単純化されたアプローチでは、私はそれに本当に対処できません。私はそれを修正する方法について考える必要があります。 –

+0

最も簡単な方法は、おそらく 'round'を使用することです。それが十分正確であれば、 'round(x-y、1)%round(y-x、1)'の 'round(x-y、1)% – alistaire

関連する問題