2016-07-06 35 views
3

Gibt es eine Möglichkeit, ein einfaches listenähnliches Objekt zu S4 "List" -Objekten zu zwingen? Ich muss meine Daten vektorisieren. Anscheinend habe ich Nested-Lapply für meine Funktionen verwendet, und ich habe den Rückgabetyp als "Liste" überprüft. Ich möchte Objekte wie Objekte auflisten. Wie kann ich das machen? Vielen Dank.Beliebige "Liste" zu S4 "Liste" erzwingen?

Hier ist die reproduzierbare Beispiel die Frage zu klären:

Daten

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

Overlap hit-Index

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

Erklärung für duplizierten Regionen (erste Listenelement entspricht bar):

[[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 
nur 363.210

Ziel halten ein (aka, entfernen Sie mehrere Regionen durchschnitten), wie zum Beispiel:

[[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 

Entfernen dupliziert Regionen

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)] 
}) 

Weitere Schritte

as.obj.ov <- as(obj.ov, "List") # wenn dieser Zwang ist nicht richtig, kann nicht erweiterbar sein wie obj.ov

dann, as.obj.ov muss erweiterbar sein wie obj.ov als Treffer-Index-Vektor, auch Typ muss S4 "List" -Objekt sein.

Ich brauche obj.ov als S4 "Liste" Objekte. Ist es möglich, einen solchen Zwang in R zu machen?

Jede mögliche Annäherung, Lösung oder Idee wird geschätzt.

+1

Nur um klarzustellen, wollen Sie 'Klasse (res)' zu sein, die 'Klasse (Grl)' sind? – zx8754

+0

Entschuldigung, ich habe meinen Post mit meinem gewünschten Schritt aktualisiert. class (as.obj.ov) muss S4 "List" sein und kann wie obj.ov als Treffer-Index-Vektor erweitert werden. Der Hauptgrund, warum ich diesen Zwang benötige, besteht darin, as.obj.ov als GRanges-Objekte zu erweitern, indem ich extractList-Methoden aus S4Vector-Paketen aufruft. Um zu erweitern, muss ich "List" zu S4 "List" zwingen. – datageek

+1

Können Sie mit Worten erklären, was Sie erreichen möchten? Sie haben 2 Bereiche (Balken, MOO), wollen dann Überlappungen dieser Bereiche mit 1 Bereich (MOO) finden, dann entfernen Sie die Duplikate (übrigens verstehe ich nicht, was mit "Duplizieren" gemeint ist.) Dann wollen wir verwenden 'extractList', warum? Vielleicht auch die erwartete Ausgabe hinzufügen? – zx8754

Antwort

4

Wir können select = "first" verwenden, um erste Übereinstimmung zu erhalten.

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