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

标签 r list mapply do.call

我有这样的列表

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.

我可以确定 length(a[[i]])==length(b[[i]]) 对于 i=1,2 是 TRUE (在实践中,i 更大),因此对于所需的乘法有正确数量的条目。

但是,不清楚 a[[i]]) 有多少个条目(在示例中,3 个用于 a[[1]] 和 2对于 a[[2]],或者等效地,b[[i]] 有多长),除了它们至少有一个条目。因此,将ab转化为矩阵似乎并不实用。

我不确定这是否与问题相关,但情况也是如此,我们在每个 a[[i]]) 中都有同样多的条目(即 2)因为我们有 a[[i]])s.

我在考虑 do.callmapply 的某种组合,但无法让它工作。

最佳答案

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

关于r - 将两个不规则长度的列表相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53886093/

相关文章:

python:使用元组重新排列列表的内容

javascript - jQuery:根据文本值对 <a> 链接进行分组

R 快速嵌套列表迭代

r - 基于另一个数据框在数据框中扩展行和添加列

r - 使用自定义函数命名由 `nest` (tidyr) 创建的列中的项目

r - 模拟相关伯努利数据

c++ - 未打印链表

r - 如何组合rapply()和mapply(),或者如何递归使用mapply/Map?

regex - 清理 R 中的字符串 : add punctuation w/o overwriting last character

r - Shiny:如何创建确认对话框