2

これは、「stringdist」パッケージに詳しい方への質問です。

次のことを行う関数を作成しようとしています。

次のような文字の非常に長いリストを検索します (約 100 万個のうちの 16 個のみが表示されます)。

> stripList
[1] "AAAAAAAAAAAAAAAAAAAAAAAAAAAADAABAAADCDDAD" "BAAAABBBDACDBABAAADDCBDADBCCBDCDDCDBCDDBA"
[3] "BDDABDCCAAABABBAACADCBDADBCCBDCDDCDBCDDBA" "AADBBACDDDBABDCABAADBCADCBDDDCCC"         
[5] "BBCDBBDCCBABDBCABDBBDBDDDADCDDADDDCDDCDDD" "BDDCDACABDCCBACBADCDCBDADBCCBDCDDCDDCDDBA"
[7] "BCDBADCBBDDBBBBDCBDADBCCBDCDDCDBCDDDDAAAA" "DABDDCDACABDCCBACBADC"                    
[9] "CABABDDCCCCACDCCDCCDADCAAAAAAAAACADADDADA" "BAABCBBBDBCDCDDADDDDCDDADBCCBDCDD"        
[11] "BBDDDACDCABDDDBBACDCBDADBCCDDCDDCDDCDDBDD" "BDDABDCCAAABABBBACADCBDADBCCBDCDDCDBCDDBA"
[13] "BDDBBBBDDBDABBACDBDCBDADBCCBDCDD"          "BDDABDCCAAABABBBACADCBDADBCCBDCDDCDBCDDBA"
[15] "DABDDCDACABDCCBACBADC"                     "BBADBACDDBABAACABCABCDCBDADBCCBDCDDCDDDDD"

このように構造化されたクエリ シーケンス リストの各シーケンスのインスタンス。

元:

SeqName1              # queryNames
BBCDBBDCCBABDBCA      # querySeqs

SeqName2              # queryNames
BBBDCCDCCCCDDDCAAACD  # querySeqs

クエリ シーケンスが「stripList」のいずれかに表示される回数 (存在する場合) を確認し、1 回の挿入、1 回の削除、1 回の置換、および 1 回の転置を許可し、次のような出力を得たいと考えています。

>dt
 queryNames    TimesFound
 SeqName1           5
 seqName2          145

そのために、「stringdist」パッケージの「amatch」関数を次のように使用しています。

dt<-rapply(as.list(querySeqs), function(x) amatch(x, stripList, method = "osa", useBytes = TRUE, weight = c(d = 0.5, i = 0.5, s = 0.9, t = 0.9), maxDist=0.9))
dt<-data.frame(dt)
colnames(dt) <- "TimesFound"
dt<-cbind(queryNames,dt)

いくつかの質問を聞きたいんです:

  1. 'amatch' 関数で、method = "osa" を使用する場合、"weight" 引数はどのように解釈されますか? 例として、私が使用する場合:

    method = "osa", weight = c(d = 0.5, i = 0.5, s = 0.9, t = 0.9), maxDist=0.9
    

    「querySeqs」の 90% の一致が必要だと言っているのですか? つまり、これらの分数は「querySeqs」または私のテーブル (stripList) に関連していますか?

  2. 「maxDist」にはどのような機能がありますか? (パーセントとしても解釈されますか?)

  3. 上記のコードの実行時効率を最大化する方法はありますか (おそらく data.table などを使用して)? 私の実際のデータセットは、約 1,000,000 のシーケンス リストから検索される約 2,000 のシーケンス クエリであるため、質問するだけです。

  4. シーケンス全体を検索する「amatch」よりも良い方法はありますか (「agrep」のように部分文字列だけでなく)?

これらが基本的な質問である場合はお詫び申し上げます。これに関するドキュメントは私には曖昧であり、率直に言って、私はまだ学んでいます。

前もって感謝します。

4

1 に答える 1

6

この質問はしばらくの間ここにあるようですが、私はそれを見つけたばかりです. 要するに:

(1) 重みは、各アクションのペナルティです。たとえば、削除または挿入は問題ありませんが、転置はもっと罰せられるべきだと言うことができます。あなたの質問から判断すると、おそらく重みをそのままにしておくことができます。

(2) Maxdist は amatch に、2 つの文字列が maxDist を超えて離れている場合、それらが一致するとは見なされないことを伝えます。デフォルトはゼロであるため、完全一致のみが許可されます。パーセンテージではありません。maxDist の関連値は、使用される距離関数によって異なります。method='osa', maxDist=1 (単一の転置、挿入、削除、または置換を許可しますが、組み合わせは許可しません) または、最大 4 つの編集の組み合わせを許可する場合は maxDist=4 を使用できると思います. 編集のような距離の場合、距離は最大文字列の文字数によって制限されます。サポートされているすべての距離の範囲については、R ジャーナルの論文を参照してください。http://journal.r-project.org/archive/2014-1/loo.pdf

(3) コードを常に最適化しています。バージョン 0.9 ではマルチスレッドが使用されます。rapply を使用しているようですが、おそらく使用するだけでこれを回避できます

amatch(querySeqs,stripList,method='osa',maxDist=4)

(4) 現時点では、amatch が R の最適な実装だと思います (ただし、私は作成者なので、偏見があるかもしれません :))。

于 2014-10-07T15:21:00.953 に答える