перечисление всех подмножеств вектора для заданного размера

Функция choose(n,k) сообщает нам, сколько подмножеств размера k существует для набора из n различных элементов. Предположим, мне нужно на самом деле перечислить эти подмножества, как мне их создать? другими словами, я ищу функцию, которая принимает вектор x (длиной n) и число k и возвращает список векторов, каждый из которых имеет размер k, с подмножествами x. длина списка должна быть, конечно, choose(length(x),k). Например

enum.choose = function(x,k) {
    # implementation should go here
{

enum.choose(1:3,2)

# should be:
# [[1]]
#    1  2
# [[2]]
#    1  3
# [[3]]
#    2  3

person amit    schedule 10.05.2014    source источник
comment
combn(1:3, 2). Проверьте ? combn документацию.   -  person Ramnath    schedule 11.05.2014
comment
почему бы не сделать это ответом?   -  person flodel    schedule 11.05.2014
comment
@Рамнат Спасибо. это именно то, что я искал.   -  person amit    schedule 11.05.2014


Ответы (1)


ИЗМЕНИТЬ


Я понял, что combn(1:3, 2, simplify = FALSE) дает вам результат списка, который вы ищете. Если @Ramnath захочет опубликовать ответ, он будет удален.

> combn(1:3, 2, simplify = FALSE)
## [[1]]
## [1] 1 2

## [[2]]
## [1] 1 3

## [[3]]
## [1] 2 3

Таким образом, использование функции *apply сделает следующую функцию неактуальной.


Исходный


Используя комментарий от @Ramnath, ваша функция может выглядеть примерно так:

enum.choose <- function(x, k) {
  if(k > length(x)) stop('k > length(x)')
  if(choose(length(x), k)==1){
    list(as.vector(combn(x, k)))
  } else {
    cbn <- combn(x, k)
    lapply(seq(ncol(cbn)), function(i) cbn[,i])
  }
}

Тестовые прогоны:

> enum.choose(1:3, 2)
# [[1]]
# [1] 1 2
# 
# [[2]]
# [1] 1 3
# 
# [[3]]
# [1] 2 3
> enum.choose(c(1, 2, 5, 4), 3)
# [[1]]
# [1] 1 2 5
# 
# [[2]]
# [1] 1 2 4
# 
# [[3]]
# [1] 1 5 4
# 
# [[4]]
# [1] 2 5 4
> enum.choose(1:4, 4)
# [[1]]
# [1] 1 2 3 4
> enum.choose(1:5, 6)
# Error in enum.choose(1:5, 6) : k > length(x)
person Rich Scriven    schedule 10.05.2014