基因组覆盖作为滑动窗口

时间:2018-02-10 13:29:55

标签: r bioinformatics rollapply

我使用bwa mem算法将我的读取映射到我的程序集,并使用samtools depth提取每个碱基的读取次数(= coverage)。生成的文件如下:

1091900001  1   236
1091900001  2   245
1091900001  3   265
1091900001  4   283
1091900001  5   288
1091900002  1   297
1091900002  2   312
1091900002  3   327
1091900002  4   338
1091900002  5   348

有三列:重叠群的名称(因为它是一个多重重叠群文件,这个ID改变了) - 位置(基础) - 映射的读数(覆盖率)。

现在我想计算滑动窗口的覆盖范围(第三列);在窗口大小为3,滑动为2的平均值 - 每个重叠群(第一列)。

我想使用rollapply包的zoo功能。

require(zoo)
cov <- read.table("file",header=FALSE, sep="\t", na.strings="NA", dec=".", strip.white=TRUE)
library(reshape) #loads the library to rename the column names
cov<-rename(cov,c(V1="Chr", V2="locus", V3="depth")) #renames the header
rollapply(cov$depth, width = 3, by = 2, FUN = mean, align = "left")

但这当然没有考虑到重叠群。另外,我的预期输出应该包括contig-info&amp;窗口,计算得出:

1091900001  1   3   248.6667
1091900001  3   5   278.6667
1091900002  1   3   312.0000
1091900002  3   5   337.6667

R中有一种简单的方法吗?

1 个答案:

答案 0 :(得分:1)

以下是使用dplyr函数group_bydo执行此操作的方法:

library(dplyr)

cov %>% 
  group_by(Chr) %>% 
  do(
    data.frame(
      window.start = rollapply(.$locus, width=3, by=2, FUN=min, align="left"),
      window.end = rollapply(.$locus, width=3, by=2, FUN=max, align="left"),
      coverage = rollapply(.$depth, width=3, by=2, FUN=mean, align="left")
      )
    )

# # A tibble: 4 x 4
# # Groups:   Chr [2]
#          Chr window.start window.end coverage
#        <int>        <int>      <int>    <dbl>
# 1 1091900001            1          3 248.6667
# 2 1091900001            3          5 278.6667
# 3 1091900002            1          3 312.0000
# 4 1091900002            3          5 337.6667

do允许您以data.frame的形式从分组操作中返回任意数量的值。在这种情况下,我们会返回覆盖值的滚动平均值,以及每个窗口中min的{​​{1}}和max值。

修改

如果您的数据集很大,最好使用data.table执行计算。如果您以前没有看过它的语法有点难以理解,但它可以在较大数据的分组操作中提供显着的速度提升。以下是您的操作如何与locus

一起使用
data.table

根据您提供的示例行,以下是library(data.table) setDT(cov) cov[, .( window.start = rollapply(locus, width=3, by=2, FUN=min, align="left"), window.end = rollapply(locus, width=3, by=2, FUN=max, align="left"), coverage = rollapply(depth, width=3, by=2, FUN=mean, align="left") ), .(Chr)] dplyr方法的基准测试结果(以毫秒为单位):

data.table

因此,在示例数据上,# dplyr: min lq mean median uq max neval 7.811753 8.685976 10.10268 9.243551 10.42691 144.5274 1000 # data.table: min lq mean median uq max neval 1.924472 2.105459 2.510832 2.30479 2.685706 8.848451 1000 选项的平均速度提高了约4倍。