Как умножить векторы списков разного размера в R

#r #list #loops #vector #apply

#r #Список #циклы #вектор #применить

Вопрос:

Я пытаюсь умножить векторы, содержащиеся в списке, на другой вектор в другом списке.

Элементы каждого списка имеют разные размеры.

Умножаемыми списками являются Concat_list и List_3 :

 set.seed(10)
List_1 <- rep(list(matrix(runif(10), nrow = 10, ncol = 1)), 2)
List_2 <- rep(list(matrix(runif(10), nrow = 10, ncol = 1)), 2)
Concat_list <- lapply(seq(List_1), function(i) {
  matrix(mapply(c, List_1[[i]], List_2[[i]], SIMPLIFY = F) )  })
List_3 <- list(c(50, 25), c(10, 18))
  

Как мне умножить каждую строку каждого элемента Concat_list на соответствующий вектор List_3 ?

т.е.:

 Concat_list[[1]][[1]] * List_3[[1]]
Concat_list[[1]][[2]] * List_3[[1]]
Concat_list[[1]][[3]] * List_3[[1]]
# ...etc
Concat_list[[2]][[1]] * List_3[[2]]
Concat_list[[2]][[2]] * List_3[[2]]
# ...etc
  

Я пытался:

 lapply(seq(Concat_list), function(i){
  lapply(Concat_list[[i]], function(x){
  x[[i]] * List_3[[i]]
  }) 
})

lapply(seq(Concat_list), function(i){
  sapply(Concat_list[[i]], function(x){
    x[[i]] * List_3[[i]]
  })
})

Test <- lapply(seq(Concat_list), function(i) {
  matrix(mapply(function(x, y){x*y}, Concat_list[[i]], List_3[[i]], SIMPLIFY = F) )  })

Test_2 <- rep(list(matrix(nrow = nrow(Concat_list[[1]]), ncol = 1)) , length(Concat_list) )
for(i in seq(Concat_list)){
  for(j in seq(Concat_list[[i]])){
    Test_2[[i]][j] <- unlist(Concat_list[[i]][j]) * List_3[[i]]
  }
}

Map('*', Concat_list[[1]], List_3[[1]])
  

Ни один из этих способов не работает, и я пытаюсь избежать двойного цикла for.

Я также пытался поместить unlist() в разные места, но безуспешно.

Вот ожидаемый результат в цикле for для первого элемента Concat_list :

# Correct
for(i in 1:10){print(unlist(Concat_list[[1]][i]) * List_3[[1]])}

И то же самое, но более явно указано.

 c(0.5074782, 0.6516557) * List_3[[1]]
c(0.3067685, 0.5677378) * List_3[[1]]
c(0.4269077, 0.1135090) * List_3[[1]]
  

Спасибо

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

1. как предложено @mt1022 — возможно, было бы неплохо превратить этот список в матрицу перед вычислением, например. через: t(matrix(unlist(Concat_list), nrow = 2)) ; в противном случае отличный ответ от @mt1022

Ответ №1:

Это то, чего вы хотите:

 res <- Map(
    function(x, y){ as.matrix(lapply(x, function(i){ i * y })) },
    Concat_list, List_3)
  

вот часть окончательных результатов:

 > res[[1]][[1]]
[1] 25.37391 16.29139
> res[[1]][[2]]
[1] 15.33843 14.19344
> res[[2]][[1]]
[1]  5.074782 11.729802
> res[[2]][[2]]
[1]  3.067685 10.219280
  

На мой взгляд, ваш Concat_list слишком сложный. Возможно, вы можете упростить это до списка матриц 10×2.