我有兩個農莊清單和我試圖countOverlaps功能應用到列表中的每個組合,並返回類似這樣的結果的列表:R:mapply了兩個列表的對象,並返回數據的列表框
library(GenomicRanges)
gr1 <- GRanges(seqnames = c("chr1", "chr2"), ranges = IRanges(c(7,13), width = 3), strand = c("+", "-"))
gr2 <- GRanges(seqnames = c("chr1", "chr3"), ranges = IRanges(c(5,13), width = 3), strand = c("+", "-"))
grlA <- GRangesList("a" = gr1, "b" = gr2)
gr1 <- GRanges(seqnames = c("chr1", "chr2"), ranges = IRanges(c(1,13), width = 3), strand = c("+", "-"))
gr2 <- GRanges(seqnames = c("chr1", "chr3"), ranges = IRanges(c(3,13), width = 3), strand = c("+", "-"))
grlB <- GRangesList("c" = gr1, "d" = gr2)
我想獲得對象列表「a」和對象「b」在GRLA包含函數爲grlB的每個值的結果:
(列表$ A,$ b和dataframes爲C, d)
$ c
AB
$ d
AB
本工程以獲取列表的所有組合:
comb_apply <- function(f,..., MoreArgs=list()){
exp <- unname(as.list(expand.grid(...,stringsAsFactors = FALSE)))
do.call(mapply, c(list(FUN=f, SIMPLIFY=FALSE, MoreArgs=MoreArgs), exp))
}
# This function is thanks to Michael Lawrence's help posted in the bioconductor package
t= comb_apply(function(i, j) countOverlaps(grlA[[i]], grlB[[j]]), seq_along(grlA), seq_along(grlB))
names(t)=apply(expand.grid(names(grlA), names(grlB)), 1, paste, collapse="_")
但後來得到我想要的東西(數據幀的列表) ,我需要grep命令來選擇數據幀是grlB的一部分,並將它們保存在一個單獨的列表中,但這是非常慢...
new=list()
for (i in names(grlB)) {
df = as.data.frame(t[grep(i,names(t))])
new[[length(new)+1]] <- df
}
有沒有另一種方式,我可以做到這一點,而不grep也許? 謝謝!
from GenomicRanges,對不起,我會補充! – user971102