我用下面的代码创建了以下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万行要处理。
我可以使用这种方法,但very2速度很慢:
library(tidyverse)
gr %>%
as.tibble() %>%
distinct()
发布于 2019-06-27 16:54:51
您可以使用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 +
发布于 2019-06-26 12:28:47
您可以使用索引来执行此操作:
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
的向量。如果不是,[]
(索引)将删除它们。
https://stackoverflow.com/questions/56765100
复制相似问题