基因组覆盖率滑动 window

Genome coverage as sliding window

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

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

三列:contig 的名称(因为它是一个 multi-contig 文件,此 ID 会更改)- 位置(碱基)- 映射的读取数(覆盖率)。

现在我想计算滑动中的覆盖率(第三列)windows; window 大小为 3,幻灯片为 2 作为平均值 - 每个重叠群(第一列)。

我想使用 zoo 包的 rollapply 功能。

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 和 window,它是计算出来的:

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

R 中有没有简单的方法来做到这一点?

以下是使用 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 的形式从分组操作中 return 任意数量的值。在这种情况下,我们 return 覆盖值的滚动平均值,以及每个 window 中 locusminmax 值。

编辑:

如果您的数据集很大,您最好使用 data.table 执行计算。如果你以前没有见过它,它的语法有点难以理解,但它可以在更大数据的分组操作中提供显着的速度改进。以下是您的操作如何使用 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)]

根据您提供的样本行,以下是 dplyrdata.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

所以在样本数据上,data.table 选项平均快 4 倍。