如何从GenomicRanges对象获取不同/唯一的行

时间:2019-06-26 04:16:54

标签: r bioinformatics tidyverse genomicranges

我为此创建了以下GenomicRanges对象:

library(GenomicRanges)
gr <- GRanges(seqnames = "chr1", strand = c("+", "-","-", "+"),ranges = IRanges(start = c(1,3,3,5), width = 3))
gr

看起来像这样:

GRanges object with 4 ranges and 0 metadata columns:
      seqnames    ranges strand
         <Rle> <IRanges>  <Rle>
  [1]     chr1       1-3      +
  [2]     chr1       3-5      -
  [3]     chr1       3-5      -
  [4]     chr1       5-7      +

我想做的是从那里获取唯一的行,并产生(手动编码)

GRanges object with 3 ranges and 0 metadata columns:
      seqnames    ranges strand
         <Rle> <IRanges>  <Rle>
  [1]     chr1       1-3      +
  [2]     chr1       3-5      -
  [3]     chr1       5-7      +

我该如何实现?实际上,我要处理大约900万行。

我可以使用这种方法,但是非常慢:

 library(tidyverse)
 gr %>% 
   as.tibble() %>% 
   distinct()

2 个答案:

答案 0 :(得分:1)

您可以使用unique返回唯一行:

library(GenomicRanges)

gr <- GRanges(seqnames = "chr1", strand = c("+", "-","-", "+"),ranges = IRanges(start = c(1,3,3,5), width = 3))
unique(gr)
#> GRanges object with 3 ranges and 0 metadata columns:
#>       seqnames    ranges strand
#>          <Rle> <IRanges>  <Rle>
#>   [1]     chr1       1-3      +
#>   [2]     chr1       3-5      -
#>   [3]     chr1       5-7      +
#>   -------
#>   seqinfo: 1 sequence from an unspecified genome; no seqlengths

如果要将对象转换为data.frame(如在tidyverse解决方案中一样),则data.table的unique可能会更快:

library(data.table)

unique(as.data.table(gr))
#>    seqnames start end width strand
#> 1:     chr1     1   3     3      +
#> 2:     chr1     3   5     3      -
#> 3:     chr1     5   7     3      +

答案 1 :(得分:0)

您可以使用索引编制:

gr[paste0(gr$seqnames, gr$ranges, gr$strand) %in% unique(paste0(gr$seqnames, gr$ranges, gr$strand)), ]

paste0(gr$seqnames, gr$ranges, gr$strand)会将行绑定到一个可识别的字符串中,该字符串表示变量的不同组合。然后,根据这些行是否唯一,使用%in%创建TRUE / FALSE的向量。如果没有,[](索引)将删除它们。