相交多对整数向量

时间:2017-01-18 05:22:44

标签: r list intersection combn

我有list integer vector s:

set.seed(1)
l <- list(g1=as.integer(runif(10,1,100)),
          g2=as.integer(runif(5,1,100)),
          g3=as.integer(runif(5,1,100)),
          g4=as.integer(runif(8,1,100)))

(实际上它是1000的元素长,矢量元素的平均长度是100s)

我想在所有intersection元素对及其对应的union / l {{1}之间计算hypergeometric超过fisher.test的{​​{1}} }。

以下是我目前正在做的事情:

  1. 首先,我生成一个矩阵来存储其所有元素对的p-value个索引:

    l
  2. 此部分速度非常快,可以使用combnPrim

    加快速度
    1. 然后我运行此函数来获得我想要的输出:

      idx.mat <- t(combn(1:length(l),2))

    2. 但是对于我的实际数据大小,这有点慢。

      知道如何更快地实现这一目标吗?

1 个答案:

答案 0 :(得分:1)

尝试将l表示为1/0矩阵:

max.val = max(sapply(l, max))
mat = do.call(rbind, lapply(l, function(x) {z = rep(0, max.val); z[x] = 1; z}))

现在,您可以轻松地预先计算成对交叉点和联合:

pair_intsct = mat %*% t(mat)

pair_union = outer(rowSums(mat), rowSums(mat), '+') - pair_intsct