【问题标题】:Calculate the products of all the combinations in R计算R中所有组合的乘积
【发布时间】:2016-12-29 06:38:32
【问题描述】:

列表a如下:

a<-list(3:6,6:8,3:4,8)

> a
[[1]]
[1] 3 4 5 6

[[2]]
[1] 6 7 8

[[3]]
[1] 3 4

[[4]]
[1] 8

我的目标是计算每个对象中所有 2 元素组合的所有乘积。比如a中的第一个对象是3 4 5 6,那么第一个对象的所有乘积都是12 15 18 20 24 30,第二个对象的所有乘积都是42 48 56。但是当对象中只有一个元素时,输出应该是0。本来打算用Map(function(x) combn(x,2,prod),a)来解决这个问题,但是当对象只有一个元素的时候就不合适了(比如a中的第4个对象)。

> Map(function(x) combn(x,2,prod),a)
[[1]]
[1] 12 15 18 20 24 30

[[2]]
[1] 42 48 56

[[3]]
[1] 12

[[4]]
 [1]  2  3  4  5  6  7  8  6  8 10 12 14 16 12 15 18 21 24 20 24 28 32 30 35 40 42 48 56

那么当同时只有一个元素时,如何获得每个对象中所有组合的所有二元乘积并获得0?谢谢!

我的预期结果如下:

[[1]]
[1] 12 15 18 20 24 30

[[2]]
[1] 42 48 56

[[3]]
[1] 12

[[4]]
[1] 0 

【问题讨论】:

    标签: r list combinations


    【解决方案1】:

    使用您的方法并包装combn

    a<-list(3:6,6:8,3:4,8)
    combn2 <- function(x, ...) 
      if(length(x) == 1L) 0 else combn(x, ...)
    Map(function(x) combn2(x,2,prod),a)
    #[[1]]
    #[1] 12 15 18 20 24 30
    #
    #[[2]]
    #[1] 42 48 56
    #
    #[[3]]
    #[1] 12
    #
    #[[4]]
    #[1] 0
    

    【讨论】:

      【解决方案2】:

      我们可以尝试使用if/else 条件

      Map(function(x) if(length(x)==1) 0 else combn(x,2, FUN = prod),a)
      #[[1]]
      #[1] 12 15 18 20 24 30
      
      #[[2]]
      #[1] 42 48 56
      
      #[[3]]
      #[1] 12
      
      #[[4]]
      #[1] 0
      

      我认为@Roland 先回答了它(比我早 9 秒,虽然我没有看到他的回答),所以上面的一个变体是

      ifelse(lengths(a)==1, 0, Map(function(x) combn(x, 2, prod), a))
      

      lapply

      ifelse(lengths(a)==1, 0, lapply(a, function(x) combn(x, 2, FUN = prod)))
      

      【讨论】:

        猜你喜欢
        • 2014-08-05
        • 2016-03-22
        • 2019-01-21
        • 1970-01-01
        • 2019-11-19
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 1970-01-01
        相关资源
        最近更新 更多