我正在尝试将列表中包含的向量乘以另一个列表中的另一个向量。
每个列表的元素大小不同。
要相乘的列表是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]])
这些都不是很有效,而double-for循环是我想要避免的事情。
我也尝试过将unlist()
放在运气不佳的地方。
以下是Concat_list
第一个元素在for循环中的预期输出:
# 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]]
谢谢
答案 0 :(得分:0)
这是您想要的吗?
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
太复杂了。也许您可以将其简化为10x2矩阵列表。