Любой способ извлечь из именованного IntegerList более элегантно из вложенного списка?
У меня есть список индекса позиции в IntegerList, и я намеревался фильтровать их по заданному порогу, и он работает хорошо. Однако я хочу извлечь один из определенных отфильтрованных наборов для каждого IntegerList для дальнейшего использования. Я знаю, что myList - это вложенный список, и данные очень моделируются на основе реального набора данных. Есть ли способ легко и просто найти нужный IntegerList? Как я могу сделать так, чтобы это произошло?
Для запуска мини-примера необходима следующая библиотека:
library(IRanges)
library(S4Vectors)
мини пример:
myList <- list(f1=IntegerList(1,2,3,4,1,1,1,integer(0),1,2,4),
f2=IntegerList(1,5,integer(0),integer(0),2,3,4,6,1,5,6),
f3=IntegerList(1,4,6,7,2,3,3,7,2,5,7))
len <- Reduce('+', lapply(myList, lengths))
keepMe <- len >= length(myList)
Я намеревался отфильтровать их следующим образом:
res.filt <- lapply(myList, function(elm) {
ans <- list(keep=elm[keepMe], droped=elm[!keepMe])
ans
})
мой грубый вывод:
Keep.list <- list(f1.kp=res.filt$f1$keep, f2.kp=res.filt$f2$keep, f3.kp=res.filt$f3$keep)
Drop.list <- list(f1.dp=res.filt$f1$droped, f2.dp=res.filt$f2$droped, f3.dp=res.filt$f3$droped)
Исходя из моего грубого вывода, Как я могу получить более элегантный вывод? любой эффективный способ достичь моего результата? Кто-нибудь может указать мне, как это сделать? Или любое предложение, как получить ожидаемый результат? заранее спасибо
1 ответ
Ваш мыслительный процесс / поток для фильтрации векторных списков логичен и довольно оптимален, но вы можете немного затянуть его, если используете purrr
:
library(purrr)
map(myList, lengths) %>%
reduce(`+`) %>%
map_lgl(`>=`, length(myList)) -> keep_me
keep_list <- map(myList, ~.[keep_me])
drop_list <- map(myList, ~.[!keep_me])