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")
您可以使用
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