gpt4 book ai didi

r - 找到所有可能的方法将元素列表分成给定数量的相同大小的组

转载 作者:行者123 更新时间:2023-12-04 15:01:06 26 4
gpt4 key购买 nike

我有一个元素列表,我想要一个对象,它为我提供了将这些元素分成给定数量的相同大小的组的所有可能方法。

例如这里是我的 list :

MyElements <- c(1,2,3,4)

我想要将它们分成两组的所有可能组合:
nb.groups <- 2

例如,答案可能是那种:
[[1]]

[1] 1,2

[2] 3,4

[[2]]

[1] 1,3

[2] 2,4

[[3]]

[1] 2,3

[2] 1,4

我想避免这种重复:
[[1]]

[1] 1,2

[2] 3,4

[[2]]

[1] 3,4

[2] 1,2

非常感谢 !

谢谢你的回答。我想我应该向您提供有关我正在努力实现的目标的更多信息。

列表(或向量,因为显然 MyElements 是向量)实际上是个人的 ID 号。我想要一个所有可能的方法的列表,将这些人分成所需数量的组,这些组都具有相同的大小。

如果我没记错的话,目前唯一有效的解决方案是来自 Juba 的所谓的蛮力和肮脏的解决方案。但正如朱巴所说,它很快(对我来说太快了!)无法使用。

再次感谢

最佳答案

遵循递归逻辑允许您无需重复计算所有组合,也无需先计算所有组合。只要选择(nx-1,ning-1)返回一个整数,它就可以很好地工作。如果没有,计算可能性就有点可笑了。

这是一个递归过程,因此可能需要很长时间,并且当您的向量超过某个限制时会导致内存问题。但话又说回来,将一组 14 个元素分成 7 组已经给出了 135135 种独特的可能性。在这些事情中事情很快就会失控。

伪事物中的逻辑(不会称之为伪代码)

nb = number of groups
ning = number of elements in every group
if(nb == 2)
1. take first element, and add it to every possible
combination of ning-1 elements of x[-1]
2. make the difference for each group defined in step 1 and x
to get the related second group
3. combine the groups from step 2 with the related groups from step 1

if(nb > 2)
1. take first element, and add it to every possible
combination of ning-1 elements of x[-1]
2. to define the other groups belonging to the first groups obtained like this,
apply the algorithm on the other elements of x, but for nb-1 groups
3. combine all possible other groups from step 2
with the related first groups from step 1

将其转换为 R 给我们:
perm.groups <- function(x,n){
nx <- length(x)
ning <- nx/n

group1 <-
rbind(
matrix(rep(x[1],choose(nx-1,ning-1)),nrow=1),
combn(x[-1],ning-1)
)
ng <- ncol(group1)

if(n > 2){
out <- vector('list',ng)

for(i in seq_len(ng)){
other <- perm.groups(setdiff(x,group1[,i]),n=n-1)
out[[i]] <- lapply(seq_along(other),
function(j) cbind(group1[,i],other[[j]])
)
}
out <- unlist(out,recursive=FALSE)
} else {
other <- lapply(seq_len(ng),function(i)
matrix(setdiff(x,group1[,i]),ncol=1)
)
out <- lapply(seq_len(ng),
function(i) cbind(group1[,i],other[[i]])
)
}
out
}

为了表明它有效:
> perm.groups(1:6,3)
[[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

关于r - 找到所有可能的方法将元素列表分成给定数量的相同大小的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14753987/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com