Преобразовать список в матрицу, используя вектор индикатора - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть следующий список 5x2 матриц:

l <- list(a=matrix(rnorm(10),nrow=5,ncol=2),
          b=matrix(rnorm(10),nrow=5,ncol=2),
          c=matrix(rnorm(10),nrow=5,ncol=2))

Например, первый элемент этого списка выглядит так:

$a
           [,1]       [,2]
[1,] -0.4988268  1.9881333
[2,] -0.2979064  1.5921169
[3,] -1.3783522 -1.4149601
[4,]  0.2205115  0.2029210
[5,]  1.2721645  0.2861253

Я хочу взять этоперечислите и создайте новую матрицу 5x2, используя информацию из вектора v:

v <- c("a","a","b","c","b")

Этот вектор является вектором-индикатором, который содержит информацию о том, как должна быть построена эта новая матрица.То есть, взять строку 1 из элемента списка a, взять строку 2 из элемента списка a и т. Д.

Можно сделать это через for -loop, однако для моего приложения этонедостаточно эффективен, и я чувствую, что может быть более элегантное решение.Мой подход:

goal <- matrix(nrow=5,ncol=2)
for(i in 1:length(v)){

  goal[i,] <- l[[v[i]]][i,]

}

goal
           [,1]       [,2]
[1,] -0.4988268 1.98813326
[2,] -0.2979064 1.59211686
[3,]  0.7715907 0.16776669
[4,]  0.2690278 0.02542766
[5,]  1.7865093 0.46361239

Спасибо!

1 Ответ

0 голосов
/ 26 ноября 2018

Предполагая, что все матрицы списка имеют одинаковое количество строк, мы могли бы использовать mapply и подмножество матриц по имени (v) и номеру строки.

t(mapply(function(x, y) l[[x]][y, ], v, 1:nrow(l[[1]])))

#        [,1]       [,2]
#a -1.2070657  0.5060559
#a  0.2774292 -0.5747400
#b -0.7762539 -0.9111954
#c  0.4595894 -0.0151383
#b  0.9594941  2.4158352

data

set.seed(1234)
l <- list(a=matrix(rnorm(10),nrow=5,ncol=2),
          b=matrix(rnorm(10),nrow=5,ncol=2),
          c=matrix(rnorm(10),nrow=5,ncol=2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...