我正在尝试在 R 中开发一个函数来输出给定间隔列表中的随机位置。
我的间隔文件(14,600 行)是一个制表符分隔bed
文件 ( chromosome start end name
),如下所示:
1 4953 16204 1
1 16284 16612 1
1 16805 17086 1
1 18561 18757 1
1 18758 19040 1
1 19120 19445 1
目前我的函数将N
在这些间隔内生成随机位置。
sim_dat <- bpSim(N=10)
head(sim_dat)
seqnames start end width strand
1 1 22686939 22686939 1 *
2 1 14467770 14467770 1 *
3 2 10955472 10955472 1 *
4 X 823201 823201 1 *
5 6 10421738 10421738 1 *
6 17 21827745 21827745 1 *
library(GenomicRanges)
library(rtracklayer)
bpSim <- function(intervals="intervals.bed", N=100, write=F) {
intFile <- import.bed(intervals)
space <- sum(width(intFile))
positions <- sample(c(1:space), N)
cat("Simulating", N, "breakpoints", sep = " ", "\n")
new_b <- GRanges(
seqnames = as.character(rep(seqnames(intFile), width(intFile))),
ranges = IRanges(start = unlist(mapply(seq, from = start(intFile), to = end(intFile))), width = 1)
)
bedOut <- new_b[positions]
if (write) {
export.bed(new_b[positions], "simulatedBPs.bed")
}
remove(new_b)
return(data.frame(bedOut))
}
这行得通,但是由于我对GenomicRanges包不是特别熟悉,因此我宁愿将其破解。我更希望能够使用R
来自 的基础或包重新编写它tidyverse
,以便我可以将其调整为,例如,允许用户指定染色体。
这也需要很长时间 - 即使是N=10
:
system.time(sim_dat <- bpSim(N=10))
Simulating 10 breakpoints
user system elapsed
10.689 3.267 13.970
最终,我试图模拟基因组中的随机位置,因此需要为每个N
.
我将不胜感激任何关于我如何可以的建议:
- 减少运行时间
- 消除对
GenomicRanges
此外 - 如果有人知道任何已经这样做的包,我宁愿使用现有的包而不是重新发明轮子。