2017-09-19 9 views
0

나는 BLAST의 HSP의 dataframe (안 표시된 모든 열)이 있습니다축소 BLAST의 dataframe는

 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 

I 깔끔한 한 라이너 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.table (data.table vs dplyr)를 사용하고 싶습니다.

+1

속도가 일반적으로 사실이라는 데 동의하지만 OP에서 양쪽 모두의 속도를 확인하고이 경우의 차이가 오히려 편안함/친숙성/속도를 기준으로 선택할 수있을만큼 충분히 작은 지 확인하십시오. (dplyr 대 data.table을 차별화하기 위해 "수십만"은 "큰"것이 아닐 수도있다.) –

+1

와우, data.table은 정말 빨라 보인다! 더 큰 데이터 세트로 순간에 벤치마킹을하면 설치가 실패한 이후로 dplyr 솔루션을 테스트 할 수 없습니다. – user1981275

+0

@ user1981275'data.table'에서'setkey'로 답을 업데이트했습니다. – PoGibas