2017-09-19 7 views
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 

答えて

1

用いて溶液dplyr@hadleyによる):

library(dplyr) 
blast.results %>% 
    group_by(query.id, subject.id) %>% 
    summarise(alignment.length = sum(alignment.length)) 

ソリューションdata.table@Matt Dowleによって)使用:

library(data.table) 
setkey(setDT(blast.results), query.id, subject.id)[, .(alignment.length = sum(alignment.length)), .(query.id, subject.id)] 

あなたはそのスピードを述べたように、あなたはおそらくdata.tabledata.table vs dplyr)を使用することが重要です。

+1

スピードは一般的には合っていると私は同意しますが、OPの両方でスピードをチェックし、この場合の差が快適性/精通度/スピードに基づいて選択できるかどうかを確認してください(dplyrとdata.tableを区別するために "数十万"は "大きくない"かもしれない) –

+1

ああ、data.tableは本当に速く見える!現在大規模なデータセットでそれをベンチマークしていますが、インストールが失敗した時点でdplyrソリューションをテストすることはできません。 – user1981275

+0

@ user1981275 'data.table'で' setkey'で答えを更新しました。 – PoGibas

関連する問題