【问题标题】:All possible ways to split n over k groups - R将 n 分成 k 组的所有可能方法 - R
【发布时间】:2016-09-11 10:15:08
【问题描述】:

我陷入了一个数学问题。我想制作一个函数,输出整数“n”可以分为“k”组的所有方式,使得每个组中的“k”至少为 1(k >= 1)。

函数可能类似于:

n_ways <- function(n,k) {...}

我想要一个 dataFrame 作为输出。所以对于:n_ways(5,3)

     A  B  C
1    3  1  1
2    1  3  1
3    1  1  3
4    2  2  1
5    2  1  2
6    1  2  2

解决方案在 dataFrame 中呈现的顺序并不重要。

我寻找像 here 和其他语言的解决方案,如 herehere。不幸的是,在此基础上制作适合我的问题的功能并不是那么好,但希望你是。

提前非常感谢!

【问题讨论】:

    标签: r math combinations


    【解决方案1】:

    您可以使用partitions 包:

    library(partitions)
    t(compositions(5, 3, FALSE))
    #[1,] 3 1 1
    #[2,] 2 2 1
    #[3,] 1 3 1
    #[4,] 2 1 2
    #[5,] 1 2 2
    #[6,] 1 1 3
    

    来自相应的帮助文件

    函数 composition() 返回所有 2^(n-1) 种划分整数的方式;因此 4 + 1 + 1 不同于 1 + 4 + 1 或 1 + 1 + 4。

    【讨论】:

    • 非常感谢。干净又容易。一次又一次地玩得开心。谢谢!!!
    【解决方案2】:

    两种可能:

    eg <- expand.grid(rep(list(1:5), 3))
    unique(eg[which(rowSums(eg)==5),])
    

    导致:

       Var1 Var2 Var3
    3     3    1    1
    7     2    2    1
    11    1    3    1
    27    2    1    2
    31    1    2    2
    51    1    1    3
    

    或使用combinat(但此示例无需替换)

    library(combinat)
    combn(5, 3)
    #      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
    # [1,]    1    1    1    1    1    1    2    2    2     3
    # [2,]    2    2    2    3    3    4    3    3    4     4
    # [3,]    3    4    5    4    5    5    4    5    5     5
    

    【讨论】:

    • combn 已经存在于基础 R 中。不需要combinat。另外,不确定OP是否想要这个。考虑到他们想要的输出,在我看来,他们想要 k 个总和为 n 的整数。
    • 感谢@csgillespie 的快速响应,但我无法让您的输出与我想要的输出相匹配。对于 n_ways(5,3) (或其他函数),应该只有 6 个可能的答案。
    【解决方案3】:

    这是我的解决方案, 它不是很快,但它可以作为您提高速度的起点。

    n_ways <- function(n, k){
    
        addend <- rep(seq(1,n),k)
    
        combinations <- combn(x = addend, m = k)
    
        combinations <- t(combinations[,which(colSums(combinations) == n)])
    
        return(unique(combinations))
    }
    
    n_ways(5,3)
    
    #     [,1] [,2] [,3]
    #[1,]    1    2    2
    #[2,]    1    3    1
    #[3,]    1    1    3
    #[4,]    2    1    2
    #[5,]    2    2    1
    #[6,]    3    1    1
    

    如果你有兴趣,我可以为函数写一些 cmets,但它由 R 基函数组成,如 colSumscombn

    【讨论】:

    • 感谢您的努力。它就像我问的那样工作,我可以看到实际发生了什么:) 谢谢,祝你有美好的一天!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    相关资源
    最近更新 更多