所有N个所有子集的组合

mer*_*erv 6 r combinatorics

给定一个元素向量,我想获得一个n元素子集的所有可能长度组合的列表.例如,给定(最简单的)序列1:2,我想获得表单的列表对象

{ {{1},{1}}, {{1},{2}}, {{2},{2}}, {{1},{1,2}}, {{2},{1,2}}, {{1,2},{1,2}} }
Run Code Online (Sandbox Code Playgroud)

n=2.

我能够使用以下内容生成所有非空子集的列表:

listOfAllSubsets <- function (s) {
  n <- length(s)
  unlist(lapply(1:n, function (n) {
    combn(s, n, simplify=FALSE)
  }), recursive=FALSE)
}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定从这里开始的最佳方式.基本上,我想要一个这个列表的笛卡尔积(自己n=2).

有什么建议?非迭代解决方案将是优选的(即,没有for循环).

Fra*_*ank 2

这就是我要做的,例如s=1:2

1) 用 0/1 矩阵表示每个元素的隶属关系的子集。

subsets = as.matrix(do.call(expand.grid,replicate(length(s),0:1,simplify=FALSE)))
Run Code Online (Sandbox Code Playgroud)

这使

     Var1 Var2
[1,]    0    0
[2,]    1    0
[3,]    0    1
[4,]    1    1
Run Code Online (Sandbox Code Playgroud)

这里,第一行是空子集;第二个,{1};第三个,{2};第四个,{1,2}。要获取子集本身,请使用mysubset = s[subsets[row,]],其中row是所需子集的行。

2) 将子集对表示为矩阵的行对:

pairs <- expand.grid(Row1=1:nrow(subsets),Row2=1:nrow(subsets))
Run Code Online (Sandbox Code Playgroud)

这使

   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
Run Code Online (Sandbox Code Playgroud)

这里,第十四行对应于 的第二行和第四行subsets,因此 {1} & {1,2}。这假设该对的顺序很重要(这隐含在采用笛卡尔积中)。要恢复子集,请使用mypairosubsets=lapply(pairs[p,],function(r) s[subsets[r,]])wherep是所需的对的行。

扩展到对之外的情况P(s)^n(其中P(s)是 的幂集s)看起来像

setsosets = as.matrix(do.call(expand.grid,replicate(n,1:nrow(subsets),simplify=FALSE)))
Run Code Online (Sandbox Code Playgroud)

在这里,每一行都有一个数字向量。每个数字对应于矩阵中的一行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)
Run Code Online (Sandbox Code Playgroud)