Это то, что я хотел бы сделать, с, например, 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
Здесь, четырнадцатый строка соответствует второй и четвертой строк 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
Пример вывода также имеет '({1}, {1})', но отсутствует '({2}, {2})'. –