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