R 如何创建子集的组合,以使最终集没有重复的元素

R 如何创建子集的组合,以使最终集没有重复的元素,r,vectorization,combinations,combn,R,Vectorization,Combinations,Combn,我试图创建列表的子集,覆盖所有可能的组合,条件是最终输出与初始列表长度相同,并且没有重复元素 名单如下: X <- c("A","B","C","D") 我要寻找的是Y的组合,使得组合中的元素是X的不同值 X = c("A","B","C","D") 一些可接受的组合为: (('A',), ('B',), ('C', 'D')) (('A',), ('C',), ('B', 'D')) (('A',), ('D',), ('B', 'C')) (('B',), ('C',),

我试图创建列表的子集,覆盖所有可能的组合,条件是最终输出与初始列表长度相同,并且没有重复元素

名单如下:

X <- c("A","B","C","D")
我要寻找的是
Y
的组合,使得组合中的元素是
X
的不同值

X = c("A","B","C","D")
一些可接受的组合为:

 (('A',), ('B',), ('C', 'D'))
 (('A',), ('C',), ('B', 'D'))
 (('A',), ('D',), ('B', 'C'))
 (('B',), ('C',), ('A', 'D'))
 (('B',), ('D',), ('A', 'C'))
 (('C',), ('D',), ('A', 'B'))
我尝试估计所有可能的
Y
组合,然后得到每个组合的不同值的长度

如果
length(组合的不同元素)=length(X)
则保留组合。但无论如何,这都不是一种最佳方法,也不包括重复的场景

另外,在我的真实场景中,
X
中有多达40个不同的元素

X = c("A","B","C","D")
  • 使用combn()
  • 使用expand.grid()

  • 您可以使用
    partitions::listParts()
    partitions::setparts()
    as,例如。但是,一组40个项目的分区数量绝对是天文数字(有些数字像40!或可能更大),因此您无法将它们全部列举出来。@JoshO'Brien谢谢Josh,我最终使用了它,但是是的,数据集确实变得巨大,我的机器在大于10的数据集时陷入困境。@M-M我正在尝试一种方法来减少我的数据集,或者分割它,这样我可以分别获得所有的组合,并对它们进行交叉组合,这可能会减少负载。如果我找到更有效的方法,我会更新
    comb = c()
    for(n in 1:length(X)){
      comb = c(comb, apply(combn(X, n), MARGIN = 2, FUN = "paste", collapse = ""))
    }
    comb
     [1] "A"    "B"    "C"    "D"    "AB"   "AC"   "AD"   "BC"   "BD"   "CD"   "ABC"  "ABD"  "ACD" 
    [14] "BCD"  "ABCD"
    
    expand.grid(X, X)
       Var1 Var2
    1     A    A
    2     B    A
    3     C    A
    4     D    A
    5     A    B
    6     B    B
    7     C    B
    8     D    B
    9     A    C
    10    B    C
    11    C    C
    12    D    C
    13    A    D
    14    B    D
    15    C    D
    16    D    D