Как получить отдельные/уникальные строки из объекта 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      +

Как я могу этого добиться? На самом деле мне нужно обработать около 9 миллионов строк.

Я могу использовать этот метод, но очень медленный:

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

person scamander    schedule 26.06.2019    source источник


Ответы (2)


Вы можете использовать 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      +
person Joris C.    schedule 27.06.2019

Вы можете сделать это с помощью индексации:

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 в зависимости от того, уникальны ли эти строки. Если нет, [] (индексация) их удалит.

person Dij    schedule 26.06.2019