我有integer
vector
list
A 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的元件長和向量元素的平均長度在100秒)
我想要在所有l
的元素對和它們相應的hypergeometric
/fisher.test
/之間的union
上計算intersection
。
這裏是目前我在做什麼:
首先,我產生一個矩陣來存儲所有對的元素的
l
指數:idx.mat <- t(combn(1:length(l),2))
這部分是相當快並且可以使用更快的速度使用combnPrim
然後我跑這個函數來得到我想要的輸出:
res.df <- do.call(rbind, lapply(1:nrow(idx.mat), function(i){ gi.length <- length(l[[idx.mat[i,1]]]) gj.length <- length(l[[idx.mat[i,2]]]) set.diff.1 <- length(setdiff(l[[idx.mat[i,1]]],l[[idx.mat[i,2]]])) set.diff.2 <- length(setdiff(l[[idx.mat[i,2]]],l[[idx.mat[i,1]]])) gi.gj.inter <- length(intersect(l[[idx.mat[i,1]]],l[[idx.mat[i,2]]])) gi.gj.union <- length(unique(c(l[[idx.mat[i,1]]],l[[idx.mat[i,2]]]))) p.value <- fisher.test(matrix(c(gi.length+gj.length- gi.gj.union,set.diff.1,set.diff.2,gi.gj.inter),nrow=2),alternative="greater")$p.value return(data.frame(gi=names(l)[idx.mat[i,1]], gj=names(l)[idx.mat[i,2]], gi.gj.inter=gi.gj.inter, gi.gj.union=gi.gj.union, gi.gj.iou=gi.gj.inter/gi.gj.union, gi.gj.iou.p.val=p.value, stringsAsFactors=F)) }))
但我真正的數據大小,這是一個有點慢。
任何想法如何實現這個更快?
我的哪個示例數據的一部分,是不小的或重現? – dan
@dan你的例子很好。這只是有人沒有正確閱讀它:-) – akrun
對於你的具體問題,一個選項是'combnPrim' [顯示在這裏](http://stackoverflow.com/questions/26828301/faster-version-of- combn) – akrun