按两列中的值折叠 BLAST 数据框
Collapse BLAST dataframe by values in two columns
我有一个 BLAST HSP 数据框(未显示所有列):
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
并想折叠数据,所以我最终得到 唯一 对 query.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
library(dplyr)
blast.results %>%
group_by(query.id, subject.id) %>%
summarise(alignment.length = sum(alignment.length))
解决方案使用data.table
(by @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
).
我有一个 BLAST HSP 数据框(未显示所有列):
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
并想折叠数据,所以我最终得到 唯一 对 query.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
library(dplyr)
blast.results %>%
group_by(query.id, subject.id) %>%
summarise(alignment.length = sum(alignment.length))
解决方案使用data.table
(by @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
).