我为此创建了以下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()
答案 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
的向量。如果没有,[]
(索引)将删除它们。