0

2 つの 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)

grlB の各値に対する関数の結果を含む、grlA のオブジェクト "a" とオブジェクト "b" のリストを取得したいと思います。

(c、dの$a、$b、およびデータフレームをリストします)

$c

ab

$日

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="_")

しかし、必要なもの(データフレームのリスト)を取得するには、grlBの一部であるデータフレームを選択して別のリストに保存するgrepコマンドが必要ですが、これは非常に遅いです...

new=list()
for (i in names(grlB)) {
df = as.data.frame(t[grep(i,names(t))])
new[[length(new)+1]] <- df
}

おそらくgrepなしでこれを行うことができる別の方法はありますか? ありがとうございました!

4

1 に答える 1

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(.) )
于 2015-10-21T20:57:02.803 に答える