你可以尝试使用基本的R语言来定义一个自定义函数,就像下面这样
f <- function(v, grpsz) {
p <- combn(v, grpsz)
lst <- asplit(p[, p[1, ] == min(p[1, ])], 2)
cnt <- 1
repeat {
if (cnt == length(v) / grpsz) {
return(lst)
}
lst <- unlist(lapply(lst, \(x) {
p <- combn(v[!v %in% x], grpsz)
Map(
cbind,
list(x),
asplit(
p[, p[1, ] == min(p[1, ]), drop = FALSE],
2
)
)
}), recursive = FALSE)
cnt <- cnt + 1
}
}
这样我们可以得到一个矩阵列表的结果(每列表示一个组),例如。
> f(1:6, 2)
[[1]]
[,1] [,2] [,3]
[1,] 1 3 5
[2,] 2 4 6
[[2]]
[,1] [,2] [,3]
[1,] 1 3 4
[2,] 2 5 6
[[3]]
[,1] [,2] [,3]
[1,] 1 3 4
[2,] 2 6 5
[[4]]
[,1] [,2] [,3]
[1,] 1 2 5
[2,] 3 4 6
[[5]]
[,1] [,2] [,3]
[1,] 1 2 4
[2,] 3 5 6
[[6]]
[,1] [,2] [,3]
[1,] 1 2 4
[2,] 3 6 5
[[7]]
[,1] [,2] [,3]
[1,] 1 2 5
[2,] 4 3 6
[[8]]
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 5 6
[[9]]
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 4 6 5
[[10]]
[,1] [,2] [,3]
[1,] 1 2 4
[2,] 5 3 6
[[11]]
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 5 4 6
[[12]]
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 5 6 4
[[13]]
[,1] [,2] [,3]
[1,] 1 2 4
[2,] 6 3 5
[[14]]
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 6 4 5
[[15]]
[,1] [,2] [,3]
[1,] 1 2 3
[2,] 6 5 4
> f(1:6, 3)
[[1]]
[,1] [,2]
[1,] 1 4
[2,] 2 5
[3,] 3 6
[[2]]
[,1] [,2]
[1,] 1 3
[2,] 2 5
[3,] 4 6
[[3]]
[,1] [,2]
[1,] 1 3
[2,] 2 4
[3,] 5 6
[[4]]
[,1] [,2]
[1,] 1 3
[2,] 2 4
[3,] 6 5
[[5]]
[,1] [,2]
[1,] 1 2
[2,] 3 5
[3,] 4 6
[[6]]
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 5 6
[[7]]
[,1] [,2]
[1,] 1 2
[2,] 3 4
[3,] 6 5
[[8]]
[,1] [,2]
[1,] 1 2
[2,] 4 3
[3,] 5 6
[[9]]
[,1] [,2]
[1,] 1 2
[2,] 4 3
[3,] 6 5
[[10]]
[,1] [,2]
[1,] 1 2
[2,] 5 3
[3,] 6 4