我有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
然后start
和strand == "+"
分别是第一个和最后一个位置。
start
行是end
的子集。通常,在每个CDS
中保留第一个和最后几个exon
,每个exon
具有相同的transcript_id
间隔(就坐标而言)。但是,例外情况是:
exon
间隔是CDS
s的子集,这意味着它们可以在CDS
(s)内开始和/或结束。可能是第一个exon
区间的第一个位置在最接近的exon
的第一个位置之后,和/或最后一个CDS
区间的最后一个位置在最接近的exon
区间的最后一个位置之前。 {1}}。 CDS
也可能会有一个exon
(因此只有一个transcript_id
)符合这些定义。exon
所有CDS
的{{1}}间隔相同{/ 1}} transcript_id
其中exon
没有相同CDS
间隔的transcript_id
只是前几个exon
其中CDS
没有相同transcript_id
间隔的exon
只是最后几个我正在寻找一个快CDS
,它会返回function
的本地坐标,相对于CDS
的{{1}}坐标结合。基本上,生成的transcript_id
中的exon
是start
区间宽度的总和,直到第一个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