使用 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
,您可以使用索引对 l1
和 l2
进行子集化。
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
我有两个列表,每个列表都有很多矩阵。为简洁起见,这里有一个每个列表有两个矩阵的示例:
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
,您可以使用索引对 l1
和 l2
进行子集化。
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