根据截止值将区域划分为较小的区域

时间:2016-09-12 21:07:52

标签: r bioinformatics bioconductor iranges

这是我假设一个简单的编程问题,但我一直在努力。主要是因为我不知道使用的正确词语,或许?

给定一组“范围”(以1 - 一组数字的形式如下,2-IRanges或3-GenomicRanges),我想将它分成一组较小的范围。

示例开头:

Chr    Start     End
1        1        10000
2        1        5000

休息时间的大小:2000

新数据集:

Chr    Start    End
1        1       2000
1        2001    4000
1        4001    6000
1        6001    8000
1        8001    10000
2        1       2000
2        2001    4000
2        4001    5000

我在R中这样做。我知道我可以使用seq简单地生成这些,但我希望能够基于区域的列表/ df而不是必须手动执行每次我有一个新的地区列表。

以下是我使用seq做的一个例子:

鉴于22条染色体,通过它们并将每条染色体分成碎片

# initialize df
Regions <- data.frame(Chromosome = c(), Start = c(), End = c())
# for each row, do the following
for(i in 1:nrow(Chromosomes)){
     # create a sequence from the minimum start to the max end by some value
     breks <- seq(min(Chromosomes$Start[Chromosomes$Chromosome == i]), max(Chromosomes$End[Chromosomes$Chromosome == i]), by=2000000)

     # put this into a dataframe
     database <- data.frame(Chromosome = i, Start = breks, End = c(breks[2:length(breks)]-1, max(Chromosomes$End[Chromosomes$Chromosome == i])))

     # bind with what we already have
     Regions <- rbind(Regions, database)
     rm(database)
}

这样可以正常工作,我想知道是否已经有一些内置于包中的东西作为单线程OR更灵活,因为它有其局限性。

1 个答案:

答案 0 :(得分:3)

使用R / BioconductorGenomicRanges,这是您的初始范围

library(GenomicRanges)
rngs = GRanges(1:2, IRanges(1, c(10000, 5000)))

然后创建一个跨基因组的滑动窗口,首先生成一个列表(每个染色体一组瓦片),然后根据您的问题中的格式取消列表

> windows = slidingWindows(rngs, width=2000, step=2000)
> unlist(windows)
GRanges object with 8 ranges and 0 metadata columns:
      seqnames        ranges strand
         <Rle>     <IRanges>  <Rle>
  [1]        1 [   1,  2000]      *
  [2]        1 [2001,  4000]      *
  [3]        1 [4001,  6000]      *
  [4]        1 [6001,  8000]      *
  [5]        1 [8001, 10000]      *
  [6]        2 [   1,  2000]      *
  [7]        2 [2001,  4000]      *
  [8]        2 [4001,  5000]      *

  -------
  seqinfo: 2 sequences from an unspecified genome; no seqlengths

使用as(df, "GRanges")as(unlist(tiles), "data.frame")强制进出数据框。

?"slidingWindows,GenomicRanges-method"查找帮助(标签已完成,您的朋友是?"slidingW<tab>)。

令人尴尬的是,这似乎只在GenomicRanges的'devel' version中实现(v。1.25.93?); tile执行类似的操作,但在跨越GRanges的宽度时将范围的宽度舍入为大致相等。这是一个穷人的版本

windows <- function(gr, width, withMcols=FALSE) {
    starts <- Map(seq, start(rngs), end(rngs), by=width)
    ends <- Map(function(starts, len) c(tail(starts, -1) - 1L, len),
                starts, end(gr))
    seq <- rep(seqnames(gr), lengths(starts))
    strand <- rep(strand(gr), lengths(starts))
    result <- GRanges(seq, IRanges(unlist(starts), unlist(ends)), strand)
    seqinfo(result) <- seqinfo(gr)
    if (withMcols) {
        idx <- rep(seq_len(nrow(gr)), lengths(starts))
        mcols(result) = mcols(gr)[idx,,drop=FALSE]
    }
    result
}

作为

调用
> windows(rngs, 2000)

如果该方法有用,请考虑询问Bioconductor上的后续问题support site