2016-07-06 13 views
3

Есть ли способ принудить простой объект, похожий на список, к объектам S4 «Список»? Мне нужно сделать некоторые векторизации на мои данные. По-видимому, я использовал вложенные функции в своих функциях, и я проверил его возвращаемый тип как «список». Я хочу «Список» как объекты. Как я могу это сделать? Благодарю.Любой способ принудительного «перечислить» на S4 «Список»?

Вот воспроизводимый пример для выяснения вопроса:

данных

foo <- GRanges(
     seqnames=Rle(c("chr1", "chr2", "chr3", "chr4"), c(3, 2, 1, 2)), 
     ranges=IRanges(seq(1, by=9, len=8), seq(7, by=9, len=8)), 
     rangeName=letters[seq(1:8)], score=sample(1:20, 8, replace = FALSE)) 

    bar <- GRanges(
     seqnames=Rle(c("chr1", "chr2", "chr3","chr4"), c(4, 3, 1, 1)), 
     ranges=IRanges(seq(2, by=5, len=9), seq(4, by=5, len=9)), 
     rangeName=letters[seq(1:9)], score=sample(1:20, 9, replace = FALSE)) 

    moo <- GRanges(
     seqnames=Rle(c("chr1", "chr2", "chr3","chr4"), c(3, 4, 2,1)), 
     ranges=IRanges(seq(5, by=7, len=10), seq(8, by=7, len=10)), 
     rangeName=letters[seq(1:10)], score=sample(1:20, 10, replace = FALSE)) 

Перекрытия хита-индексного

grl <- GRangesList(bar, moo) 
    res <- lapply(grl, function(ele_) { 
     tmp <- as(findOverlaps(foo, ele_), "List") 
     }) 

объяснения дублированных областей (первый элемент списка соответствует бару):

[[1]] 
IntegerList of length 8 
[[1]] 1 2 # 1st regions from foo overlapped with 1st,2nd regions from bar 
[[2]] 3 
[[3]] 4 
[[4]] 6 7 # 1st regions from foo overlapped with 6st,7th regions from bar 

цель только сохранить один (он же, удалить несколько пересекающиеся регионы), такие как:

[[1]] 
IntegerList of length 8 
[[1]] 2 # only keep 2nd region from bar 
[[2]] 3 
[[3]] 4 
[[4]] 6 7 # only keep 6th region from bar 

Удалить дубликаты регионов

obj.ov <- lapply(res, function(ele_) { 
    re <- lapply(grl, function(obj) { 
    id0 <- as(which.max(extractList(obj$score, ele_)), "List") 
    id0 <- id0[!is.na(id0)] 
    }) 
    re <- re[!duplicated(re)] 
}) 

Дальнейшие шаги

as.obj.ov <- as(obj.ov, "List") # если это принуждение не является правильным, не могут быть расширены, например, obj.ov

затем as.obj.ov должен быть расширяемым, например obj.ov как вектор индекса указателя, также тип должен быть объектом S4 «Список».

мне нужно позволить obj.ov, как S4 "Список" объектов. Возможно ли такое принуждение в R?

Оценивается любой возможный подход, решение или идея.

+1

Чтобы уточнить, вы хотите, чтобы 'class (res)' был таким же, как 'class (grl)'? – zx8754

+0

Извините, я обновил свой пост, добавив свой желаемый шаг. class (as.obj.ov) должен быть S4 «List» и может расширяться, как obj.ov, как вектор индекса нажатия. Основная причина, по которой я нуждаюсь в этом принуждении, заключается в том, чтобы расширять as.obj.ov как объекты GRanges, вызвав методы extractList из пакетов S4Vector. Чтобы расширить, я должен принудить «список» к S4 «List». – datageek

+1

Можете ли вы объяснить словами, чего вы пытаетесь достичь? У вас есть 2 диапазона (bar, moo), затем вы хотите найти перекрытие этих регионов с 1 областью (moo), а затем удалить дубликаты (кстати, я не понимаю, что значит «дублировать»). Затем мы хотим использовать 'extractList', почему? Может быть, также добавить ожидаемый результат? – zx8754

ответ

4

Мы можем использовать select = "first", чтобы получить первое совпадение.

lapply(grl, function(ele_) { 
    ix <- findOverlaps(foo, ele_, select = "first") 
    ele_[ix[!is.na(ix)]] 
}) 

[[1]] 
GRanges object with 4 ranges and 2 metadata columns: 
     seqnames ranges strand | rangeName  score 
     <Rle> <IRanges> <Rle> | <character> <integer> 
    [1]  chr1 [ 2, 4]  * |   a  18 
    [2]  chr1 [12, 14]  * |   c   2 
    [3]  chr1 [17, 19]  * |   d  19 
    [4]  chr2 [27, 29]  * |   f  15 
    ------- 
    seqinfo: 4 sequences from an unspecified genome; no seqlengths 

[[2]] 
GRanges object with 6 ranges and 2 metadata columns: 
     seqnames ranges strand | rangeName  score 
     <Rle> <IRanges> <Rle> | <character> <integer> 
    [1]  chr1 [ 5, 8]  * |   a  11 
    [2]  chr1 [12, 15]  * |   b  13 
    [3]  chr1 [19, 22]  * |   c  14 
    [4]  chr2 [26, 29]  * |   d  20 
    [5]  chr2 [40, 43]  * |   f   8 
    [6]  chr4 [68, 71]  * |   j   1 
    ------- 
    seqinfo: 4 sequences from an unspecified genome; no seqlength