让我列出一个不重叠的基因组区间。
chr1 1 100
chr1 101 200
chr1 201 300
chr1 301 400
和链接到不同样品的基因组位置的列表为:
chr1 50 sampleA
chr1 60 sampleB
chr1 110 sampleA
chr1 130 sampleB
chr1 160 sampleA
chr1 190 sampleC
chr1 350 sampleB
chr1 360 sampleB
我的目标是计算每个时间间隔内唯一样本的数量。在我的真实数据集中,间隔表为〜400.000行,基因组位置样本表为〜30.000行。
此计算已嵌入模拟中,因此应尽可能快。我已经尝试过用GenomicRanges作为:
require(GenomicRanges)
interval.gr <- GRanges(intervals$chr,IRanges(intervals$start,intervals$end))
positions.gr <- GRanges(positions$chr,IRanges(positions$pos,positions$pos))
ov <- findOverlaps(interval.gr,positions.gr)
intervals %>%
slice(queryHits(ov)) %>%
mutate(sample=positions$sample[subjectHits(ov)]) %>%
group_by(chr,start,end) %>%
summarise(n_sample=length(unique(sample)))
结果]
# A tibble: 3 x 4 # Groups: chr, start [3] chr start end n_sample <fct> <dbl> <dbl> <int> 1 chr1 1 100 2 2 chr1 101 200 3 3 chr1 301 400 1
但是它仍然会丢失没有采样的间隔(201-300),而且速度也不是很快。使用我的数据集:
Unit: milliseconds expr min lq mean median uq max neval x 159.3901 161.621 190.1703 164.4879 168.3116 297.8395 10
我想知道是否有更好,更快的方法来进行这种分析?
感谢
可复制的数据集:
intervals <- data.frame(chr=c("chr1","chr1","chr1","chr1"),start=c(1,101,201,301),end=c(100,200,300,400))
positions <- data.frame(chr=rep("chr1",8),pos=c(50,60,110,130,160,190,350,360),sample=c("sampleA","sampleB","sampleA","sampleB","sampleA","sampleC","sampleB","sampleB"))
让我列出一个不重叠的基因组区间。 chr1 1100 chr1 101 200 chr1 201 300 chr1 301 400和链接到不同样本的基因组位置列表,如:chr1 50 ...
一种可能是:
对于大样本,我将尝试在data.table
中使用非等价联接。样本中的基准测试结果比tmfmnk的答案差,但对于更大的数据集,它可能具有较小的内存占用空间,并且速度更快。