从间隔数据帧中查找子间隔

时间:2017-08-02 05:57:16

标签: r dataframe intervals intersection

我有两个data.frame s坐标为线性间隔,对应于ids。每个id有几个线性间隔。其中一个data.frame被称为exon.df

exon.df <- data.frame(id=c(rep("id1",4),rep("id2",3),rep("id3",5)),
                      start=c(10,20,30,40,100,200,300,1000,2000,3000,4000,5000),
                      end=c(15,25,35,45,150,250,350,1500,2500,3500,4500,5500))

另一个cds.df

cds.df <- data.frame(id=c(rep("id1",3),rep("id2",3),rep("id3",3)),
                      start=c(20,30,40,125,200,300,2250,3000,4000),
                      end=c(25,35,45,150,250,325,2500,3500,4250))

它们都具有相同的ID,但cds.df的间隔包含在exon.df的间隔内。 exons.df中的区间是基因的外显子(基因组的一部分被复制并缝合在一起以制作基因的转录本),cds.df中的那些是这些外显子的部分将被翻译因为基因转录本的外显子也包含不会被翻译的部分(未翻译的区域 - utr)。这些utr只能位于基因转录本的开头和结尾。开头的utr称为5&u; utr,最后的utr称为3&lt; utr。 utr可能根本不存在,或跨越基因每端的单个或多个外显子的部分之间的任何位置。

这意味着id的5&gt; utr从id exon.df中第一个间隔的第一个位置开始到cds.df中第一个间隔之前的一个位置,并且如果存在,则包括exon.df之间的所有外显子。同样,ID的3&gt; utr在cds.df中的最后一个时间段之后的exon.df中的最后一个时间点的最后一个位置之后开始一个位置,包括exons.df中的所有外显子介于两者之间是否存在。 如果cds.df中第一个区间的第一个位置是exon.df中第一个区间的第一个位置,那么id也可能没有任何一个或两个都有,如果是cds.df中最后一个时间间隔的最后一个位置是exon.df中最后一个时间间隔的最后一个位置。

我正在寻找一种快速方法来检索这5个utr和3个utr区间,并提供exon.dfcds.df

以下是此示例的结果:

utr5.df <- data.frame(id=c("id1","id2","id3","id3"),
                     start=c(10,100,1000,2000),
                     end=c(15,124,1500,2249))

utr3.df <- data.frame(id=c("id2","id3","id3"),
                     start=c(326,4251,5000),
                     end=c(350,4500,5500))

1 个答案:

答案 0 :(得分:1)

你知道Bioconductor吗?它是R的附加组件,专门用于生物科学。它有一个名为GenomicRanges的包,您可以使用它创建包含所有外显子的GRanges对象,以及包含所有CDS的另一个对象。

然后,您可以对这两个对象进行设置差异以获取UTR。检查&#34; setops-methods&#34; here。你想要&#39; setdiff&#39;功能

所以:将您的data.frames转换为GRanges对象,然后发出类似utrs <- setdiff(exons, cds)

的内容