首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从Rle向量高效构造GRanges/IRanges

从Rle向量高效构造GRanges/IRanges
EN

Stack Overflow用户
提问于 2016-08-30 16:54:40
回答 1查看 456关注 0票数 7

我有一个游程编码的向量,按顺序表示基因组上每个位置的一些值。举个简单的例子,假设我只有一个长度为10的染色体,那么我就会有一个如下所示的向量

代码语言:javascript
复制
library(GenomicRanges)

set.seed(1)
toyData = Rle(sample(1:3,10,replace=TRUE))

我想将其强制到一个GRanges对象中。我能想到的最好的办法就是

代码语言:javascript
复制
gr = GRanges('toyChr',IRanges(cumsum(c(0,runLength(toyData)[-nrun(toyData)])),
                              width=runLength(toyData)),
             toyData = runValue(toyData))

这是可行的,但速度非常慢。有没有更快的方法来构造相同的对象?

EN

回答 1

Stack Overflow用户

发布于 2016-09-19 17:28:27

正如@TheUnfunCat指出的那样,OP的解决方案非常可靠。下面的解决方案仅比原始解决方案略快。我尝试了几乎所有的base R组合,但无法胜过S4Vectors包中的高效Rle,因此我求助于Rcpp。下面是主要函数:

代码语言:javascript
复制
GenomeRcpp <- function(v) {
    x <- WhichDiffZero(v)
    m <- v[c(1L,x+1L)]
    s <- c(0L,x)
    e <- c(x,length(v))-1L
    GRanges('toyChr',IRanges(start = s, end = e), toyData = m)
}

WhichDiffZeroRcpp函数,它的作用与base R中的which(diff(v) != 0)几乎相同。很多功劳都归功于@G.Grothendieck

代码语言:javascript
复制
#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
IntegerVector WhichDiffZero(IntegerVector x) {
    int nx = x.size()-1;
    std::vector<int> y;
    y.reserve(nx);
    for(int i = 0; i < nx; i++) {
        if (x[i] != x[i+1]) y.push_back(i+1);
    }
    return wrap(y);
}

以下是一些基准测试:

代码语言:javascript
复制
set.seed(437)
testData <- do.call(c,lapply(1:10^5, function(x) rep(sample(1:50, 1), sample(1:30, 1))))

microbenchmark(GenomeRcpp(testData), GenomeOrig(testData))
Unit: milliseconds
                expr      min       lq     mean   median       uq      max neval cld
GenomeRcpp(testData) 20.30118 22.45121 26.59644 24.62041 27.28459 198.9773   100   a
GenomeOrig(testData) 25.11047 27.12811 31.73180 28.96914 32.16538 225.1727   100   a

identical(GenomeRcpp(testData), GenomeOrig(testData))
[1] TRUE

在过去的几天里,我一直在断断续续地工作,我肯定不满意。我希望有人会接受我所做的(因为这是一种不同的方法),并创造出更好的东西。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39222913

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档