代码之家  ›  专栏  ›  技术社区  ›  user3115933

如何修改我现有的R代码,使输出仅限于此特定条件?

  •  2
  • user3115933  · 技术社区  · 5 年前

    我正在使用 R RStudio list :

    list1 <- c(1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,20)
    

    我想从这个输出3个数字的所有组合(不替换) 列表 那会 sum

    我正在考虑使用 RcppAlgos library 在里面 R

    list1 <- c(1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,20)
    uni <- unique(list1)
    myRep <- rle(list1)$lengths
    ans <- 50
    
    library(RcppAlgos)
    lapply(seq_along(uni), function(x) {
        comboGeneral(uni, x, freqs = myRep,
                     constraintFun = "sum",
                     comparisonFun = "==",
                     limitConstraints = ans)
    })
    

    如果我运行这段代码,它将输出总和为50的所有组合。

    如何将输出限制为只有3个数字的组合?

    我还希望输出显示所有结果,而不是给我一个“最大到达”消息。

    注意:如果有其他软件包,我愿意使用。

    2 回复  |  直到 5 年前
        1
  •  1
  •   akrun    5 年前

    lapply(seq_along(uni) 在“uni”序列中循环,这将转到“m”参数(即要选择的元素数)。在第一种情况下,它执行1,然后执行2,依此类推。在我们的特殊情况下,只需要3个,我们不需要循环

    comboGeneral(uni, 3, freqs = myRep, constraintFun = "sum", 
          comparisonFun = "==", limitConstraints = ans)
    
        2
  •  1
  •   TinglTanglBob    5 年前

    你可以试试这个:)

    list1 <- c(1,2,3,4,5,6,8,9,10,11,12,13,14,15,16,17,18,19,20)
    
    # combn generates all possible combinations when selecting 3 items from list1
    combs = combn(list1, 3)
    
    # select all combs which sum up to 50 (just transposed the matrix to have the combinations rowwise)
    t(combs[,colSums(combs) == 50])
    # check if we got the right combinations
    rowSums(t(combs[,colSums(combs) == 50]))
    

    若您需要加快速度,可以在执行此操作之前从列表中删除一些值。可能导致总数为50的最小数字是11(因为列表中最大的两个值是20和19)。因此,您可以在之前删除1到10个。