Подтвердить что ты не робот

Создать список всех возможных комбинаций элементов вектора

Я пытаюсь создать все возможные комбинации 0 и 1 в векторе длины 14. Есть ли простой способ получить этот вывод как список векторов или, что еще лучше, dataframe?

Чтобы лучше показать, что я ищу, допустим, что мне нужен только вектор длины 3. Я хотел бы иметь возможность генерировать следующее:

 (1,1,1), (0,0,0), (1,1,0), (1,0,0), (1,0,1), (0,1,0), (0,1,1), (0,0,0)

Любая помощь будет оценена!

Спасибо,

4b9b3361

Ответ 1

Вы ищете expand.grid.

expand.grid(0:1, 0:1, 0:1)

Или, для длинного случая:

n <- 14
l <- rep(list(0:1), n)

expand.grid(l)

Ответ 2

В качестве альтернативы подходу @Justin вы также можете использовать CJ из пакета data.table. Здесь я также использовал replicate для создания моего списка из 14 нулей и единиц.

library(data.table)
do.call(CJ, replicate(14, 0:1, FALSE))
#        V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14
#     1:  0  0  0  0  0  0  0  0  0   0   0   0   0   0
#     2:  0  0  0  0  0  0  0  0  0   0   0   0   0   1
#     3:  0  0  0  0  0  0  0  0  0   0   0   0   1   0
#     4:  0  0  0  0  0  0  0  0  0   0   0   0   1   1
#     5:  0  0  0  0  0  0  0  0  0   0   0   1   0   0
#    ---                                               
# 16380:  1  1  1  1  1  1  1  1  1   1   1   0   1   1
# 16381:  1  1  1  1  1  1  1  1  1   1   1   1   0   0
# 16382:  1  1  1  1  1  1  1  1  1   1   1   1   0   1
# 16383:  1  1  1  1  1  1  1  1  1   1   1   1   1   0
# 16384:  1  1  1  1  1  1  1  1  1   1   1   1   1   1

Ответ 3

Есть 16384 возможных перестановок. Вы можете использовать пакет iterpc для получения результата итеративно.

library(iterpc)
I = iterpc(2, 14, label=c(0,1), order=T, replace=T)
getnext(I)
# [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0
getnext(I)
# [1] 0 0 0 0 0 0 0 0 0 0 0 0 0 1
getnext(I)
# [1] 0 0 0 0 0 0 0 0 0 0 0 0 1 0

Если вы хотите получить все результаты, вы можете использовать getall(I).

Ответ 4

Поскольку вы имеете дело с 0 и 1, кажется естественным думать о целых числах в терминах бит. Используя функцию, которая была слегка изменена из этого post (MyIntToBit ниже), наряду с вашим выбором функций apply, мы можем получить желаемый результат.

MyIntToBit <- function(x, dig) {
    i <- 0L
    string <- numeric(dig)
    while (x > 0) {
        string[dig - i] <- x %% 2L
        x <- x %/% 2L
        i <- i + 1L
    }
    string
}

Если вам нужен список, используйте lapply так:

lapply(0:(2^14 - 1), function(x) MyIntToBit(x,14))

Если вы предпочитаете матрицу, sapply выполнит трюк:

sapply(0:(2^14 - 1), function(x) MyIntToBit(x,14))

Ниже приведены примеры выходов:

> lapply(0:(2^3 - 1), function(x) MyIntToBit(x,3))
[[1]]
[1] 0 0 0

[[2]]
[1] 0 0 1

[[3]]
[1] 0 1 0

[[4]]
[1] 0 1 1

[[5]]
[1] 1 0 0

[[6]]
[1] 1 0 1

[[7]]
[1] 1 1 0

[[8]]
[1] 1 1 1


> sapply(0:(2^3 - 1), function(x) MyIntToBit(x,3))
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
[1,]    0    0    0    0    1    1    1    1
[2,]    0    0    1    1    0    0    1    1
[3,]    0    1    0    1    0    1    0    1