簡體   English   中英

R:映射兩個列表的對象並返回數據幀列表

[英]R: mapply over objects of two lists and return a list of data frames

我有兩個GRange列表,我試圖將countOverlaps函數應用於列表的每個組合,並返回如下結果列表:

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)

我想在grlA中獲得對象“ a”和對象“ b”的列表,其中包含針對grlB的每個值的函數結果:

(列出$ a,$ b和c,d的數據框)

$ c

b

$ d

b

這樣可以獲取列表的所有組合:

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的另一種方法我可以做到這一點? 謝謝!

此數據不應采用列表結構,因為它具有可預測且一致的結構。 我將其放入數據框,然后將其成形為大致與所需格式相同的格式。

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(.) )

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM