Выборка в пределах диапазона
У меня проблемы с выборкой на определенном фоне или без каких-либо возможностей.
Я пытаюсь создать функцию R, которая перемешивает области генома.
На данный момент функция работает хорошо и выполните следующие шаги:
- Извлекает все длины геномных областей и хромосом запроса.
- Вычисляет все возможные запуски как указанный общий размер хромосомы минус длина каждой области запроса.
- Вычисляет перетасованные области генома, когда выборка начинается от 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")
##