3

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

对于列表:

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.

4

1 回答 1

0
X = c("A","B","C","D")
  1. 使用组合()
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
于 2019-05-12T07:10:21.947 回答