我有一个data.frame
,它有一组不相交的、不重叠的、有序的、有方向的线性间隔,由它们的间隔序列名称(下面的seqname
)定义,以及它们的start
和end
坐标:
df <- data.frame(seqname = c("s1","s1","s1","s1","s1","s1","s2","s3"),
start = c(50,150,250,350,650,750,300,600),
end = c(100,200,300,400,700,800,400,700))
事实上,这些都是DNA中假定的基因部分(seqname
是染色体),我正在试图确定它们是同一基因的一部分,还是独立基因的一部分。截止值是经验性的,基于实际的基因长度和该基因组中的基因长度之间(特定于特定类型的基因)。
我想使用两个长度截止点对间隔进行分组(分别针对每个seqname
):一个定义最大组长度(即,组中最后一个间隔的结束坐标减去组中第一个间隔的开始坐标),另一个定义连续组之间的最小长度(组间长度)。这意味着一组间隔不能长于最大组长度截止,并且两个连续组不能被小于最小组间长度截止的两个组分开。
显然,这两个约束可以是冲突的-将一个区间添加到现有组,其起始坐标和现有组的结束坐标之间的差小于最小组间长度截止点,但添加它将导致长度大于最大组截止点的组。因此,在这种情况下,可能会违反最大组截止约束。
对于此示例,最大组长度截止值为300,最小组间长度截止值为100,因此结果为:
library(dplyr)
df %>% dplyr::mutate(id = c("s1.1","s1.1","s1.1","s1.1","s1.2","s1.2","s2.1","s3.1"))
其中id
是分组ID。
请注意,s1
上的第四个间隔使用s1.1
进行分组,因为尽管将其添加到s1.1
最终会导致s1.1
的长度为350 >最大组长度截止,但它位于s1.1
末端的下游50 (没有添加它),这仍然满足最小组间约束。
你知道如何在R中实现这一点吗,也许是使用intervals
package
或类似的工具?
转载请注明出处:http://www.nali5.com/article/20230508/1017139.html