【问题标题】:Finding A List of All Combinations of 6 Numbers That Add up to 10查找 6 个数字加起来为 10 的所有组合的列表
【发布时间】:2019-10-14 20:53:26
【问题描述】:

所以我之前看到过类似版本的这个问题 (Getting all combinations which sum up to 100 using R),但我正在努力寻找一种方法来弄清楚我需要专门运行什么。我正在尝试在 R 中创建一个列表,其中包含 6 个数字的所有不同组合,加起来为 10。但是,我想在行中包含 0 和相同 # 的重复。所以它看起来像这样:

10 0 0 0 0 0 9 1 0 0 0 0 8 2 0 0 0 0 我试过运行以下命令:

C = t(restrictedparts(10,6, include.zero=TRUE))
ComboSet<-data.frame(do.call(rbind, lapply(1:nrow(C),function(i) getall(iterpc(table(C[i,]), order=T)))))

但是,当我这样做时,它似乎不包括其中包含 0 的变体。我尝试将 include.zero=TRUE 函数输入到我正在运行的不同部分,但到目前为止我还没有运气。有什么建议?

【问题讨论】:

    标签: r combinations permutation integer-partition iterpc


    【解决方案1】:

    这是一个很好的问题,但答案不是很明显。

    这里有很多事情要解决。对于初学者,请确保包含 您在示例中使用的库。我从经验中知道您正在使用partitionsiterpc。从partitions 文档中,我们看到有一个函数可以准确地返回您正在寻找的内容,而无需任何额外的步骤。生成Integer Compositions的是compositions函数。

    myComps <- t(as.matrix(compositions(10, 6)))
    head(myComps)
         [,1] [,2] [,3] [,4] [,5] [,6]
    [1,]   10    0    0    0    0    0
    [2,]    9    1    0    0    0    0
    [3,]    8    2    0    0    0    0
    [4,]    7    3    0    0    0    0
    [5,]    6    4    0    0    0    0
    [6,]    5    5    0    0    0    0
    
    dim(myComps)
    [1] 3003    6
    
    all(rowSums(myComps) == 10)
    [1] TRUE
    

    至于修复您的实际代码,我不确定为什么您的代码不能按原样运行。我过去使用过iterpc,并记得明确地使用了相同的方法。无论如何,解决方法是显式声明 labels 参数,因为使用的是每个元素的频率而不是值本身。

    ## The 1's should be 0's and the 2's should be 10's
    ComboSet[1:6, ]
    X1 X2 X3 X4 X5 X6
    1  1  1  1  1  1  2
    2  1  1  1  1  2  1
    3  1  1  1  2  1  1
    4  1  1  2  1  1  1
    5  1  2  1  1  1  1
    6  2  1  1  1  1  1
    
    ## OP's original code
    ComboSet<-data.frame(do.call(rbind, lapply(1:nrow(C),function(i) getall(iterpc(table(C[i,]), order=T)))))
    
    all(rowSums(ComboSet) == 10)
    [1] FALSE
    
    table(rowSums(ComboSet))
    
    7   8   9  10  11  12  13  14  15  16 
    12  30 150 255 186 690 420 420 180 660
    
    ## Here is the fix with labels explicitly declared
    ComboSetFix <- data.frame(do.call(rbind, lapply(1:nrow(C), function(i) {
        getall(iterpc(table(C[i,]), labels = as.integer(names(table(C[i,]))), order=T))
    })))
    
    all(rowSums(ComboSetFix) == 10)
    [1] TRUE
    
    dim(ComboSetFix)
    [1] 3003    6
    

    您应该知道iterpc 没有得到积极维护,鼓励用户切换到arrangements。它有一个不同的界面,所以你不能简单地将“iterpc”这个词替换为“arrangements”。

    【讨论】:

    • 谢谢约瑟夫!抱歉,您可以告诉我,我是使用此网站的新手,所以对于没有正确设置我的问题,我深表歉意。使用合成功能正是我所需要的,并且使这变得更加容易。再次感谢!
    • @lordseal92 ,不用担心...希望我的回答对您有所帮助。就像我说的,你的问题非常好,我希望我没有过激,因为那不是我的本意。
    猜你喜欢
    • 2022-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多