Изменение элемента в списке матриц

#r #list #for-loop #matrix

#r #Список #for-цикл #матрица

Вопрос:

Я сгенерировал список из 100 матриц для модели структурированной совокупности. Я хотел бы изменить элемент (1,3) каждой матрицы в списке, умножив их на последовательность из 100 чисел от 0,01 до 1. Цель состоит в том, чтобы строка 1, столбец 3 первой матрицы были умножены на 0,01, тот же элемент во второй матрице на 0,02 и так далее.

Спасибо

 Ls<-6.521
Pg<-.318
Sr<-0.5
Sn<-.432
Sj<-.564
Sa<-.501


AA<-lapply(1:100, 
          function(x) { 
                       matrix(c(0, 0, Sr * rnorm(1,Ls,.3886) * rnorm(1,Pg,.1466), 
                                rnorm(1,Sn,.0954),0,0, 0,rnorm(1,Sj,.0468), 
                                rnorm(1,Sa,.472)), 
                             nrow=3, ncol=3,byrow=TRUE))
  

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

1. Я попытался изменить приведенный выше код, чтобы включить последовательность в элемент [1,3] следующим образом: Sr * rnorm(1, Ls, .3886)* rnorm(1,Pg, .1466) * seq(0.01,1,0.01), но это просто приводит к умножению элемента на 0.01в каждой матрице в списке.

Ответ №1:

Я бы просто выполнил for цикл, простой и понятный:

 for(i in seq_along(AA)) {
  AA[[i]][1, 3] = AA[[i]][1, 3] * i / length(AA)
}
  

Ответ №2:

вы могли бы использовать map2 функцию из purrr пакета. Я определил списки только с двумя матрицами и двумя скалярами, но они должны работать и для вас.

 m <- list(m1 = matrix(1, 2, 3),
         m2 = matrix(2, 2, 3))
a <- list(a1 = 0.01, a2 = 0.02)

fun <- function(mymatrix, myx){
  mymatrix[1, 3] <- mymatrix[1, 3]* myx
  return(mymatrix)
} 

purrr::map2(m, a, fun)

$m1
     [,1] [,2] [,3]
[1,]    1    1 0.01
[2,]    1    1 1.00

$m2
     [,1] [,2] [,3]
[1,]    2    2 0.04
[2,]    2    2 2.00