0
私はBLAST HSPのデータフレーム(ない表示されているすべての列)があります。崩壊BLASTのデータフレームは
query.id subject.id alignment.length
196 1032519524 1032519523 212
197 1032519524 1032519523 182
198 1032519524 1032519522 212
199 1032519524 1032519522 182
200 1032519524 1032518642 212
を、私は、クエリのユニークペアで終わるようにデータを崩壊したいです.idとsubject.id。同じquery.idとsubject.id持つ複数の行がある場合は、alignment.lengthの値を追加する必要があります。
query.id subject.id alignment.length
1 1032519524 1032518642 212
2 1032519524 1032519522 394
3 1032519524 1032519523 394
私はplyr
を使用してきちんとしたワンライナーでこれを行う:
ddply(blast.results, c("query.id", "subject.id"), function(x)colSums(x['alignment.length']))
残念ながら、これは数十万のBLAST結果を処理する際には不可能になります。より高速でスケーラブルなアプローチがありますか? @PoGibas data.tableソリューションの
マイクロベンチマーク:
Unit: milliseconds
expr
setDT(blast.results)[, .(alignment.length = sum(alignment.length)), .(query.id, subject.id)]
setkey(setDT(blast.results), query.id, subject.id)[, .(alignment.length = sum(alignment.length)), .(query.id, subject.id)]
100
min lq mean median uq max neval cld
11.514016 18.010048 31.61341262 22.0045935 32.104018 222.943783 100 b
15.308905 22.620595 36.32531007 28.2132725 43.527390 156.109477 100 b
0.000012 0.000185 0.00033057 0.0003635 0.000443 0.000772 100 a
スピードは一般的には合っていると私は同意しますが、OPの両方でスピードをチェックし、この場合の差が快適性/精通度/スピードに基づいて選択できるかどうかを確認してください(dplyrとdata.tableを区別するために "数十万"は "大きくない"かもしれない) –
ああ、data.tableは本当に速く見える!現在大規模なデータセットでそれをベンチマークしていますが、インストールが失敗した時点でdplyrソリューションをテストすることはできません。 – user1981275
@ user1981275 'data.table'で' setkey'で答えを更新しました。 – PoGibas