生成所有可能的方法将N个人分成可变大小的组

时间:2017-08-13 07:27:05

标签: r combinations

我正在尝试创建一个列表,列出将n个人分成可变大小的组的所有可能方法。例如,假设我有3个人,有5种可能的方法将它们分开:

  1. 一组3人[(1 + 2 + 3)]
  2. 2组(有3种可能的组合):[(1 + 2,3),(1 + 3,2),(2 + 3,1)]
  3. 每个人进入自己的群体[(1),(2),(3)]
  4. 我已经编写了一个代码来确定如何拆分组:

    inds<-1:3
    
    out<-list()
    out[[1]]<-matrix(rep(1,length(inds)),nrow=length(inds))
    for(i in 1:length(inds)) {
    eg <- expand.grid(rep(list(inds), i))
    out[[i]]<-unique(t(apply(unique(as.matrix(eg[which(rowSums(eg)==length(inds)),])),1,sort)))
    }
    out
    

    会产生一个组号和大小列表:

    [[1]]
         [,1]
    [1,]    3
    
    [[2]]
      [,1] [,2]
    2    1    2
    
    [[3]]
      Var1 Var2 Var3
    1    1    1    1
    

    但我不确定如何在这些潜在的分裂中生成每个组合。 理想情况下,我想要一个输出,显示个人可能分裂的所有可能方式:

    Option  Group Individuals
      1      1     1,2,3
      2      1     1,2
      2      2     3
      3      1     1,3
      3      2     2
      4      1     2,3
      4      2     1
      5      1     1
      5      2     2
      5      3     3
    

    非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

使用combn可以解决大部分问题:

combinations <- function(group_size, N) {
  apply(combn(N, m = group_size), 2, paste0, collapse = ",")
}

all_combinations <- function(N) {
  lapply(seq_len(N), combinations, N = N)
}

all_combinations(3)
# [[1]]
# [1] "1" "2" "3"
# 
# [[2]]
# [1] "1,2" "1,3" "2,3"
# 
# [[3]]
# [1] "1,2,3"

all_combinations(4)
# [[1]]
# [1] "1" "2" "3" "4"
# 
# [[2]]
# [1] "1,2" "1,3" "1,4" "2,3" "2,4" "3,4"
# 
# [[3]]
# [1] "1,2,3" "1,2,4" "1,3,4" "2,3,4"
# 
# [[4]]
# [1] "1,2,3,4"