1

R に data.frame オブジェクトとしていくつかのベッド ファイルがあります。ここで、要素ごとにリーン 2 ベッド ファイル間のオーバーラップを見つけたいと考えています。

私の質問を明確にするために、最初のベッドファイル(すでにデータフレームオブジェクトにある)で行ごとにテストを行う必要があるため、データフレームの1行のみをクエリとして取得し、それを間隔ツリーが保持する間隔ツリーに渡します2 番目のベッド ファイル (ただし、最初に GRanges オブジェクトを強制する必要があります)。

私のデータは次のようになります:

   idx  chrom     start    End    name        score  p-value
    1   chr1      32727    32817  MACS_peak_1  8.69 1.150748e-11
    2   chr1      52489    52552  MACS_peak_2  4.26 2.347418e-11
    3   chr1      65527    65590  MACS_peak_3  4.19 2.386635e-11
    4   chr1      65773    65904  MACS_peak_4  2.02 4.950495e-11
    5   chr1      66001    66117  MACS_peak_5  5.66 1.766784e-11
    6   chr1     115700   115769  MACS_peak_6 10.30 9.708738e-12
    7   chr1     136389   136452  MACS_peak_7  4.26 2.347418e-11
    8   chr1     235352   235415  MACS_peak_8  4.26 2.347418e-11
    9   chr1     235636   235700  MACS_peak_9  5.66 1.766784e-11
    10  chr1     432895   432958 MACS_peak_10  4.26 2.347418e-11


f1 <- function(bed.1, bed.2){
  query<- GRanges()
  subject = bed.2
  for(i in 1: length(bed.1)){
    query<-bed.1[i]
    o <- GenomicRanges::findOverlaps(query, subject, minoverlap = 2L, algorithm="intervaltree")
    hitfrom_<-query[queryHits(o)]
    hitTo_<-subject[subjectHits(o)]
    pint <-pintersect(hitfrom_, hitTo_)
    return(pint)
  }
}

これは私のコードで、bed.1 で一連の GRanges オブジェクトを反復処理し、findOverlap() 関数を呼び出して、オーバーラップしている GRanges の場所を見つける方法です。このコードでは、私が望む結果が得られません。誰か私を助けて?? ありがとうございました

4

5 に答える 5

3

行ごとに操作する必要はないと思います。

text1 <- "idx  chrom     start    End    name        score  p-value
1   chr1      32727    32817  MACS_peak_1  8.69 1.150748e-11
2   chr1      52489    52552  MACS_peak_2  4.26 2.347418e-11
3   chr1      65527    65590  MACS_peak_3  4.19 2.386635e-11
4   chr1      65773    65904  MACS_peak_4  2.02 4.950495e-11
5   chr1      66001    66117  MACS_peak_5  5.66 1.766784e-11
6   chr1     115700   115769  MACS_peak_6 10.30 9.708738e-12
7   chr1     136389   136452  MACS_peak_7  4.26 2.347418e-11
8   chr1     235352   235415  MACS_peak_8  4.26 2.347418e-11
9   chr1     235636   235700  MACS_peak_9  5.66 1.766784e-11
10  chr1     432895   432958 MACS_peak_10  4.26 2.347418e-11"

bed1 <- read.table(text=text1, head=T, as.is=T)

library(GenomicRanges)

bed1.gr <- GRanges(bed1$chrom, IRanges(bed1$start, bed1$End))
bed2 <- data.frame(chr=c("chr1", "chr1"),
                   start=c(30000, 130000),
                   end=c(60000, 200000), stringsAsFactors = FALSE)
bed2.gr <- GRanges(bed2$chr, IRanges(bed2$start, bed2$end))
op <- findOverlaps(bed1.gr, bed2.gr)

op.df <- data.frame(que=queryHits(op), sub=subjectHits(op),
                    stringsAsFactors = FALSE)

bed1$que <- 1:nrow(bed1)
bed2$sub <- 1:nrow(bed2)

bed.n <- merge(bed1, op.df, by="que", all=T)
bed.n <- merge(bed.n, bed2, by="sub", all=T)
bed.n$que <- NULL
bed.n$sub <- NULL
bed.n
#    idx chrom start.x    End         name score      p.value  chr start.y   end
# 1    1  chr1   32727  32817  MACS_peak_1  8.69 1.150748e-11 chr1   30000 6e+04
# 2    2  chr1   52489  52552  MACS_peak_2  4.26 2.347418e-11 chr1   30000 6e+04
# 3    7  chr1  136389 136452  MACS_peak_7  4.26 2.347418e-11 chr1  130000 2e+05
# 4    5  chr1   66001  66117  MACS_peak_5  5.66 1.766784e-11 <NA>      NA    NA
# 5    6  chr1  115700 115769  MACS_peak_6 10.30 9.708738e-12 <NA>      NA    NA
# 6    3  chr1   65527  65590  MACS_peak_3  4.19 2.386635e-11 <NA>      NA    NA
# 7    4  chr1   65773  65904  MACS_peak_4  2.02 4.950495e-11 <NA>      NA    NA
# 8    9  chr1  235636 235700  MACS_peak_9  5.66 1.766784e-11 <NA>      NA    NA
# 9   10  chr1  432895 432958 MACS_peak_10  4.26 2.347418e-11 <NA>      NA    NA
# 10   8  chr1  235352 235415  MACS_peak_8  4.26 2.347418e-11 <NA>      NA    NA
于 2016-01-19T06:47:01.607 に答える
1

次の再現可能な例を考えてみましょう。

a <- GRanges(
  seqnames=Rle(c("chr1", "chr2", "chr3", "chr4"), c(3, 2, 1, 2)),
  ranges=IRanges(seq(1, by=9, len=8), seq(7, by=9, len=8)),
  rangeName=letters[seq(1:8)], score=sample(1:20, 8, replace = FALSE))

b <- GRanges(
  seqnames=Rle(c("chr1", "chr2", "chr3","chr4"), c(4, 3, 1, 1)),
  ranges=IRanges(seq(2, by=5, len=9), seq(4, by=5, len=9)),
  rangeName=letters[seq(1:9)], score=sample(1:20, 9, replace = FALSE))

次に、2 つの GRanges オブジェクトを要素ごとにオーバーラップします。

ov <- as(findOverlaps(a,b), "List")

ovオーバーラップ ヒット インデックス ベクトルを圧縮整数リスト オブジェクトとして返します。

于 2016-07-10T09:40:04.953 に答える
0

makeGRangesFromDataFrameこの目的のために呼び出される関数があります。

makeGRangesFromDataFrame(df,
keep.extra.columns=FALSE,
ignore.strand=FALSE,
seqinfo=NULL,
seqnames.field=c("seqnames", "seqname",
"chromosome", "chrom",
"chr", "chromosome_name",
"seqid"),
start.field="start",
end.field=c("end", "stop"),
strand.field="strand",
starts.in.df.are.0based=FALSE)

start.field="Start"開始列が上記のデフォルト以外の名前である場合は、または列の名前を指定して呼び出す必要があります。等についてもend.field同様。strand.field

于 2016-06-23T18:59:13.443 に答える