2

これは、やや単純なプログラミングの問題を想定していますが、苦労しています。主に、適切な言葉を知らないためでしょうか。

「範囲」のセット (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)
}

これは問題なく動作します。これには制限があるため、これをワンライナーまたはより柔軟にするためにパッケージに組み込まれているものがあるかどうか疑問に思っています。

4

1 に答える 1

3

R/ BioconductorパッケージのGenomicRangesを使用すると、最初の範囲は次のとおりです。

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

次に、ゲノム全体にスライディング ウィンドウを作成します。最初にリスト (染色体ごとに 1 セットのタイル) として生成され、次に質問にある形式のリストに記載されていません。

> 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")またはを使用して data.frame から / へ強制変換しas(unlist(tiles), "data.frame")ます。

でヘルプを見つけて?"slidingWindows,GenomicRanges-method"ください (タブ補完はあなたの友達です?"slidingW<tab>)。

恥ずかしいことに、これは GenomicRanges の「devel」バージョン(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サポート サイトでフォローアップの質問をすることを検討してください。

于 2016-09-13T00:57:41.963 に答える