我使用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
中有一种简单的方法吗?
答案 0 :(得分:1)
以下是使用dplyr
函数group_by
和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
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倍。