【问题标题】:multiply two lists of irregular length将两个不规则长度的列表相乘
【发布时间】:2018-12-21 14:03:42
【问题描述】:

我有类似的列表

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]])TRUE for i=1,2(实际上,i 更大),因此对于所需的乘法有正确数量的条目。

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

我不确定这与问题是否相关,但我们在每个 a[[i]]) 中的条目(即 2)与 a[[i]])s 中的条目一样多。

我在想do.callmapply 的某种组合,但无法实现。

【问题讨论】:

    标签: r list mapply do.call


    【解决方案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, `*`)
    

    【讨论】:

      【解决方案2】:

      既然,你可以确保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 - 考虑到各种选项,请允许我接受另一个。
      猜你喜欢
      • 2021-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-05
      相关资源
      最近更新 更多