これはやや単純なプログラミング問題を想定していますが、私はそれに苦労しています。ほとんどの場合、私は使用する正しい言葉を知らないので、おそらく?領域をカットオフに基づいてより小さい領域に分割する
"範囲"(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を使用して
したがって、あなたの目標は、引数breaks = 2000と一緒に "Example Beginning"と表示し、 "New dataset"を出力するデータフレームを取り込む関数ですか?もしそうなら、私は同意する。あなたは 'seq'を非常に簡単に行うことができます - 単に変数の点でそれを行い、' function(){} 'でラップすると、独自のカスタム関数ができます。 – Gregor
私は 'seq'のような解決策を考えていますが、なぜ私たちはこれをやっているのでしょうか? – zx8754
おそらく 'ライブラリ(dplyr)のようなsthです。ライブラリ(tidyr);休憩< - 2000L; %>%mutate(End = if_else(Start + breaks> End、End、as.integer(Start)、終了(Start)、終了(End)、終了) + breaks-1))) 'となります。しかし、この問題に対するより洗練されたより良い解決策があります。 – lukeA