以线性间隔查找局部坐标

时间:2018-04-13 21:47:22

标签: r dplyr intervals genomicranges

我有data.frame interval坐标(外显子和编码序列外显子,基因转录本):

df <- data.frame(seqnames=rep("chr1",24),
                 start=c(3670552,3670552,3421702,3421702,3214482,3216025,4807823,4807914,4808455,4808455,4828584,4828584,4830268,4830268,4832311,4832311,4837001,4837001,4839387,4839387,4840956,4840956,4844963,4844963),
                 end=c(3671498,3671348,3421901,3421901,3216968,3216968,4807982,4807982,4808486,4808486,4828649,4828649,4830315,4830315,4832381,4832381,4837074,4837074,4839488,4839488,4841132,4841132,4846739,4845013),
                 strand=c(rep("-",6),rep("+",18)),
                 exon_number=c(1,1,2,2,3,3,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9),
                 width=c(947,797,200,200,2487,944,160,69,32,32,66,66,48,48,71,71,74,74,102,102,177,177,1777,51),
                 type=c('exon','CDS','exon','CDS','exon','CDS','exon','CDS','exon','CDS','exon','CDS','exon','CDS','exon','CDS','exon','CDS','exon','CDS','exon','CDS','exon','CDS'),
                 #exon_number=c(1,1,2,2,3,3,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8),
                 transcript_id=c(rep("a",6),rep("b",18)),stringsAsFactors = F)

> head(df)
  seqnames   start     end strand exon_number width type transcript_id
1     chr1 3670552 3671498      -           1   947 exon             a
2     chr1 3670552 3671348      -           1   797  CDS             a
3     chr1 3421702 3421901      -           2   200 exon             a
4     chr1 3421702 3421901      -           2   200  CDS             a
5     chr1 3214482 3216968      -           3  2487 exon             a
6     chr1 3216025 3216968      -           3   944  CDS             a

他的组织如下:

每个transcript_id由一组exon组成,它们是seqnames的线性区间(染色体),由start和{{1}定义}}。这些end的方向/方向性取决于exon(每个strand的所有exon都相同):if transcript_id则实际{ {1}}是外显子的第一个位置,strand == "-"是它的最后位置。如果end然后startstrand == "+"分别是第一个和最后一个位置。

start行是end的子集。通常,在每个CDS中保留第一个和最后几个exon,每个exon具有相同的transcript_id间隔(就坐标而言)。但是,例外情况是:

  1. exon间隔是CDS s的子集,这意味着它们可以在CDS(s)内开始和/或结束。可能是第一个exon区间的第一个位置在最接近的exon的第一个位置之后,和/或最后一个CDS区间的最后一个位置在最接近的exon区间的最后一个位置之前。 {1}}。 CDS也可能会有一个exon(因此只有一个transcript_id)符合这些定义。
  2. exon所有CDS的{​​{1}}间隔相同{/ 1}}
  3. transcript_id其中exon没有相同CDS间隔的transcript_id只是前几个
  4. exon其中CDS没有相同transcript_id间隔的exon只是最后几个
  5. 我正在寻找一个快CDS,它会返回function的本地坐标,相对于CDS的{​​{1}}坐标结合。基本上,生成的transcript_id中的exonstart区间宽度的总和,直到第一个data.frame区间的第一个exon区间+ CDS - start CDS的一部分start(或exon如果end)和strand == "-" end CDS } + start宽度之和。

    这是我到目前为止所做的事情,但速度很慢:

    CDS

    有关如何加快速度的建议吗?可以使用res.df <- do.call(rbind,lapply(unique(df$transcript_id),function(t){ transcript.df <- df %>% dplyr::filter(transcript_id == t) up.cds.df <- dplyr::filter(transcript.df,type == "exon",exon_number < min(dplyr::filter(transcript.df,type == "CDS")$exon_number)) down.cds.df <- dplyr::filter(transcript.df,type == "exon",exon_number > max(dplyr::filter(transcript.df,type == "CDS")$exon_number)) cds.df <- dplyr::filter(transcript.df,exon_number >= min(dplyr::filter(transcript.df,type == "CDS")$exon_number,exon_number <= max(dplyr::filter(transcript.df,type == "CDS")$exon_number))) first.cds.exon.number <- (cds.df %>% dplyr::filter(type == "CDS") %>% dplyr::filter(exon_number == min(exon_number)))$exon_number if(transcript.df$strand[1] == "+"){ cds.start <- dplyr::filter(cds.df,type == "CDS",exon_number == first.cds.exon.number)$start-dplyr::filter(cds.df,type == "exon",exon_number == first.cds.exon.number)$start+1+sum(up.utr.df$width) } else{ cds.start <- dplyr::filter(cds.df,type == "exon",exon_number == first.cds.exon.number)$end-dplyr::filter(cds.df,type == "CDS",exon_number == first.cds.exon.number)$end+1+sum(up.utr.df$width) } return(data.frame(transcript_id=t,start=cds.start,end=cds.start+sum(dplyr::filter(cds.df,type == "CDS")$width),stringsAsFactors = F)) })) > res.df transcript_id start end 1 a 151 2092 2 b 92 782

0 个答案:

没有答案