使用 lapply 乘以 R 中的两个矩阵列表

Use lapply to multiply two lists of matrices in R

我有两个列表,每个列表都有很多矩阵。为简洁起见,这里有一个每个列表有两个矩阵的示例:

l1 <- list(matrix(1:20, nrow=2),
           matrix(21:40, nrow=2))

l2 <- list(matrix(41:60, nrow=2),
           matrix(61:80, nrow=2))

我正在尝试使用 lapply 来 (a) 删除每个矩阵的第一列,然后 (b) 将 l1 中的每个矩阵与 l2 中的相应矩阵相乘.

首先,我试过:

result <- lapply(l1, function(x,y){
  
  tmp <- x[,-1]*y[,-1]
  return(tmp)
  
}, y=l2)

没用。问题是我无法通过这种方式从 l2 中删除第一列。如果 l2 是向量而不是列表,则代码将适用于 tmp <- x[,-1]*y[-1]。但即使我尝试简单地将每个列表中的矩阵相乘,它仍然不起作用:

result <- lapply(l1, function(x,y){
  
  tmp <- x*y
  return(tmp)
  
}, y=l2)

有什么想法吗?

lapply中,您只能迭代一个对象。你可以在这里使用 Map -

Map(function(x, y)  x[,-1]*y[,-1], l1, l2)

#[[1]]
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
#[1,]  129  225  329  441  561  689  825  969 1121
#[2,]  176  276  384  500  624  756  896 1044 1200

#[[2]]
#     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
#[1,] 1449 1625 1809 2001 2201 2409 2625 2849 3081
#[2,] 1536 1716 1904 2100 2304 2516 2736 2964 3200

要使用 lapply,您可以使用索引对 l1l2 进行子集化。

lapply(seq_along(l1), function(x) l1[[x]][, -1] * l2[[x]][, -1])

使用map2

library(purrr)
map2(l1, l2, ~ .x[, -1] * .y[,-1])
[[1]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,]  129  225  329  441  561  689  825  969 1121
[2,]  176  276  384  500  624  756  896 1044 1200

[[2]]
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 1449 1625 1809 2001 2201 2409 2625 2849 3081
[2,] 1536 1716 1904 2100 2304 2516 2736 2964 3200