这是我会做的事情,例如,使用
s=1:2
:
1)为每个元素的成员身份表示子集的0/1矩阵。
subsets = as.matrix(do.call(expand.grid,replicate(length(s),0:1,simplify=FALSE)))
这提供了
Var1 Var2
[1,] 0 0
[2,] 1 0
[3,] 0 1
[4,] 1 1
这里,第一行是空子集;第二行是{1};第三行是{2};第四行是{1,2}。要获取子集本身,请使用 mysubset = s[subsets[row,]]
,其中row
是你想要的子集所在的行。
2) 将子集对表示为矩阵的行对:
pairs <- expand.grid(Row1=1:nrow(subsets),Row2=1:nrow(subsets))
这提供了
Row1 Row2
1 1 1
2 2 1
3 3 1
4 4 1
5 1 2
6 2 2
7 3 2
8 4 2
9 1 3
10 2 3
11 3 3
12 4 3
13 1 4
14 2 4
15 3 4
16 4 4
这里,第14行对应于
subsets
的第二行和第四行,因此是{1}和{1,2}。这假定了对组合的顺序有所考虑(在进行笛卡尔积时隐含了这一点)。要恢复子集,请使用
mypairosubsets=lapply(pairs[p,],function(r) s[subsets[r,]])
,其中
p
是您想要的配对的行数。
将其扩展到
P(s)^n
的情况(其中
P(s)
是集合
s
的幂集)会像这样:
setsosets = as.matrix(do.call(expand.grid,replicate(n,1:nrow(subsets),simplify=FALSE)))
这里,每一行都有一个数字向量。每个数字对应于 subsets
矩阵中的一行。
复制 s
元素可能对你之后的操作并不必要。但是,你可以在这里使用 lapply(1:nrow(pairs),function(p)lapply(pairs[p,],function(r) s[subsets[r,]]))
进行复制,它的第一部分类似于...
[[1]]
[[1]]$Row1
integer(0)
[[1]]$Row2
integer(0)
[[2]]
[[2]]$Row1
[1] 1
[[2]]$Row2
integer(0)
expand.grid
是获取笛卡尔积的一种方法。顺便说一下,它似乎忽略了空子集。 - Frank