我正在尝试创建一个列表,列出将n个人分成可变大小的组的所有可能方法。例如,假设我有3个人,有5种可能的方法将它们分开:
我已经编写了一个代码来确定如何拆分组:
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
非常感谢任何帮助!
答案 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"