【问题标题】:Finding combinations of vectors from pairs of list items从列表项对中查找向量组合
【发布时间】:2018-06-25 15:30:39
【问题描述】:

我有一个命名列表,它代表生物通路的集合,其中名称是通路名称,列表中的向量是属于该通路的蛋白质。一个小例子是:

ann <- structure(list(`GO:0000010` = c("Q33DR2", "Q9CZQ1", "D6RHT8", 
"F6ZCX7", "B8JJX0", "Q33DR3", "F6T4Z4", "E0CYM9"), `GO:0000016` = c("Q5XLR9", 
"Q3TZ78", "F8VPT3"), `GO:0000026` = c("Q8BTP0", "Q3TZM9", "A0A077K846", 
"F6R220", "A0A077K9W9"), `GO:0000032` = c("Q924M7", "Q3V100", 
"F6Q3K8", "Q921Z9"), `GO:0000033` = c("Q9DBE8", "F6RBY3", "Q8BMZ4", 
"Q8K2A8", "F6XUH0", "D6RCW8", "Q6P8H8", "Q3URN2")), .Names = c("GO:0000010", 
"GO:0000016", "GO:0000026", "GO:0000032", "GO:0000033"))

我对成对的路径感兴趣:

pairs <- t(combn(names(ann), 2))

对于每一对通路,我想获得所有可能的蛋白质组合,其中蛋白质 #1 在通路 #1 中,蛋白质 #2 在通路 #2 中。所需的输出是包含两列矩阵的列表,其中第 1 列包含通路#1 中的蛋白质,第 2 列包含通路#2 中的蛋白质。到目前为止,我有这个:

protein_pairs <- purrr::map2(pairs[, 1], pairs[, 2], ~ as.matrix(expand.grid(ann[[.x]], ann[[.y]])))

但是,由于我感兴趣的配对总数非常大(通常 > 1,000),因此将 expand.grid 映射到所有可能的配对上需要很长时间 - 大约几个小时。

有没有更快的方法从这个列表中获取每对生物通路中所有可能的蛋白质组合?

【问题讨论】:

    标签: r optimization combinations


    【解决方案1】:

    如果您正在寻找速度,您可以轻松使用Rcpp 版本:

    // [[Rcpp::export]]
    CharacterMatrix fast2Expand(CharacterVector x, CharacterVector y) {
    
        unsigned long int lenX = x.size(), lenY = y.size();
        CharacterMatrix result = no_init_matrix(lenX * lenY, 2);
    
        for (std::size_t i = 0, count = 0; i < lenY; ++i) {
            for (std::size_t j = 0; j < lenX; ++j, ++count){
                result(count, 0) = x[j];
                result(count, 1) = y[i];
            }
        }
    
        return result;
    }
    

    它比原始版本快 10x20%rep.int 版本快(对于这个例子):

    microbenchmark(OP = purrr::map2(pairs[, 1], pairs[, 2], ~ as.matrix(expand.grid(ann[[.x]], ann[[.y]]))),
                   Rcpp = purrr::map2(pairs[, 1], pairs[, 2], ~ fast2Expand(ann[[.x]], ann[[.y]])),
                   repInt = purrr::map2(pairs[, 1], pairs[, 2], ~ as.matrix(expand.grid.jc(ann[[.x]], ann[[.y]]))))
    Unit: microseconds
      expr      min        lq      mean    median        uq      max neval
        OP 1104.700 1136.4370 1536.4048 1188.9990 1481.4940 6730.960   100
      Rcpp  105.505  126.9975  149.9009  138.1195  150.2015  663.146   100
    repInt  133.044  151.0175  223.9815  165.5435  203.5335 1269.194   100
    

    这是一个基于 OP 示例的人为设计示例,纯粹用于比较效率:

    annBig <- lapply(1:5, function(x) rep(ann[[x]], 100))
    names(annBig) <- names(ann)
    
    microbenchmark(OP = purrr::map2(pairs[, 1], pairs[, 2], ~ as.matrix(expand.grid(annBig[[.x]], annBig[[.y]]))),
                   Rcpp = purrr::map2(pairs[, 1], pairs[, 2], ~ fast2Expand(annBig[[.x]], annBig[[.y]])),
                   repInt = purrr::map2(pairs[, 1], pairs[, 2], ~ as.matrix(expand.grid.jc(annBig[[.x]], annBig[[.y]]))), times = 20)
    Unit: milliseconds
      expr       min        lq      mean    median       uq      max neval
        OP 522.56536 533.39393 562.60750 555.45345 588.4514 640.8584    20
      Rcpp  48.12683  56.17155  92.30095  92.23838 125.8065 142.2949    20
    repInt  80.28625 107.32329 140.32793 152.13732 160.9656 193.1310    20
    

    【讨论】:

      【解决方案2】:

      我认为rep.int() 的工作速度要快得多,正如另一个question: 中所述的那样

      尝试以下方法:

      expand.grid.jc <- function(seq1,seq2) {
        cbind(Var1 = rep.int(seq1, length(seq2)), 
              Var2 = rep.int(seq2, rep.int(length(seq1),length(seq2))))
      }
      protein_pairs <- purrr::map2(pairs[, 1], pairs[, 2], ~ as.matrix(expand.grid.jc(ann[[.x]], ann[[.y]])))
      

      干杯!,

      【讨论】:

        猜你喜欢
        • 2012-05-17
        • 2021-08-22
        • 1970-01-01
        • 1970-01-01
        • 2015-03-31
        • 2020-07-31
        • 1970-01-01
        • 2017-02-06
        • 1970-01-01
        相关资源
        最近更新 更多