我很难在特定背景下采样或排除某些可能性。
我正在尝试创建一个对基因组区域进行洗牌的 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 的范围内采样的任何线索?
lapply 很重要,因为与使用循环相比,它大大减少了函数的执行时间。
[编辑]
这是一个可重复的示例,它不使用 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")
##