Есть ли способ более элегантно извлечь именованный список целых чисел из вложенного списка?

#r #list #extraction #iranges

#r #Список #извлечь #iranges

Вопрос:

У меня есть список индексов позиций в списке целых чисел, и я намеревался отфильтровать их по заданному порогу, и это работает хорошо. Тем не менее, я хочу извлечь один из определенного отфильтрованного набора для каждого списка целых чисел для дальнейшего использования. Я знаю, что myList — это вложенный список, и данные в значительной степени моделируются на основе реального набора данных. Есть ли какой-либо способ легко и элегантно извлечь требуемый список целых чисел? Как я могу сделать так, чтобы это извлечение произошло?

Для запуска мини-примера необходима следующая библиотека:

 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. Не могли бы вы точно объяснить, что вы подразумеваете под «более элегантным»?

2. Я просто не понимаю, говорите ли вы о результатах, коде или форматировании вывода

3. Спасибо за быстрый ответ. У меня есть решение 🙂

Ответ №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])
  

Комментарии:

1. Это замечательное решение. Я отдаю должное разработчику пакетов purrr. Большое вам спасибо 🙂

2. Добро пожаловать! Хотя на самом деле это просто то, что вы делали. Код немного компактнее. У вас было прекрасное рабочее решение.