Любой способ извлечь из именованного 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])
Другие вопросы по тегам