R:每个间隔的唯一元素计数

问题描述 投票:1回答:2

让我列出一个不重叠的基因组区间。

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 ...

r performance intervals genomicranges
2个回答
0
投票

一种可能是:


0
投票

对于大样本,我将尝试在data.table中使用非等价联接。样本中的基准测试结果比tmfmnk的答案差,但对于更大的数据集,它可能具有较小的内存占用空间,并且速度更快。

© www.soinside.com 2019 - 2024. All rights reserved.