在这里,我有一个一维整数空间(由开始和结束定义的随机间隔组成)。我想选择具有特定帧内长度的后续整数间隔。
整数间隔是指由开始整数和结束整数定义的一组连续递增的整数。初始集合中的一些区间完全包含在其他区间中,或者与其他区间部分重叠。
我使用下面的虚拟对象来描述我的问题。
(1)我具有的数据(具有由它们的开始和结束定义的整数间隔的整数空间),
integer.space <- data.frame(
begin=c(1,5,6,15,31,51,102),
end =c(7,9,13,21,49,52,108)
)( 2 )我想要的是选择内部长度为3,内部长度为2的后续整数区间,并将所选区间输出为begin和end。在此选择中,我希望选择尽可能多的整数间隔。
begin, end\n
1,3\n
6,8\n
11,13\n
16,18\n
31,33\n
36,38\n
41,43\n
46,48\n
102,104\n发布于 2011-12-08 12:24:47
我将通过以下几个步骤完成此操作:
1)将integer.space减少到不重叠的间隔。
2)创建一个区间集合,并对其进行移位,使其从整数空间的不相交部分的起始点开始:
intra <- 3
inter <- 2
intervals <- data.frame(begin=seq(from=min(integer.space$begin),to=max(integer.space$end),by=intra+inter))
intervals$end <- intervals$begin + inter
for (k in 2:nrow(integer.space)) {
# overlaps the start of this component?
shift <- (intervals$begin>integer.space$end[k-1]) & (intervals$begin<integer.space$begin[k])
if (any(shift)) {
shift.ind <- min(which(shift))
intervals[shift.ind:nrow(intervals),] <- intervals[shift.ind:nrow(intervals),] + integer.space$begin[k] - intervals$begin[shift.ind]
}
}3)删除位于整数空间之外的那些
goodbegins <- sapply(intervals$begin, function (x) {
any( (x>=integer.space$begin) & (x<=integer.space$end) )
} )
goodends <- sapply(intervals$end, function (x) {
any( (x>=integer.space$begin) & (x<=integer.space$end) )
} )
intervals <- intervals[goodbegins&goodends,]
intervals发布于 2011-12-08 03:58:21
部分步骤:我认为您首先要定义连续序列。您没有放在测试用例中的一个条件是一个完全重叠的序列。
> ints2 <- ints2[c(1:3,3,4:7),]
> ints2[4,] <- c(8,10)
require(IRanges) # from BioConductor repository
x <- IRanges(start = ints2$begin, width=1+ints2$end-ints2$begin)
asNormalIRanges(x)
#--------------
NormalIRanges of length 5
start end width
[1] 1 13 13
[2] 15 21 7
[3] 31 49 19
[4] 51 52 2
[5] 102 108 7进一步的进展:生成2,3,2,3,2,3的序列...在重叠范围内,您可以使用:
# c(start, cumsum( rep(c(2,3), 1+(end-start)%/%5)但是,当序列超过“结束”时,你需要修剪序列:
seqcand <- c(cumsum(c(31, rep(c(2,3), 1+(49-31)%/%5))), 49)
seqcand[ 1: (min(which(seqcand > 49, arr.ind=TRUE))-1)]
# [1] 31 33 36 38 41 43 46 48https://stackoverflow.com/questions/8413990
复制相似问题