我有这样的列表
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]]有多长),但它们至少有一个条目。因此,将a和b转换为矩阵似乎不切实际。
我不确定这是否与问题相关,但也会出现这样的情况,即每个a[[i]]) (即2个)中的条目与a[[i]])中的条目一样多。
我在考虑do.call和mapply的某种组合,但无法使其工作。
发布于 2018-12-21 22:21:22
我们确实可以使用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, `*`)发布于 2018-12-21 22:14:49
因为您可以确保我们可以在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 -1https://stackoverflow.com/questions/53886093
复制相似问题