R: выберите элементы из списка на основе значений в векторе с одинаковыми именами

#r #list #vector

Вопрос:

[Вероятно, у этого вопроса уже есть ответ здесь, но мне не удалось его найти, также потому, что мне трудно сформулировать его кратко. Предложения по переформулировке названия вопроса приветствуются.]

У меня есть

  • список матриц с разным количеством строк,
  • вектор целочисленных значений с теми же именами, что и в списке,
  • список имен, которые отображаются в списке и векторе выше,
  • целочисленная переменная, указывающая, какой столбец выбрать из этих матриц.

Давайте построим, в качестве рабочего примера:

 mynames <- c('a', 'c')

mylist <- list(a=matrix(1:4,2,2), b=matrix(1:6,3,2), c=matrix(1:8,4,2))

myvec <- 2:4
names(myvec) <- names(mylist)

chooseCol <- 2
 

Я хотел бы построить вектор , содержащий в качестве элементов строки, взятые из myvec столбца и столбца chooseCol , для имен, появляющихся внутри mynames . Моя попытка заключается в

 sapply(mynames, function(elem){mylist[[elem]][myvec[elem], chooseCol]})
 

что правильно дает

 a c 
4 8 
 

но мне было интересно, есть ли более быстрый base (не tidyverse ) способ сделать это.

Также важно или актуально: порядок имен в mylist и myvec может быть разным, поэтому я не могу полагаться на индексы позиций.

Ответ №1:

Я бы использовал mapply

 mapply(function(x, y) x[y, chooseCol], mylist[mynames], myvec[mynames])

#a c 
#4 8 
 

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

1. Хороший @Ronak, поддержан. Значит ли mapply это, что как-то так работает purrr::map2_df ?

2. Спасибо, это более элегантно. Это кажется немного, просто немного медленнее, чем sapply .

3. @AnilGoyal Это зависит от того, что мы возвращаем из функции, в этом случае я бы сказал, что это похоже на map2_dbl то, что я имею в виду purrr::map2_dbl(mylist[mynames], myvec[mynames], ~.x[.y, chooseCol])

4. @pglpm Вы тестировали его на более крупной выборке? Насколько велики ваши данные?

5. @RonakShah На данный момент я просто повторил время звонка 1e6 ниже system.time . Но разница составляет всего несколько десятых долей секунды. Я применю это к реальному делу и сообщу вам о сроках.