【问题标题】:How to create combinations of subsets, such that the final set does not have repeating elements [duplicate]如何创建子集的组合,以使最终集合没有重复元素[重复]
【发布时间】:2019-05-11 23:21:12
【问题描述】:

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

对于列表:

X <- c("A","B","C","D")

所有非空子集都是(我们称之为Y):

[('A'), ('B'), ('C'), ('D'), ('A', 'B'), ('A', 'C'), ('A', 'D'), ('B', 'C'),
('B', 'D'), ('C', 'D'), ('A', 'B', 'C'), ('A', 'B', 'D'), ('A', 'C', 'D'), 
('B', 'C', 'D'), ('A', 'B', 'C', 'D')]

我正在寻找的是Y 的组合,这样组合中的元素是X 的不同值。

一些可接受的组合是:

 (('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(distinct elements of combination) = length(X),那么我会保留这个组合。但这无论如何都不是最佳方法,也不涵盖重复的场景。

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

【问题讨论】:

  • 您可以使用partitions::listParts()partitions::setparts(),例如here。但是,一组 40 个项目的分区数量绝对是天文数字(有些数字像 40!或可能更多),因此您无法将它们全部枚举出来。
  • @JoshO'Brien 谢谢 Josh,我确实最终使用了它,但是是的,数据集确实变得很大,而且我的机器在超过 10 组时陷入困境。
  • @M-M 我正在​​尝试一种方法来减少我的数据集,或者拆分它以便我可以单独获取所有组合并对其进行交叉组合,这可能会减少负载。如果我找到更有效的方法,我会更新

标签: r vectorization combinations combn


【解决方案1】:
X = c("A","B","C","D")
  1. 使用combn()
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"
  1. 使用 expand.grid()
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 2022-10-15
    • 2014-02-16
    • 1970-01-01
    • 2015-05-19
    相关资源
    最近更新 更多