两个长度不规则的列表相乘

3

我有类似以下的列表

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(实际上i要大得多),length(a[[i]])==length(b[[i]])TRUE,因此所需的乘法有正确数量的条目。
但是,不清楚a[[i]]有多少个条目(在示例中,a[[1]]有3个条目,a[[2]]有2个条目,或等效地,b[[i]]有多长),除了它们至少有一个条目。因此,将ab转换为矩阵似乎并不实用。
我不确定这与问题有关,但每个a[[i]]中都有与a[[i]]相同数量的条目(即2)。
我考虑使用do.callmapply的某种组合,但无法使其正常工作。
2个回答

4

我们确实可以使用 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, `*`)

1

既然你可以确保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

谢谢,+1 - 允许我接受其他给定的选项。 - Christoph Hanck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接