【发布时间】: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