大型GRanges中的聚合箱有效

时间:2016-09-08 22:58:52

标签: r dplyr aggregate genomicranges

我有一个SummarizedExperiment(但我们可以认为它是一个GRanges)。 我想要的是减少间隔的数量,每个相同的相邻mcol(gr)只保留一行,重要的是跟踪新的延伸间隔。

非常感谢!

gr <- GRanges(
seqnames = Rle(c("chr1"), c(12)),
ranges = IRanges(1:12*10, end = 1:12*10+5),
state1 = c(1,1,1,1,2,3,4,5,5,5,1,1),
state2 = c(1,1,1,2,2,2,5,5,6,6,1,1))

生成的GRanges应如下所示:

gr2 <- GRanges(
  seqnames = Rle(c("chr1"), c(8)),
  ranges = IRanges(start = c(10,40,50,60,70,80,90,110),
  end =  c(35,45,55,65,75,85,105,125)),
  state1 = c(1,1,2,3,4,5,5,1), state2 = c(1,2,2,2,5,5,6,1))​  

编辑:我编辑了Granges,因此状态对也存在于非相邻区间(第二组1,1对必须从第一组独立报告) 对不起我的初步解决方案也错了!

非常感谢!

1 个答案:

答案 0 :(得分:2)

创建一个人为因素,确保级别按因子中的出现顺序(而不是默认的字母顺序),以避免重新排列GRanges,并拆分GRanges对象

f0 = paste(gr$state1, gr$state2, sep=".")
f = factor(f0, levels=unique(f0))
grl = split(gr, f)

获取范围和相关元数据

grf = unlist(range(grl), use.names=FALSE)
mcols(grf) = mcols(gr)[!duplicated(f),]
对于此大小的数据,

split()range()unlist()都应该“快”。

要在染色体上分裂,请将其添加到因子

f0 = paste(seqnames(gr), gr$state1, gr$state2, sep=".")

以某种其他方式分裂,例如,只有当状态相邻时,找出一种方法来制作适当的因素,例如,

f0 = paste(
    seqnames(gr),
    cumsum(c(TRUE, diff(gr$state1) != 0)),
    cumsum(c(TRUE, diff(gr$state2) != 0)),
    sep=".")

在Bioconductor support site上询问有关Bioconductor包的问题。