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.
Nur um klarzustellen, wollen Sie 'Klasse (res)' zu sein, die 'Klasse (Grl)' sind? – zx8754
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
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