Выборка в пределах диапазона

У меня проблемы с выборкой на определенном фоне или без каких-либо возможностей.

Я пытаюсь создать функцию R, которая перемешивает области генома.

На данный момент функция работает хорошо и выполните следующие шаги:

  1. Извлекает все длины геномных областей и хромосом запроса.
  2. Вычисляет все возможные запуски как указанный общий размер хромосомы минус длина каждой области запроса.
  3. Вычисляет перетасованные области генома, когда выборка начинается от 0 до возможных стартов, а ширина - это просто ширина каждой области запроса.

Эта функция использует объект GenomicRanges, вот его код:

GrShuffle <- function(regions, chromSizes = LoadChromSizes("hg19")) {
    # Gets all the regions lengths from the query.
    regionsLength <- regions@ranges@width
    # The possible starts are the chromosome sizes - the regions lengths.
    possibleStarts <- chromSizes[as.vector(regions@seqnames), ] - regionsLength
    # Gets all the random starts from sampling the possible starts.
    randomStarts <- unlist(lapply(possibleStarts, sample.int, size = 1))
    granges <- GRanges(regions@seqnames, IRanges(start = randomStarts,
                                             width = regionsLength),
                   strand=regions@strand)
    return(granges)
}

Но теперь мне нужно использовать вселенную, то есть другой набор областей, которые будут определять, в каких диапазонах будут происходить случайные действия. Вселенная работает как ограничение выборки. Это будет другой набор регионов, таких как запрос. И никакие перетасовки не должны происходить за пределами этих регионов.

Любая подсказка о том, как сделать выборку в диапазонах в R?

Замедление важно, поскольку оно значительно сокращает время выполнения функции по сравнению с использованием цикла.

[РЕДАКТИРОВАТЬ]

Вот воспроизводимый пример, который не использует GenomicRanges, чтобы максимально упростить то, чего я хочу достичь.

## GENERATES A RANDOM QUERY
chromSizes <- c(100,200,250)
names(chromSizes) <- c("1","2","3")
queryChrom <- sample(names(chromSizes), 100, replace = TRUE)
queryLengths <- sample(10, 100, replace = TRUE)
queryPossibleStarts <- chromSizes[queryChrom] - queryLengths
queryStarts <- unlist(lapply(queryPossibleStarts, sample.int, size = 1))
query <- data.frame(queryChrom, queryStarts, queryStarts + queryLengths)
colnames(query) <- c("chrom", "start", "end")
##

##SIMPLIFIED FUNCTION
# Gets all the regions lengths from the query.
regionsLength <- query$end - query$start
# The possible starts are the chromosome sizes - the regions lengths.
possibleStarts <- chromSizes[query$chrom] - regionsLength
# Gets all the random starts from sampling the possible starts.
randomStarts <- unlist(lapply(possibleStarts, sample.int, size = 1))
shuffledQuery <- data.frame(queryChrom, randomStarts, randomStarts + queryLengths)
colnames(shuffledQuery) <- c("chrom", "start", "end")
##

0 ответов

Другие вопросы по тегам