2016-09-12 15 views
2

これはやや単純なプログラミング問題を想定していますが、私はそれに苦労しています。ほとんどの場合、私は使用する正しい言葉を知らないので、おそらく?領域をカットオフに基づいてより小さい領域に分割する

"範囲"(1-aの数字のセット、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に基づいてそれを実行できるようにしたいと思います。これは、構築されたものがある場合、私は思ったんだけど、うまく動作しますそれらを介して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) 
} 

に、それぞれを破る:ここ

は、私は、配列を使用して作った例ですこれは制限があるので、これを1ライナーまたはより柔軟なものとして既に実行しているパッケージに入れてください。ここでは、R/BioconductorパッケージGenomicRangesを使用して

+0

したがって、あなたの目標は、引数breaks = 2000と一緒に "Example Beginning"と表示し、 "New dataset"を出力するデータフレームを取り込む関数ですか?もしそうなら、私は同意する。あなたは 'seq'を非常に簡単に行うことができます - 単に変数の点でそれを行い、' function(){} 'でラップすると、独自のカスタム関数ができます。 – Gregor

+0

私は 'seq'のような解決策を考えていますが、なぜ私たちはこれをやっているのでしょうか? – zx8754

+0

おそらく 'ライブラリ(dplyr)のようなsthです。ライブラリ(tidyr);休憩< - 2000L; %>%mutate(End = if_else(Start + breaks> End、End、as.integer(Start)、終了(Start)、終了(End)、終了) + breaks-1))) 'となります。しかし、この問題に対するより洗練されたより良い解決策があります。 – lukeA

答えて

3

はあなたの最初の範囲

​​

があり、その後、ゲノム全体にスライディングウィンドウを作成し、リストとして最初の(染色体あたりのタイルの1つのセット)を生成し、その後、非上場フォーマットのためにあなたは、あなたの質問にas(df, "GRanges")as(unlist(tiles), "data.frame")とdata.frameへ/から

> 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 

強要を持っています。

?"slidingWindows,GenomicRanges-method"(タブ補完は、?"slidingW<tab>)でヘルプを検索してください。

厄介なことに、これはGenomicRangesの'devel' version(v。1.25.93?)にのみ実装されているようです。 tileは同様のことを行いますが、GRangesの幅にまたがってほぼ同じになるように範囲の幅を丸めます。ここでのアプローチが有用である場合は、Bioconductor support siteにフォローアップの質問を検討し

> windows(rngs, 2000) 

として呼び出さ貧しい人のバージョン

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 
} 

です。

+2

私はGrangesにいくつかの機能があることは知っていましたが、簡単にはGoogleのための機能ではないし、マニュアルで見つけることもできませんでした。この機能を説明するマニュアルへのリンクを追加してもよろしいですか?それはGenomicRanges/IRangesの一部です、ヘルプ '?? slidingWindows'で見つけることができませんか? – zx8754

+2

@ zx8754おっと、申し訳ありませんが、これはGenomicRangesのdevelバージョンでのみ利用可能です。私はその答えに臨時の解決法を提供しました。 –

関連する問題