将两个不规则长度的列表相乘
multiply two lists of irregular length
我有这样的列表
a <- list(list(c(-2,1), 4:5, 2:3), list(c(0,2), c(-1,1)))
b <- list(7:9, c(5,-1))
> a
[[1]]
[[1]][[1]]
[1] -2 1
[[1]][[2]]
[1] 4 5
[[1]][[3]]
[1] 2 3
[[2]]
[[2]][[1]]
[1] 0 2
[[2]][[2]]
[1] -1 1
> b
[[1]]
[1] 7 8 9
[[2]]
[1] 5 -1
我想将 a[[1]
中的每个 (-2, 1) 与 b[[1]]
中的 7 相乘得到 (-14, 7),每个 (4, 5) 与 8,每个 (2, 3) 有 9,然后每个 (0, 2) 有 5,最后每个 (-1, 1),有 -1.
我可以确定对于 i=1,2,length(a[[i]])==length(b[[i]])
是 TRUE
(实际上,i 大得多),因此对于所需的乘法有正确数量的条目.
但是,不清楚 a[[i]])
有多少条目(在示例中,a[[1]]
有 3 个条目,a[[2]]
有 2 个条目,或者等价地,b[[i]]
are), 除了他们至少有一个条目。因此,将 a
和 b
转化为矩阵似乎并不实用。
我不确定这是否与问题相关,但情况也是如此,我们在每个 a[[i]])
(即 2)中的条目数与 a[[i]])
s.
我正在考虑 do.call
和 mapply
的某种组合,但无法实现。
因为,你可以确保 length(a[[i]])==length(b[[i]])
我们可以在 lapply
中使用 mapply
lapply(seq_along(a), function(x) mapply("*", a[[x]], b[[x]]))
#[[1]]
# [,1] [,2] [,3]
#[1,] -14 32 18
#[2,] 7 40 27
#[[2]]
# [,1] [,2]
#[1,] 0 1
#[2,] 10 -1
我们确实可以使用 mapply
(和 Map
,它与 mapply
相同,但带有 SIMPLIFY = FALSE
)。根据格式(@RonakShah 的答案中的矩阵或问题中的列表),您可以使用
Map(mapply, a, b, MoreArgs = list(FUN = `*`))
# [[1]]
# [,1] [,2] [,3]
# [1,] -14 32 18
# [2,] 7 40 27
#
# [[2]]
# [,1] [,2]
# [1,] 0 1
# [2,] 10 -1
或
Map(Map, a, b, MoreArgs = list(f = `*`))
# [[1]]
# [[1]][[1]]
# [1] -14 7
#
# [[1]][[2]]
# [1] 32 40
#
# [[1]][[3]]
# [1] 18 27
#
#
#[[2]]
# [[2]][[1]]
# [1] 0 10
#
# [[2]][[2]]
# [1] 1 -1
后者的 tidyverse
替代方法是
map2(a, b, map2, `*`)
我有这样的列表
a <- list(list(c(-2,1), 4:5, 2:3), list(c(0,2), c(-1,1)))
b <- list(7:9, c(5,-1))
> a
[[1]]
[[1]][[1]]
[1] -2 1
[[1]][[2]]
[1] 4 5
[[1]][[3]]
[1] 2 3
[[2]]
[[2]][[1]]
[1] 0 2
[[2]][[2]]
[1] -1 1
> b
[[1]]
[1] 7 8 9
[[2]]
[1] 5 -1
我想将 a[[1]
中的每个 (-2, 1) 与 b[[1]]
中的 7 相乘得到 (-14, 7),每个 (4, 5) 与 8,每个 (2, 3) 有 9,然后每个 (0, 2) 有 5,最后每个 (-1, 1),有 -1.
我可以确定对于 i=1,2,length(a[[i]])==length(b[[i]])
是 TRUE
(实际上,i 大得多),因此对于所需的乘法有正确数量的条目.
但是,不清楚 a[[i]])
有多少条目(在示例中,a[[1]]
有 3 个条目,a[[2]]
有 2 个条目,或者等价地,b[[i]]
are), 除了他们至少有一个条目。因此,将 a
和 b
转化为矩阵似乎并不实用。
我不确定这是否与问题相关,但情况也是如此,我们在每个 a[[i]])
(即 2)中的条目数与 a[[i]])
s.
我正在考虑 do.call
和 mapply
的某种组合,但无法实现。
因为,你可以确保 length(a[[i]])==length(b[[i]])
我们可以在 lapply
mapply
lapply(seq_along(a), function(x) mapply("*", a[[x]], b[[x]]))
#[[1]]
# [,1] [,2] [,3]
#[1,] -14 32 18
#[2,] 7 40 27
#[[2]]
# [,1] [,2]
#[1,] 0 1
#[2,] 10 -1
我们确实可以使用 mapply
(和 Map
,它与 mapply
相同,但带有 SIMPLIFY = FALSE
)。根据格式(@RonakShah 的答案中的矩阵或问题中的列表),您可以使用
Map(mapply, a, b, MoreArgs = list(FUN = `*`))
# [[1]]
# [,1] [,2] [,3]
# [1,] -14 32 18
# [2,] 7 40 27
#
# [[2]]
# [,1] [,2]
# [1,] 0 1
# [2,] 10 -1
或
Map(Map, a, b, MoreArgs = list(f = `*`))
# [[1]]
# [[1]][[1]]
# [1] -14 7
#
# [[1]][[2]]
# [1] 32 40
#
# [[1]][[3]]
# [1] 18 27
#
#
#[[2]]
# [[2]][[1]]
# [1] 0 10
#
# [[2]][[2]]
# [1] 1 -1
后者的 tidyverse
替代方法是
map2(a, b, map2, `*`)