выбор целочисленных интервалов с определенной длиной внутреннего интервала из случайных целочисленных интервалов - PullRequest
1 голос
/ 07 декабря 2011

Здесь у меня есть одномерное целочисленное пространство (состоящее из случайных интервалов, определяемых их началом и концом).Я хотел бы выбрать последовательные целочисленные интервалы с определенной длиной внутреннего интервала.

Целочисленный интервал означает набор последовательных увеличивающихся целых чисел, определяемых начальным целым числом и конечным целым числом.Некоторые интервалы в исходном наборе полностью включены в другие или частично перекрываются с другими.

Я описываю свой вопрос, используя следующую пустышку.

(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\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

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

Я бы сделал это в несколько шагов:

1) Сократим целочисленное пространство до непересекающихся интервалов.

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
1 голос
/ 07 декабря 2011

Частичные шаги: я думаю, что вы сначала хотите определить непрерывные последовательности. Единственное условие, которое вы не указали в своем тестовом примере, - это полностью перекрывающаяся последовательность.

> 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 48
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...