メモ程度のものです.基礎的だけど、よく忘れるので。
課題
Blastでは、同一queryに対して複数hitするのが通常。その中から、E-valueが最小のhitをそれぞれのqueryに対して取り出したいという時がある。
解決法
queryでgroup_by()してから、filter()で取り出す。filterの条件をmin()で指定すればOK
-outfmt 6で出力したblast結果ファイルを前提とすると、以下でできる。
tophit.R
library(tidyverse)
# ファイル読み込み
blast_out<-
read_tsv("blast.out.fmt6.txt", col_names = c(
"qseqid",
"sseqid",
"pident",
"length",
"mismatch",
"gapopen",
"qstart",
"qend",
"sstart",
"send",
"evalue",
"bitscore"
))
blast_out_tophit<-
blast_out %>%
group_by(qseqid) %>% #クエリでグルーピングする
filter(evalue==min(evalue))%>% #evalueが最小のものと同じ行を取り出す(evalueが最小の行を取り出す)
filter(bitscore==max(bitscore)) %>% #bitscoreが最大のものと同じ行を取り出す(bitscoreが最大の行を取り出す)
filter(pident>80)
こんな感じ