R 基因组覆盖率作为滑动窗口

R 基因组覆盖率作为滑动窗口,r,bioinformatics,rollapply,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

我使用
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
共有三列:contig的名称(因为它是一个多contig文件,所以该ID会更改)-位置(基本)-映射的读取数(覆盖率)

现在我想计算滑动窗口中的覆盖率(第三列);窗口大小为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")

R
中是否有一种简单的方法可以做到这一点?

以下是如何使用
dplyr
函数
groupby
do
实现这一点:

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
根据您提供的样本行,以下是
dplyr
数据的基准测试结果。表
方法(以毫秒为单位):


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

什么是
%>%
意思?我以前从未见过它,它被称为管道操作符——参见简介。当链接函数时,它通过允许您编写
df%>%func1%>%func2
而不是
func2(func1(df))
来提高可读性。工作非常完美,但由于我的文件包含约430万行,消息
| | 0%~11小时后弹出up@rororo请看我编辑过的答案——我添加了一种可以提高速度的替代方法。是的,这确实大大加快了速度。我刚刚意识到,如果
Chr
小于窗口大小,则该函数不起作用。此外,它不会计算“最后一个”窗口,因此如果它小于窗口,则会计算剩余的一小部分。即,如果
Chr
长度为5235且窗口大小应为5000,则不采用235的最后一个“窗口”
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
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:
      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