我有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}} }。
以下是我目前正在做的事情:
首先,我生成一个矩阵来存储其所有元素对的p-value
个索引:
l
此部分速度非常快,可以使用combnPrim
加快速度然后我运行此函数来获得我想要的输出:
idx.mat <- t(combn(1:length(l),2))
但是对于我的实际数据大小,这有点慢。
知道如何更快地实现这一目标吗?
答案 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