首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将两个长度不规则的列表相乘

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

Stack Overflow用户
提问于 2018-12-21 22:03:42
回答 2查看 41关注 0票数 3

我有这样的列表

代码语言:javascript
复制
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 (实际上,我要大得多),所以对于所需的乘法,有正确数量的条目。

但是,目前还不清楚a[[i]])有多少个条目(在本例中,a[[1]]有3个条目,a[[2]]有2个条目,或者等价地说,b[[i]]有多长),但它们至少有一个条目。因此,将ab转换为矩阵似乎不切实际。

我不确定这是否与问题相关,但也会出现这样的情况,即每个a[[i]]) (即2个)中的条目与a[[i]])中的条目一样多。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-21 22:21:22

我们确实可以使用mapply (和Map,它与mapply相同,但使用SIMPLIFY = FALSE)。根据格式(@RonakShah答案中的矩阵或问题中的列表),您可以使用

代码语言:javascript
复制
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

代码语言:javascript
复制
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替代方案是

代码语言:javascript
复制
map2(a, b, map2, `*`)
票数 4
EN

Stack Overflow用户

发布于 2018-12-21 22:14:49

因为您可以确保我们可以在lapply中使用mapply

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53886093

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档