#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
. Но разница составляет всего несколько десятых долей секунды. Я применю это к реальному делу и сообщу вам о сроках.