Как получить отдельные / уникальные строки из объекта GenomicRanges - PullRequest
0 голосов
/ 26 июня 2019

У меня есть следующий 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 миллионов строк для обработки.

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

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

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Вы можете использовать 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), unique data.table может быть быстрее:

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

...