2015-10-21 51 views
0

我有兩個農莊清單和我試圖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也許? 謝謝!

+0

from GenomicRanges,對不起,我會補充! – user971102

回答

0

該數據不應該在列表結構中,因爲它具有可預測和一致的結構。我把它放在一個數據框中,並將它塑造成你看起來很像你想要的格式。

library(dplyr) 
library(tidyr) 

t %>% 
    as.data.frame %>% 
    mutate(ID = 1:n()) %>% 
    gather(variable, value, -ID) %>% 
    separate(variable, c("A", "B")) %>% 
    spread(ID, value) %>% 
    group_by(B) %>% 
    do(result = my_function(.)) 
+0

謝謝bramtayl ...我想以列表格式輸出它,但是要將其他功能應用於每個數據框(並且有很多這樣的功能,因此這種方式似乎更容易)... – user971102

+0

如果您想要應用函數到每個子數據框只是使用do(請參閱上面的編輯) – bramtayl

+0

我只是不太瞭解tidyr包,因爲我從來沒有使用它,我也可以將結果數據框分割成基於列A的列表,但是如何我是否可以將其保存到可用於其他基本功能的數據框中?再次感謝 – user971102

相關問題